From a76915cca2019f1c23a2307ec5dcf36c665d73b1 Mon Sep 17 00:00:00 2001 From: Jayant Jain Date: Mon, 25 Dec 2017 19:39:27 +0530 Subject: [PATCH 01/14] Add wordnet mammal train file for Poincare notebook (#1781) * Adds wordnet mammal train file * Adds link to data file in notebook --- docs/notebooks/Poincare Evaluation.ipynb | 3 + .../data/wordnet_mammal_hypernyms.tsv | 7724 +++++++++++++++++ 2 files changed, 7727 insertions(+) create mode 100644 docs/notebooks/poincare/data/wordnet_mammal_hypernyms.tsv diff --git a/docs/notebooks/Poincare Evaluation.ipynb b/docs/notebooks/Poincare Evaluation.ipynb index 72ccf4e01d..cffd7c8491 100644 --- a/docs/notebooks/Poincare Evaluation.ipynb +++ b/docs/notebooks/Poincare Evaluation.ipynb @@ -289,6 +289,9 @@ "outputs": [], "source": [ "# Prepare the WordNet data\n", + "# Can also be downloaded directly from -\n", + "# https://github.com/jayantj/gensim/raw/wordnet_data/docs/notebooks/poincare/data/wordnet_noun_hypernyms.tsv\n", + "\n", "wordnet_file = os.path.join(data_directory, 'wordnet_noun_hypernyms.tsv')\n", "if not os.path.exists(wordnet_file):\n", " ! python {parent_directory}/{cpp_repo_name}/scripts/create_wordnet_noun_hierarchy.py {wordnet_file}" diff --git a/docs/notebooks/poincare/data/wordnet_mammal_hypernyms.tsv b/docs/notebooks/poincare/data/wordnet_mammal_hypernyms.tsv new file mode 100644 index 0000000000..1cc2ffb55b --- /dev/null +++ b/docs/notebooks/poincare/data/wordnet_mammal_hypernyms.tsv @@ -0,0 +1,7724 @@ +kangaroo.n.01 marsupial.n.01 +domestic_goat.n.01 even-toed_ungulate.n.01 +rock_squirrel.n.01 ground_squirrel.n.02 +vizsla.n.01 dog.n.01 +dandie_dinmont.n.01 mammal.n.01 +broodmare.n.01 horse.n.01 +spotted_skunk.n.01 spotted_skunk.n.01 +hispid_pocket_mouse.n.01 hispid_pocket_mouse.n.01 +lesser_kudu.n.01 placental.n.01 +water_shrew.n.01 insectivore.n.01 +silky_anteater.n.01 placental.n.01 +giant_kangaroo.n.01 metatherian.n.01 +bronco.n.01 bronco.n.01 +pekinese.n.01 pekinese.n.01 +seattle_slew.n.01 thoroughbred.n.02 +kinkajou.n.01 kinkajou.n.01 +boxer.n.04 mammal.n.01 +rabbit.n.01 placental.n.01 +longhorn.n.01 bovid.n.01 +blue_fox.n.01 fox.n.01 +woolly_monkey.n.01 new_world_monkey.n.01 +jungle_cat.n.01 jungle_cat.n.01 +vole.n.01 mammal.n.01 +western_big-eared_bat.n.01 long-eared_bat.n.01 +leopard.n.02 leopard.n.02 +hackney.n.02 hackney.n.02 +shetland_sheepdog.n.01 placental.n.01 +coati.n.01 carnivore.n.01 +wild_boar.n.01 mammal.n.01 +post_horse.n.01 placental.n.01 +porker.n.01 porker.n.01 +mouflon.n.01 mouflon.n.01 +australian_sea_lion.n.01 seal.n.09 +coondog.n.01 placental.n.01 +schipperke.n.01 mammal.n.01 +black_rat.n.01 rodent.n.01 +waterbuck.n.01 placental.n.01 +hack.n.06 odd-toed_ungulate.n.01 +central_chimpanzee.n.01 anthropoid_ape.n.01 +harrier.n.02 harrier.n.02 +lesser_panda.n.01 mammal.n.01 +wether.n.01 ruminant.n.01 +collie.n.01 shepherd_dog.n.01 +prancer.n.01 horse.n.01 +doberman.n.01 placental.n.01 +pygmy_marmoset.n.01 monkey.n.01 +phalanger.n.01 metatherian.n.01 +black-and-tan_coonhound.n.01 black-and-tan_coonhound.n.01 +woolly_monkey.n.01 primate.n.02 +ferret_badger.n.01 badger.n.02 +cave_myotis.n.01 placental.n.01 +desmodus_rotundus.n.01 vampire_bat.n.01 +malinois.n.01 shepherd_dog.n.01 +mexican_pocket_mouse.n.01 placental.n.01 +hackney.n.02 odd-toed_ungulate.n.01 +american_flying_squirrel.n.01 mammal.n.01 +syrian_bear.n.01 brown_bear.n.01 +dugong.n.01 sea_cow.n.01 +central_chimpanzee.n.01 mammal.n.01 +collared_pika.n.01 pika.n.01 +grey.n.07 odd-toed_ungulate.n.01 +domestic_llama.n.01 domestic_llama.n.01 +proboscidean.n.01 proboscidean.n.01 +gib.n.02 tom.n.02 +eurasian_otter.n.01 placental.n.01 +tree_squirrel.n.01 rodent.n.01 +flat-coated_retriever.n.01 flat-coated_retriever.n.01 +plantigrade_mammal.n.01 mammal.n.01 +cotswold.n.01 bovid.n.01 +welsh_pony.n.01 equine.n.01 +american_foxhound.n.01 carnivore.n.01 +addax.n.01 bovid.n.01 +aberdeen_angus.n.01 ruminant.n.01 +clydesdale.n.01 ungulate.n.01 +angora.n.02 goat.n.01 +taguan.n.01 taguan.n.01 +prototherian.n.01 mammal.n.01 +grade.n.09 cattle.n.01 +yearling.n.02 racehorse.n.01 +nyala.n.02 antelope.n.01 +springer.n.02 even-toed_ungulate.n.01 +seizure-alert_dog.n.01 seizure-alert_dog.n.01 +gib.n.02 cat.n.01 +longhorn.n.01 even-toed_ungulate.n.01 +striped_skunk.n.01 mammal.n.01 +coonhound.n.01 hunting_dog.n.01 +cur.n.01 canine.n.02 +exmoor.n.02 pony.n.05 +vicuna.n.03 vicuna.n.03 +white-tailed_jackrabbit.n.01 mammal.n.01 +kitty.n.04 feline.n.01 +pinscher.n.01 pinscher.n.01 +afghan_hound.n.01 afghan_hound.n.01 +fur_seal.n.01 fur_seal.n.01 +bull_mastiff.n.01 bull_mastiff.n.01 +hazel_mouse.n.01 dormouse.n.01 +ocelot.n.01 feline.n.01 +marco_polo_sheep.n.01 marco_polo_sheep.n.01 +baleen_whale.n.01 whale.n.02 +australian_sea_lion.n.01 australian_sea_lion.n.01 +porcupine.n.01 mammal.n.01 +whitetail_prairie_dog.n.01 whitetail_prairie_dog.n.01 +lesser_kudu.n.01 kudu.n.01 +rudapithecus.n.01 hominid.n.01 +boxer.n.04 carnivore.n.01 +blacktail_jackrabbit.n.01 lagomorph.n.01 +drill.n.02 baboon.n.01 +bluetick.n.01 dog.n.01 +vaquita.n.01 mammal.n.01 +tiger_cat.n.01 wildcat.n.03 +wheel_horse.n.01 equine.n.01 +flying_mouse.n.01 flying_mouse.n.01 +clydesdale.n.01 horse.n.01 +hound.n.01 dog.n.01 +bighorn.n.02 ruminant.n.01 +chinchilla.n.03 mammal.n.01 +raccoon_dog.n.01 placental.n.01 +palfrey.n.01 mammal.n.01 +rorqual.n.01 baleen_whale.n.01 +sassaby.n.01 even-toed_ungulate.n.01 +sloth_bear.n.01 carnivore.n.01 +rogue_elephant.n.01 proboscidean.n.01 +white_elephant.n.02 proboscidean.n.01 +virginia_deer.n.01 placental.n.01 +count_fleet.n.01 count_fleet.n.01 +lakeland_terrier.n.01 carnivore.n.01 +billy.n.02 ruminant.n.01 +omaha.n.04 equine.n.01 +soft-coated_wheaten_terrier.n.01 terrier.n.01 +bedlington_terrier.n.01 hunting_dog.n.01 +wisent.n.01 ungulate.n.01 +sable_antelope.n.01 even-toed_ungulate.n.01 +staffordshire_bullterrier.n.01 hunting_dog.n.01 +american_staffordshire_terrier.n.01 mammal.n.01 +belgian_hare.n.01 placental.n.01 +aquatic_mammal.n.01 mammal.n.01 +tibetan_terrier.n.01 mammal.n.01 +exmoor.n.01 even-toed_ungulate.n.01 +procyonid.n.01 placental.n.01 +canada_lynx.n.01 wildcat.n.03 +old_english_sheepdog.n.01 shepherd_dog.n.01 +raccoon.n.02 carnivore.n.01 +leafnose_bat.n.01 bat.n.01 +pygmy_sperm_whale.n.01 cetacean.n.01 +african_hunting_dog.n.01 carnivore.n.01 +spearnose_bat.n.01 placental.n.01 +pooch.n.01 pooch.n.01 +percheron.n.01 horse.n.01 +blenheim_spaniel.n.01 placental.n.01 +afghan_hound.n.01 mammal.n.01 +cur.n.01 cur.n.01 +persian_cat.n.01 mammal.n.01 +dun.n.01 horse.n.01 +nail-tailed_wallaby.n.01 mammal.n.01 +rock_squirrel.n.01 rock_squirrel.n.01 +tabby.n.01 tabby.n.01 +three-year-old_horse.n.01 horse.n.01 +broadtail.n.02 broadtail.n.02 +springbok.n.01 springbok.n.01 +sporting_dog.n.01 placental.n.01 +new_world_tapir.n.01 mammal.n.01 +muskrat.n.02 placental.n.01 +banteng.n.01 ungulate.n.01 +yak.n.02 even-toed_ungulate.n.01 +hog.n.03 hog.n.03 +basenji.n.01 basenji.n.01 +panther.n.02 leopard.n.02 +lesser_kudu.n.01 lesser_kudu.n.01 +gibbon.n.02 ape.n.01 +tamarisk_gerbil.n.01 mammal.n.01 +wheel_horse.n.01 ungulate.n.01 +beagle.n.01 carnivore.n.01 +small_civet.n.01 mammal.n.01 +hind.n.02 even-toed_ungulate.n.01 +blue_point_siamese.n.01 feline.n.01 +babirusa.n.01 swine.n.01 +wire-haired_fox_terrier.n.01 carnivore.n.01 +wood_rabbit.n.01 rabbit.n.01 +pacific_walrus.n.01 walrus.n.01 +long-tailed_porcupine.n.01 rodent.n.01 +hyrax.n.01 mammal.n.01 +airedale.n.01 carnivore.n.01 +silky_tamarin.n.01 monkey.n.01 +gomphothere.n.01 mammal.n.01 +nanny.n.02 mammal.n.01 +urial.n.01 bovid.n.01 +bullock.n.02 placental.n.01 +lapdog.n.01 placental.n.01 +german_short-haired_pointer.n.01 sporting_dog.n.01 +northern_flying_squirrel.n.01 northern_flying_squirrel.n.01 +eastern_chipmunk.n.01 placental.n.01 +warhorse.n.03 saddle_horse.n.01 +urial.n.01 ruminant.n.01 +domestic_llama.n.01 llama.n.01 +javanthropus.n.01 hominid.n.01 +northern_flying_squirrel.n.01 squirrel.n.01 +harness_horse.n.01 ungulate.n.01 +toy_manchester.n.01 mammal.n.01 +homo_habilis.n.01 hominid.n.01 +chimpanzee.n.01 mammal.n.01 +egyptian_cat.n.01 domestic_cat.n.01 +standard_poodle.n.01 carnivore.n.01 +sambar.n.01 ungulate.n.01 +silky_tamarin.n.01 mammal.n.01 +potoroo.n.01 marsupial.n.01 +chow.n.03 dog.n.01 +lincoln.n.03 ungulate.n.01 +black_squirrel.n.01 mammal.n.01 +hound.n.01 mammal.n.01 +common_raccoon.n.01 raccoon.n.02 +wild_sheep.n.01 even-toed_ungulate.n.01 +goat_antelope.n.01 bovid.n.01 +pygmy_chimpanzee.n.01 primate.n.02 +eared_seal.n.01 mammal.n.01 +lesser_rorqual.n.01 rorqual.n.01 +woodland_caribou.n.01 even-toed_ungulate.n.01 +common_shrew.n.01 common_shrew.n.01 +gemsbok.n.01 mammal.n.01 +tabby.n.02 domestic_cat.n.01 +marmoset.n.01 placental.n.01 +blenheim_spaniel.n.01 english_toy_spaniel.n.01 +fawn.n.02 mammal.n.01 +sassaby.n.01 bovid.n.01 +pacer.n.02 placental.n.01 +sassaby.n.01 sassaby.n.01 +deer_mouse.n.01 deer_mouse.n.01 +beef.n.01 ungulate.n.01 +baboon.n.01 monkey.n.01 +cotswold.n.01 ruminant.n.01 +ox.n.02 ox.n.02 +shire.n.02 odd-toed_ungulate.n.01 +american_saddle_horse.n.01 american_saddle_horse.n.01 +bassarisk.n.01 carnivore.n.01 +coach_horse.n.01 ungulate.n.01 +lesser_rorqual.n.01 whale.n.02 +greater_pichiciego.n.01 armadillo.n.01 +tabby.n.02 mammal.n.01 +water_rat.n.03 placental.n.01 +guereza.n.01 monkey.n.01 +collared_pika.n.01 placental.n.01 +vampire_bat.n.01 carnivorous_bat.n.01 +thomson's_gazelle.n.01 thomson's_gazelle.n.01 +stablemate.n.01 ungulate.n.01 +leveret.n.01 lagomorph.n.01 +eurasian_hamster.n.01 rodent.n.01 +steed.n.01 placental.n.01 +muskrat.n.02 rodent.n.01 +harpy.n.03 fruit_bat.n.01 +vicuna.n.03 ungulate.n.01 +tabby.n.02 carnivore.n.01 +irish_wolfhound.n.01 placental.n.01 +domestic_llama.n.01 even-toed_ungulate.n.01 +seattle_slew.n.01 equine.n.01 +talapoin.n.01 mammal.n.01 +stallion.n.01 odd-toed_ungulate.n.01 +ermine.n.02 musteline_mammal.n.01 +leporid.n.01 leporid.n.01 +african_elephant.n.01 african_elephant.n.01 +wood_rat.n.01 rodent.n.01 +schipperke.n.01 placental.n.01 +megatherian.n.01 megatherian.n.01 +kangaroo_mouse.n.01 kangaroo_mouse.n.01 +dairy_cattle.n.01 ruminant.n.01 +boston_bull.n.01 carnivore.n.01 +harbor_porpoise.n.01 cetacean.n.01 +cat.n.01 placental.n.01 +pichiciago.n.01 armadillo.n.01 +domestic_ass.n.01 mammal.n.01 +homo_soloensis.n.01 placental.n.01 +harpy.n.03 placental.n.01 +kuvasz.n.01 watchdog.n.02 +gibbon.n.02 anthropoid_ape.n.01 +black-footed_ferret.n.01 placental.n.01 +german_shepherd.n.01 carnivore.n.01 +cavalry_horse.n.01 ungulate.n.01 +mylodontid.n.01 mylodontid.n.01 +nanny.n.02 placental.n.01 +wild_ass.n.01 wild_ass.n.01 +big_cat.n.01 mammal.n.01 +thomson's_gazelle.n.01 placental.n.01 +clumber.n.01 spaniel.n.01 +ant_bear.n.01 mammal.n.01 +tamarin.n.01 tamarin.n.01 +rat.n.01 rodent.n.01 +sinanthropus.n.01 primate.n.02 +charolais.n.01 cattle.n.01 +citation.n.06 thoroughbred.n.02 +liver-spotted_dalmatian.n.01 placental.n.01 +lapdog.n.01 lapdog.n.01 +tapir.n.01 odd-toed_ungulate.n.01 +dun.n.01 odd-toed_ungulate.n.01 +flying_phalanger.n.01 phalanger.n.01 +atlantic_walrus.n.01 walrus.n.01 +gelding.n.01 mammal.n.01 +alaskan_brown_bear.n.01 placental.n.01 +jackass_bat.n.01 placental.n.01 +bull.n.01 bovid.n.01 +jaguar.n.01 mammal.n.01 +long-tailed_porcupine.n.01 mammal.n.01 +angora.n.02 ungulate.n.01 +desmodus_rotundus.n.01 desmodus_rotundus.n.01 +affirmed.n.01 equine.n.01 +false_vampire.n.01 false_vampire.n.01 +stud.n.04 male_horse.n.01 +seattle_slew.n.01 ungulate.n.01 +bird_dog.n.01 bird_dog.n.01 +cattalo.n.01 even-toed_ungulate.n.01 +two-year-old_horse.n.01 odd-toed_ungulate.n.01 +ewe.n.03 placental.n.01 +standard_schnauzer.n.01 mammal.n.01 +ox.n.02 even-toed_ungulate.n.01 +lemur.n.01 lemur.n.01 +zinjanthropus.n.01 placental.n.01 +genet.n.03 carnivore.n.01 +gordon_setter.n.01 canine.n.02 +groundhog.n.01 rodent.n.01 +doberman.n.01 carnivore.n.01 +earless_seal.n.01 seal.n.09 +killer_whale.n.01 toothed_whale.n.01 +jerboa_rat.n.01 rat.n.01 +beagle.n.01 mammal.n.01 +plains_pocket_mouse.n.01 mammal.n.01 +curly-coated_retriever.n.01 retriever.n.01 +broadtail.n.02 bovid.n.01 +flying_phalanger.n.01 metatherian.n.01 +fanaloka.n.01 viverrine.n.01 +muishond.n.01 muishond.n.01 +corgi.n.01 corgi.n.01 +grevy's_zebra.n.01 zebra.n.01 +homo_sapiens_sapiens.n.01 homo_sapiens.n.01 +english_setter.n.01 sporting_dog.n.01 +wombat.n.01 mammal.n.01 +whirlaway.n.01 placental.n.01 +heifer.n.01 mammal.n.01 +bedlington_terrier.n.01 bedlington_terrier.n.01 +uakari.n.01 new_world_monkey.n.01 +hognose_bat.n.01 carnivorous_bat.n.01 +northern_pocket_gopher.n.01 gopher.n.04 +crabeater_seal.n.01 placental.n.01 +northern_flying_squirrel.n.01 rodent.n.01 +kiang.n.01 odd-toed_ungulate.n.01 +sennenhunde.n.01 placental.n.01 +pony.n.02 pony.n.02 +chimpanzee.n.01 placental.n.01 +tatouay.n.01 placental.n.01 +white-footed_mouse.n.01 rodent.n.01 +false_vampire.n.01 mammal.n.01 +gnu.n.01 gnu.n.01 +tiglon.n.01 feline.n.01 +golden_hamster.n.01 rodent.n.01 +appaloosa.n.01 placental.n.01 +guereza.n.01 guereza.n.01 +pricket.n.02 pricket.n.02 +neandertal_man.n.01 mammal.n.01 +babirusa.n.01 mammal.n.01 +angora.n.03 rabbit.n.01 +cave_myotis.n.01 bat.n.01 +english_setter.n.01 hunting_dog.n.01 +ass.n.03 ass.n.03 +basset.n.01 dog.n.01 +marten.n.01 carnivore.n.01 +big_cat.n.01 carnivore.n.01 +rorqual.n.01 cetacean.n.01 +carnivore.n.01 carnivore.n.01 +golden_mole.n.01 mammal.n.01 +common_dolphin.n.01 whale.n.02 +sivapithecus.n.01 mammal.n.01 +friesian.n.01 bovine.n.01 +water_buffalo.n.01 ruminant.n.01 +black_rat.n.01 placental.n.01 +short-tailed_shrew.n.01 mammal.n.01 +serval.n.01 carnivore.n.01 +war_admiral.n.01 placental.n.01 +dachshund.n.01 dog.n.01 +pomeranian.n.01 spitz.n.01 +gaur.n.01 ungulate.n.01 +cynopterus_sphinx.n.01 cynopterus_sphinx.n.01 +cotton_mouse.n.01 mouse.n.01 +steller_sea_lion.n.01 placental.n.01 +brocket.n.02 brocket.n.02 +shrew.n.02 shrew.n.02 +tapir.n.01 ungulate.n.01 +bucking_bronco.n.01 ungulate.n.01 +rock_wallaby.n.01 marsupial.n.01 +new_world_tapir.n.01 placental.n.01 +carthorse.n.01 equine.n.01 +watchdog.n.02 watchdog.n.02 +tamarau.n.01 placental.n.01 +buckskin.n.01 placental.n.01 +brahman.n.04 bovine.n.01 +bonnet_macaque.n.01 placental.n.01 +anthropoid.n.02 anthropoid.n.02 +entlebucher.n.01 sennenhunde.n.01 +earless_seal.n.01 pinniped_mammal.n.01 +newfoundland.n.01 canine.n.02 +angora.n.02 mammal.n.01 +durham.n.02 beef.n.01 +white-footed_mouse.n.01 wood_mouse.n.01 +assault.n.03 assault.n.03 +aardvark.n.01 aardvark.n.01 +fanaloka.n.01 fanaloka.n.01 +giant_schnauzer.n.01 giant_schnauzer.n.01 +carthorse.n.01 horse.n.01 +common_wallaby.n.01 mammal.n.01 +mantled_ground_squirrel.n.01 ground_squirrel.n.02 +nanny.n.02 nanny.n.02 +bullterrier.n.01 hunting_dog.n.01 +homo.n.02 homo.n.02 +greater_pichiciego.n.01 greater_pichiciego.n.01 +gorilla.n.01 great_ape.n.01 +jackrabbit.n.01 placental.n.01 +roe_deer.n.01 even-toed_ungulate.n.01 +imperial_mammoth.n.01 elephant.n.01 +rabbit-eared_bandicoot.n.01 metatherian.n.01 +chickeree.n.01 rodent.n.01 +flickertail.n.01 flickertail.n.01 +reynard.n.01 mammal.n.01 +clydesdale_terrier.n.01 carnivore.n.01 +bear_cub.n.01 bear.n.01 +stoat.n.01 musteline_mammal.n.01 +gnu.n.01 bovid.n.01 +rhodesian_man.n.01 mammal.n.01 +cotswold.n.01 ungulate.n.01 +ram.n.05 sheep.n.01 +lapdog.n.01 canine.n.02 +santa_gertrudis.n.01 ruminant.n.01 +mountain_sheep.n.01 even-toed_ungulate.n.01 +eastern_chimpanzee.n.01 chimpanzee.n.01 +pouched_mouse.n.01 pouched_mouse.n.01 +pacific_bottlenose_dolphin.n.01 placental.n.01 +wild_sheep.n.01 wild_sheep.n.01 +domestic_cat.n.01 carnivore.n.01 +attack_dog.n.01 placental.n.01 +ungulata.n.01 placental.n.01 +deer.n.01 ungulate.n.01 +standard_poodle.n.01 mammal.n.01 +domestic_sheep.n.01 bovid.n.01 +black_rat.n.01 rat.n.01 +welsh.n.03 ruminant.n.01 +solo_man.n.01 placental.n.01 +great_dane.n.01 mammal.n.01 +pithecanthropus.n.01 placental.n.01 +lhasa.n.02 carnivore.n.01 +italian_greyhound.n.01 carnivore.n.01 +domestic_sheep.n.01 placental.n.01 +bull.n.11 mammal.n.01 +exmoor.n.02 ungulate.n.01 +jersey.n.05 ungulate.n.01 +kiang.n.01 mammal.n.01 +polo_pony.n.01 mammal.n.01 +yearling.n.02 horse.n.01 +hare.n.01 leporid.n.01 +central_chimpanzee.n.01 primate.n.02 +doberman.n.01 working_dog.n.01 +trotting_horse.n.01 odd-toed_ungulate.n.01 +wirehair.n.01 placental.n.01 +lionet.n.01 placental.n.01 +zebu.n.01 bovid.n.01 +glutton.n.02 mammal.n.01 +stud.n.04 equine.n.01 +muskrat.n.02 muskrat.n.02 +thomson's_gazelle.n.01 ruminant.n.01 +irish_water_spaniel.n.01 hunting_dog.n.01 +sealyham_terrier.n.01 wirehair.n.01 +musk_kangaroo.n.01 kangaroo.n.01 +monkey.n.01 primate.n.02 +three-year-old_horse.n.01 three-year-old_horse.n.01 +water_chevrotain.n.01 water_chevrotain.n.01 +baronduki.n.01 placental.n.01 +guinea_pig.n.02 rodent.n.01 +english_springer.n.01 english_springer.n.01 +viscacha.n.01 viscacha.n.01 +ass.n.03 ungulate.n.01 +harnessed_antelope.n.01 ruminant.n.01 +chesapeake_bay_retriever.n.01 chesapeake_bay_retriever.n.01 +bovine.n.01 bovine.n.01 +numbat.n.01 dasyurid_marsupial.n.01 +large_poodle.n.01 carnivore.n.01 +roan.n.02 equine.n.01 +vole.n.01 wood_rat.n.01 +great_ape.n.01 mammal.n.01 +entellus.n.01 old_world_monkey.n.01 +primate.n.02 mammal.n.01 +squirrel_monkey.n.01 new_world_monkey.n.01 +two-year-old_horse.n.01 mammal.n.01 +wild_goat.n.01 goat.n.01 +anoa.n.01 bovid.n.01 +hunting_dog.n.01 mammal.n.01 +native_cat.n.01 mammal.n.01 +feline.n.01 mammal.n.01 +bandicoot.n.01 mammal.n.01 +mare.n.01 mammal.n.01 +homo_sapiens.n.01 primate.n.02 +river_dolphin.n.01 toothed_whale.n.01 +wharf_rat.n.02 rodent.n.01 +cardigan.n.02 dog.n.01 +saki.n.03 primate.n.02 +zoril.n.01 mammal.n.01 +springer.n.02 ungulate.n.01 +dark_horse.n.02 equine.n.01 +shepherd_dog.n.01 canine.n.02 +bull.n.11 placental.n.01 +world.n.08 mammal.n.01 +giant_schnauzer.n.01 schnauzer.n.01 +irish_terrier.n.01 mammal.n.01 +black-footed_ferret.n.01 musteline_mammal.n.01 +keeshond.n.01 canine.n.02 +aardwolf.n.01 carnivore.n.01 +pembroke.n.01 dog.n.01 +foxhound.n.01 canine.n.02 +red_fox.n.03 carnivore.n.01 +hooded_skunk.n.01 mammal.n.01 +harbor_porpoise.n.01 harbor_porpoise.n.01 +woolly_indris.n.01 placental.n.01 +pouched_mouse.n.01 metatherian.n.01 +miniature_poodle.n.01 placental.n.01 +pocket_rat.n.01 rodent.n.01 +japanese_deer.n.01 deer.n.01 +gibbon.n.02 lesser_ape.n.01 +slender_loris.n.01 primate.n.02 +cow.n.02 placental.n.01 +irish_wolfhound.n.01 hound.n.01 +merino.n.01 bovid.n.01 +bullock.n.01 ruminant.n.01 +desmodus_rotundus.n.01 mammal.n.01 +black-and-tan_coonhound.n.01 hunting_dog.n.01 +american_staffordshire_terrier.n.01 bullterrier.n.01 +cavy.n.01 cavy.n.01 +fur_seal.n.02 fur_seal.n.02 +jird.n.01 jird.n.01 +clydesdale_terrier.n.01 dog.n.01 +protohippus.n.01 mammal.n.01 +greater_swiss_mountain_dog.n.01 working_dog.n.01 +capuchin.n.02 capuchin.n.02 +chigetai.n.01 ass.n.03 +southern_flying_squirrel.n.01 placental.n.01 +mangabey.n.01 old_world_monkey.n.01 +carthorse.n.01 ungulate.n.01 +lesser_rorqual.n.01 cetacean.n.01 +newfoundland.n.01 carnivore.n.01 +gaur.n.01 mammal.n.01 +pacific_bottlenose_dolphin.n.01 aquatic_mammal.n.01 +sled_dog.n.01 carnivore.n.01 +spouter.n.03 cetacean.n.01 +tennessee_walker.n.01 equine.n.01 +pangolin.n.01 placental.n.01 +old_world_porcupine.n.01 placental.n.01 +sewer_rat.n.01 brown_rat.n.01 +swamp_rabbit.n.02 wood_rabbit.n.01 +cheviot.n.01 ungulate.n.01 +english_toy_spaniel.n.01 carnivore.n.01 +collared_peccary.n.01 even-toed_ungulate.n.01 +mountain_goat.n.01 goat_antelope.n.01 +golden_retriever.n.01 golden_retriever.n.01 +rabbit.n.01 rabbit.n.01 +yorkshire_terrier.n.01 mammal.n.01 +gomphothere.n.01 pachyderm.n.01 +fisher.n.02 mammal.n.01 +wharf_rat.n.02 rat.n.01 +tenrec.n.01 tenrec.n.01 +jumping_mouse.n.01 jumping_mouse.n.01 +cinnamon_bear.n.01 american_black_bear.n.01 +liver_chestnut.n.01 odd-toed_ungulate.n.01 +howler_monkey.n.01 placental.n.01 +panther.n.02 feline.n.01 +sow.n.01 ungulate.n.01 +bird_dog.n.01 sporting_dog.n.01 +pooch.n.01 canine.n.02 +manchester_terrier.n.01 dog.n.01 +king_charles_spaniel.n.01 king_charles_spaniel.n.01 +mouser.n.01 carnivore.n.01 +mountain_goat.n.01 bovid.n.01 +american_shrew_mole.n.01 mammal.n.01 +count_fleet.n.01 thoroughbred.n.02 +white-tailed_jackrabbit.n.01 white-tailed_jackrabbit.n.01 +kuvasz.n.01 working_dog.n.01 +peba.n.01 armadillo.n.01 +blue_fox.n.01 placental.n.01 +asiatic_shrew_mole.n.01 insectivore.n.01 +hudson_bay_collared_lemming.n.01 placental.n.01 +bunny.n.02 leporid.n.01 +tennessee_walker.n.01 horse.n.01 +rat_terrier.n.01 hunting_dog.n.01 +langur.n.01 placental.n.01 +european_wood_mouse.n.01 mouse.n.01 +nude_mouse.n.01 nude_mouse.n.01 +mole.n.06 mole.n.06 +affirmed.n.01 affirmed.n.01 +numbat.n.01 marsupial.n.01 +mule.n.01 mule.n.01 +whale.n.02 aquatic_mammal.n.01 +tennessee_walker.n.01 saddle_horse.n.01 +wharf_rat.n.02 brown_rat.n.01 +barren_ground_caribou.n.01 barren_ground_caribou.n.01 +galago.n.01 galago.n.01 +stud.n.04 stud.n.04 +atlantic_walrus.n.01 atlantic_walrus.n.01 +american_black_bear.n.01 placental.n.01 +collie.n.01 collie.n.01 +paca.n.01 mammal.n.01 +wolfhound.n.01 carnivore.n.01 +mountain_nyala.n.01 mammal.n.01 +bezoar_goat.n.01 goat.n.01 +american_shrew_mole.n.01 mole.n.06 +muntjac.n.01 mammal.n.01 +two-year-old_horse.n.01 racehorse.n.01 +goat_antelope.n.01 ruminant.n.01 +packrat.n.02 packrat.n.02 +skye_terrier.n.01 terrier.n.01 +douroucouli.n.01 monkey.n.01 +prairie_dog.n.01 placental.n.01 +lucy.n.01 hominid.n.01 +hack.n.07 horse.n.01 +deer.n.01 mammal.n.01 +friesian.n.01 even-toed_ungulate.n.01 +seeing_eye_dog.n.01 carnivore.n.01 +santa_gertrudis.n.01 beef.n.01 +javanthropus.n.01 javanthropus.n.01 +ruminant.n.01 ruminant.n.01 +crabeater_seal.n.01 pinniped_mammal.n.01 +grivet.n.01 mammal.n.01 +potoroo.n.01 kangaroo.n.01 +rhodesian_ridgeback.n.01 canine.n.02 +manatee.n.01 aquatic_mammal.n.01 +pinniped_mammal.n.01 placental.n.01 +kuvasz.n.01 dog.n.01 +yak.n.02 ungulate.n.01 +farm_horse.n.01 odd-toed_ungulate.n.01 +thoroughbred.n.02 placental.n.01 +english_springer.n.01 placental.n.01 +talapoin.n.01 talapoin.n.01 +quagga.n.01 equine.n.01 +bouvier_des_flandres.n.01 placental.n.01 +poodle.n.01 mammal.n.01 +stepper.n.03 odd-toed_ungulate.n.01 +welsh.n.03 cattle.n.01 +rottweiler.n.01 shepherd_dog.n.01 +tarsius_syrichta.n.01 primate.n.02 +bluetick.n.01 carnivore.n.01 +affenpinscher.n.01 placental.n.01 +tailless_tenrec.n.01 placental.n.01 +pooch.n.01 dog.n.01 +manchester_terrier.n.01 canine.n.02 +malinois.n.01 mammal.n.01 +omaha.n.04 omaha.n.04 +gib.n.02 mammal.n.01 +eastern_dasyure.n.01 dasyure.n.01 +lemur.n.01 primate.n.02 +muishond.n.01 placental.n.01 +sheep.n.01 ruminant.n.01 +elk.n.01 placental.n.01 +seattle_slew.n.01 odd-toed_ungulate.n.01 +boarhound.n.01 mammal.n.01 +woolly_rhinoceros.n.01 placental.n.01 +rambouillet.n.01 domestic_sheep.n.01 +bowhead.n.01 bowhead.n.01 +grasshopper_mouse.n.01 placental.n.01 +leafnose_bat.n.01 carnivorous_bat.n.01 +american_foxhound.n.01 dog.n.01 +homo.n.02 mammal.n.01 +dall_sheep.n.01 bovid.n.01 +mountain_goat.n.01 even-toed_ungulate.n.01 +tamarisk_gerbil.n.01 gerbil.n.01 +charolais.n.01 ungulate.n.01 +prairie_vole.n.01 rodent.n.01 +finback.n.01 finback.n.01 +polar_hare.n.01 polar_hare.n.01 +douroucouli.n.01 placental.n.01 +ground_squirrel.n.02 rodent.n.01 +hairy-legged_vampire_bat.n.01 mammal.n.01 +greater_pichiciego.n.01 mammal.n.01 +white-lipped_peccary.n.01 peccary.n.01 +dwarf_sperm_whale.n.01 whale.n.02 +stablemate.n.01 horse.n.01 +mule_deer.n.01 deer.n.01 +sausage_dog.n.01 sausage_dog.n.01 +female_mammal.n.01 female_mammal.n.01 +digitigrade_mammal.n.01 mammal.n.01 +wild_sheep.n.01 ungulate.n.01 +woolly_monkey.n.01 placental.n.01 +peccary.n.01 ungulate.n.01 +siamang.n.01 ape.n.01 +wild_ass.n.01 ass.n.03 +antelope.n.01 mammal.n.01 +kanchil.n.01 chevrotain.n.01 +giant_eland.n.01 even-toed_ungulate.n.01 +timber_wolf.n.01 carnivore.n.01 +european_hare.n.01 leporid.n.01 +guernsey.n.02 bovid.n.01 +warrigal.n.01 equine.n.01 +seal.n.09 seal.n.09 +european_rabbit.n.01 lagomorph.n.01 +tom.n.02 cat.n.01 +pug.n.01 dog.n.01 +white_wolf.n.01 canine.n.02 +grade.n.09 mammal.n.01 +grey.n.07 ungulate.n.01 +new_world_mouse.n.01 placental.n.01 +crabeater_seal.n.01 crabeater_seal.n.01 +beaked_whale.n.01 beaked_whale.n.01 +seattle_slew.n.01 mammal.n.01 +zebra.n.01 mammal.n.01 +leonberg.n.01 canine.n.02 +harnessed_antelope.n.01 harnessed_antelope.n.01 +broadtail.n.02 ruminant.n.01 +rock_squirrel.n.01 squirrel.n.01 +wolfhound.n.01 hunting_dog.n.01 +pinche.n.01 new_world_monkey.n.01 +big_brown_bat.n.01 bat.n.01 +american_foxhound.n.01 placental.n.01 +miniature_poodle.n.01 poodle.n.01 +carnivorous_bat.n.01 carnivorous_bat.n.01 +mexican_hairless.n.01 canine.n.02 +american_marten.n.01 musteline_mammal.n.01 +asian_wild_ox.n.01 placental.n.01 +steller's_sea_cow.n.01 aquatic_mammal.n.01 +percheron.n.01 placental.n.01 +old_world_buffalo.n.01 ungulate.n.01 +ord_kangaroo_rat.n.01 kangaroo_rat.n.01 +cotton_mouse.n.01 mammal.n.01 +lynx.n.02 wildcat.n.03 +alley_cat.n.01 feline.n.01 +serow.n.01 even-toed_ungulate.n.01 +curly-coated_retriever.n.01 mammal.n.01 +grison.n.01 grison.n.01 +flying_mouse.n.01 flying_phalanger.n.01 +tamarau.n.01 tamarau.n.01 +sennenhunde.n.01 working_dog.n.01 +common_eland.n.01 placental.n.01 +phyllostomus_hastatus.n.01 mammal.n.01 +grizzly.n.01 mammal.n.01 +common_eland.n.01 eland.n.01 +silky_pocket_mouse.n.01 rat.n.01 +racehorse.n.01 equine.n.01 +elephant_seal.n.01 mammal.n.01 +starnose_mole.n.01 mole.n.06 +gazella_subgutturosa.n.01 placental.n.01 +kerry_blue_terrier.n.01 terrier.n.01 +vespertilian_bat.n.01 vespertilian_bat.n.01 +colobus.n.01 placental.n.01 +male_horse.n.01 placental.n.01 +cow.n.02 cow.n.02 +sea_otter.n.01 musteline_mammal.n.01 +vampire_bat.n.01 placental.n.01 +whirlaway.n.01 racehorse.n.01 +wood_rabbit.n.01 wood_rabbit.n.01 +porcupine.n.01 porcupine.n.01 +bonnet_macaque.n.01 primate.n.02 +pygmy_marmoset.n.01 new_world_monkey.n.01 +bullterrier.n.01 bullterrier.n.01 +flying_fox.n.01 placental.n.01 +black-and-tan_coonhound.n.01 dog.n.01 +ocelot.n.01 placental.n.01 +black-tailed_deer.n.01 mule_deer.n.01 +river_dolphin.n.01 river_dolphin.n.01 +mouse-eared_bat.n.01 mammal.n.01 +chestnut.n.06 placental.n.01 +burro.n.01 domestic_ass.n.01 +kid.n.05 bovid.n.01 +harnessed_antelope.n.01 even-toed_ungulate.n.01 +japanese_deer.n.01 ungulate.n.01 +hereford.n.01 ungulate.n.01 +snow_leopard.n.01 carnivore.n.01 +sheep.n.01 ungulate.n.01 +antelope.n.01 ungulate.n.01 +indri.n.01 lemur.n.01 +dun.n.01 ungulate.n.01 +eared_seal.n.01 aquatic_mammal.n.01 +cocker_spaniel.n.01 carnivore.n.01 +percheron.n.01 ungulate.n.01 +egyptian_cat.n.01 feline.n.01 +pouched_mouse.n.01 mammal.n.01 +kob.n.01 ungulate.n.01 +wombat.n.01 marsupial.n.01 +brocket.n.02 deer.n.01 +european_lemming.n.01 rodent.n.01 +kinkajou.n.01 placental.n.01 +toothed_whale.n.01 mammal.n.01 +carabao.n.01 placental.n.01 +harbor_seal.n.01 mammal.n.01 +shetland_pony.n.01 equine.n.01 +malinois.n.01 canine.n.02 +hereford.n.01 beef.n.01 +water_spaniel.n.01 sporting_dog.n.01 +tapir.n.01 mammal.n.01 +american_staffordshire_terrier.n.01 hunting_dog.n.01 +common_raccoon.n.01 mammal.n.01 +panther.n.02 big_cat.n.01 +grey_whale.n.01 grey_whale.n.01 +papillon.n.01 toy_dog.n.01 +bird_dog.n.01 dog.n.01 +blenheim_spaniel.n.01 mammal.n.01 +wheel_horse.n.01 draft_horse.n.01 +racehorse.n.01 ungulate.n.01 +eastern_grey_squirrel.n.01 mammal.n.01 +arabian.n.02 ungulate.n.01 +pinscher.n.01 watchdog.n.02 +northern_bog_lemming.n.01 lemming.n.01 +snow_leopard.n.01 placental.n.01 +egyptian_cat.n.01 mammal.n.01 +angora.n.03 leporid.n.01 +bezoar_goat.n.01 ungulate.n.01 +vampire_bat.n.01 mammal.n.01 +lesser_panda.n.01 procyonid.n.01 +eland.n.01 bovid.n.01 +soft-coated_wheaten_terrier.n.01 placental.n.01 +lucy.n.01 mammal.n.01 +zebra.n.01 equine.n.01 +american_shrew_mole.n.01 placental.n.01 +weimaraner.n.01 placental.n.01 +civet.n.01 mammal.n.01 +saiga.n.01 mammal.n.01 +rhodesian_man.n.01 primate.n.02 +coach_horse.n.01 mammal.n.01 +jennet.n.01 ungulate.n.01 +peba.n.01 edentate.n.01 +pilot_whale.n.01 dolphin.n.02 +grey_fox.n.01 grey_fox.n.01 +grampus.n.02 placental.n.01 +beaked_whale.n.01 toothed_whale.n.01 +english_toy_spaniel.n.01 toy_dog.n.01 +devon.n.02 devon.n.02 +walker_hound.n.01 walker_hound.n.01 +woolly_rhinoceros.n.01 ungulate.n.01 +warrigal.n.01 mammal.n.01 +gelding.n.01 horse.n.01 +shrew_mole.n.01 shrew_mole.n.01 +chimpanzee.n.01 chimpanzee.n.01 +chihuahua.n.03 chihuahua.n.03 +redbone.n.01 canine.n.02 +rock_squirrel.n.01 rodent.n.01 +coach_horse.n.01 draft_horse.n.01 +alley_cat.n.01 placental.n.01 +sloth_bear.n.01 bear.n.01 +borzoi.n.01 canine.n.02 +mapinguari.n.01 mammal.n.01 +common_shrew.n.01 placental.n.01 +fur_seal.n.02 pinniped_mammal.n.01 +binturong.n.01 mammal.n.01 +scottish_deerhound.n.01 carnivore.n.01 +muishond.n.01 musteline_mammal.n.01 +common_dolphin.n.01 common_dolphin.n.01 +anthropoid_ape.n.01 ape.n.01 +miniature_poodle.n.01 carnivore.n.01 +cattalo.n.01 cattle.n.01 +marco_polo_sheep.n.01 ruminant.n.01 +greyhound.n.01 mammal.n.01 +field_spaniel.n.01 hunting_dog.n.01 +griffon.n.03 canine.n.02 +forest_goat.n.01 mammal.n.01 +shepherd_dog.n.01 shepherd_dog.n.01 +santa_gertrudis.n.01 santa_gertrudis.n.01 +pocket_mouse.n.01 placental.n.01 +kitty.n.04 carnivore.n.01 +hart.n.03 placental.n.01 +water_rat.n.03 mammal.n.01 +pere_david's_deer.n.01 placental.n.01 +big_cat.n.01 feline.n.01 +binturong.n.01 carnivore.n.01 +algeripithecus_minutus.n.01 algeripithecus_minutus.n.01 +swine.n.01 ungulate.n.01 +red_bat.n.01 red_bat.n.01 +billy.n.02 bovid.n.01 +vixen.n.02 carnivore.n.01 +eurasian_otter.n.01 musteline_mammal.n.01 +viverrine.n.01 viverrine.n.01 +malamute.n.01 sled_dog.n.01 +western_grey_squirrel.n.01 squirrel.n.01 +ewe.n.03 even-toed_ungulate.n.01 +elephant.n.01 pachyderm.n.01 +santa_gertrudis.n.01 mammal.n.01 +striped_muishond.n.01 muishond.n.01 +mare.n.01 odd-toed_ungulate.n.01 +flat-coated_retriever.n.01 retriever.n.01 +grizzly.n.01 brown_bear.n.01 +gallant_fox.n.01 thoroughbred.n.02 +margay.n.01 wildcat.n.03 +papillon.n.01 canine.n.02 +wood_rat.n.01 placental.n.01 +saber-toothed_tiger.n.01 carnivore.n.01 +welsh_pony.n.01 mammal.n.01 +groenendael.n.01 groenendael.n.01 +clydesdale_terrier.n.01 hunting_dog.n.01 +wirehair.n.01 hunting_dog.n.01 +deer_mouse.n.01 mouse.n.01 +silver_fox.n.01 silver_fox.n.01 +white-tailed_jackrabbit.n.01 jackrabbit.n.01 +ferret_badger.n.01 placental.n.01 +airedale.n.01 terrier.n.01 +sivapithecus.n.01 hominid.n.01 +jack.n.12 ungulate.n.01 +native_cat.n.01 native_cat.n.01 +bengal_tiger.n.01 placental.n.01 +mandrill.n.01 primate.n.02 +asiatic_black_bear.n.01 mammal.n.01 +bedlington_terrier.n.01 dog.n.01 +black_squirrel.n.01 tree_squirrel.n.01 +staffordshire_bullterrier.n.01 dog.n.01 +trotting_horse.n.01 mammal.n.01 +hudson_bay_collared_lemming.n.01 pied_lemming.n.01 +german_shepherd.n.01 placental.n.01 +lioness.n.01 big_cat.n.01 +bloodhound.n.01 dog.n.01 +coondog.n.01 hound.n.01 +broodmare.n.01 ungulate.n.01 +newfoundland.n.01 dog.n.01 +water_buffalo.n.01 even-toed_ungulate.n.01 +deer_mouse.n.01 wood_mouse.n.01 +american_marten.n.01 mammal.n.01 +australopithecus_boisei.n.01 placental.n.01 +cattalo.n.01 cattalo.n.01 +mapinguari.n.01 mylodontid.n.01 +milking_shorthorn.n.01 ruminant.n.01 +jerboa.n.01 mammal.n.01 +bongo.n.02 mammal.n.01 +norfolk_terrier.n.01 terrier.n.01 +striped_muishond.n.01 musteline_mammal.n.01 +serotine.n.01 vespertilian_bat.n.01 +rock_hyrax.n.01 rock_hyrax.n.01 +kiang.n.01 wild_ass.n.01 +pacific_walrus.n.01 placental.n.01 +dugong.n.01 placental.n.01 +welsh_terrier.n.01 placental.n.01 +rat.n.01 rat.n.01 +west_highland_white_terrier.n.01 terrier.n.01 +water_dog.n.02 sporting_dog.n.01 +red_deer.n.01 red_deer.n.01 +hominid.n.01 primate.n.02 +takin.n.01 goat_antelope.n.01 +wildcat.n.03 carnivore.n.01 +rhodesian_ridgeback.n.01 placental.n.01 +blue_whale.n.01 baleen_whale.n.01 +hooded_seal.n.01 aquatic_mammal.n.01 +walrus.n.01 aquatic_mammal.n.01 +secretariat.n.02 racehorse.n.01 +taguan.n.01 placental.n.01 +cape_buffalo.n.01 bovid.n.01 +gnu.n.01 ruminant.n.01 +stone_marten.n.01 stone_marten.n.01 +cardigan.n.02 cardigan.n.02 +whippet.n.01 carnivore.n.01 +english_setter.n.01 carnivore.n.01 +kangaroo_rat.n.01 placental.n.01 +aoudad.n.01 placental.n.01 +yak.n.02 ox.n.02 +bottlenose_dolphin.n.01 aquatic_mammal.n.01 +lechwe.n.01 ungulate.n.01 +chow.n.03 mammal.n.01 +flickertail.n.01 placental.n.01 +burro.n.01 odd-toed_ungulate.n.01 +lion.n.01 carnivore.n.01 +hartebeest.n.01 mammal.n.01 +watchdog.n.02 dog.n.01 +finback.n.01 rorqual.n.01 +mexican_hairless.n.01 placental.n.01 +placental.n.01 mammal.n.01 +santa_gertrudis.n.01 placental.n.01 +pricket.n.02 ruminant.n.01 +staffordshire_bullterrier.n.01 mammal.n.01 +red_poll.n.01 bovid.n.01 +margay.n.01 feline.n.01 +eastern_cottontail.n.01 mammal.n.01 +colobus.n.01 mammal.n.01 +tabby.n.01 mammal.n.01 +european_wood_mouse.n.01 placental.n.01 +bull.n.01 placental.n.01 +ram.n.05 mammal.n.01 +rodent.n.01 mammal.n.01 +murine.n.01 placental.n.01 +welsh.n.03 placental.n.01 +margay.n.01 mammal.n.01 +sussex_spaniel.n.01 sussex_spaniel.n.01 +leopard_cat.n.01 placental.n.01 +citation.n.06 citation.n.06 +coydog.n.01 carnivore.n.01 +war_admiral.n.01 racehorse.n.01 +big-eared_bat.n.01 mammal.n.01 +java_man.n.01 mammal.n.01 +milking_shorthorn.n.01 mammal.n.01 +bezoar_goat.n.01 ruminant.n.01 +grade.n.09 bovine.n.01 +coydog.n.01 coyote.n.01 +great_dane.n.01 working_dog.n.01 +grey.n.07 saddle_horse.n.01 +asian_wild_ox.n.01 ox.n.02 +macaque.n.01 placental.n.01 +american_harvest_mouse.n.01 rodent.n.01 +toy_dog.n.01 mammal.n.01 +malinois.n.01 belgian_sheepdog.n.01 +grade.n.09 ruminant.n.01 +cocker_spaniel.n.01 dog.n.01 +digitigrade_mammal.n.01 digitigrade_mammal.n.01 +brown_rat.n.01 placental.n.01 +tamarisk_gerbil.n.01 tamarisk_gerbil.n.01 +mexican_pocket_mouse.n.01 mexican_pocket_mouse.n.01 +hog.n.03 mammal.n.01 +eohippus.n.01 mammal.n.01 +grey_fox.n.01 placental.n.01 +bovine.n.01 ruminant.n.01 +eland.n.01 placental.n.01 +walker_hound.n.01 hound.n.01 +ibex.n.01 ruminant.n.01 +beef.n.01 beef.n.01 +longwool.n.01 bovid.n.01 +nilgai.n.01 ruminant.n.01 +pygmy_chimpanzee.n.01 mammal.n.01 +quarter_horse.n.01 horse.n.01 +equine.n.01 equine.n.01 +africander.n.01 ungulate.n.01 +coati.n.01 coati.n.01 +solo_man.n.01 homo.n.02 +belgian_sheepdog.n.01 placental.n.01 +short-tailed_shrew.n.01 placental.n.01 +american_foxhound.n.01 canine.n.02 +japanese_deer.n.01 ruminant.n.01 +stalking-horse.n.04 horse.n.01 +tabby.n.01 domestic_cat.n.01 +wild_sheep.n.01 ruminant.n.01 +common_eland.n.01 antelope.n.01 +hereford.n.01 bovine.n.01 +apar.n.01 placental.n.01 +three-toed_sloth.n.01 placental.n.01 +kangaroo_rat.n.01 rat.n.01 +blue_point_siamese.n.01 carnivore.n.01 +mare.n.01 equine.n.01 +white_elephant.n.02 indian_elephant.n.01 +silky_pocket_mouse.n.01 rodent.n.01 +gayal.n.01 placental.n.01 +earless_seal.n.01 aquatic_mammal.n.01 +malayan_tapir.n.01 odd-toed_ungulate.n.01 +curly-coated_retriever.n.01 carnivore.n.01 +cairn.n.02 placental.n.01 +pacific_bottlenose_dolphin.n.01 cetacean.n.01 +chiacoan_peccary.n.01 placental.n.01 +guernsey.n.02 guernsey.n.02 +basset.n.01 hunting_dog.n.01 +beef.n.01 cattle.n.01 +rhinoceros.n.01 odd-toed_ungulate.n.01 +greater_pichiciego.n.01 edentate.n.01 +two-year-old_horse.n.01 equine.n.01 +cocker_spaniel.n.01 placental.n.01 +naked_mole_rat.n.01 mammal.n.01 +omaha.n.04 placental.n.01 +loir.n.01 mammal.n.01 +hack.n.08 placental.n.01 +mantled_ground_squirrel.n.01 squirrel.n.01 +clumber.n.01 mammal.n.01 +eskimo_dog.n.01 working_dog.n.01 +belgian_sheepdog.n.01 carnivore.n.01 +queen.n.09 queen.n.09 +south_american_sea_lion.n.01 placental.n.01 +lippizan.n.01 placental.n.01 +gelding.n.01 odd-toed_ungulate.n.01 +arabian.n.02 arabian.n.02 +insectivore.n.01 placental.n.01 +smiledon_californicus.n.01 placental.n.01 +water_buffalo.n.01 ungulate.n.01 +bluetick.n.01 canine.n.02 +norwegian_elkhound.n.01 hunting_dog.n.01 +stirk.n.01 placental.n.01 +mustang.n.01 ungulate.n.01 +red_fox.n.03 fox.n.01 +cayuse.n.01 cayuse.n.01 +courser.n.03 carnivore.n.01 +ermine.n.02 ermine.n.02 +hack.n.06 hack.n.06 +paranthropus.n.01 paranthropus.n.01 +hominoid.n.01 primate.n.02 +napu.n.01 even-toed_ungulate.n.01 +bushbuck.n.01 bushbuck.n.01 +northern_pocket_gopher.n.01 northern_pocket_gopher.n.01 +malayan_tapir.n.01 malayan_tapir.n.01 +guernsey.n.02 cattle.n.01 +atlantic_bottlenose_dolphin.n.01 whale.n.02 +liver_chestnut.n.01 liver_chestnut.n.01 +ayrshire.n.01 bovid.n.01 +border_collie.n.01 mammal.n.01 +blue_fox.n.01 mammal.n.01 +norwich_terrier.n.01 hunting_dog.n.01 +german_short-haired_pointer.n.01 mammal.n.01 +liger.n.01 carnivore.n.01 +irish_water_spaniel.n.01 water_spaniel.n.01 +american_harvest_mouse.n.01 new_world_mouse.n.01 +oryx.n.01 oryx.n.01 +devon.n.02 cattle.n.01 +hartebeest.n.01 even-toed_ungulate.n.01 +pine_vole.n.01 wood_rat.n.01 +wood_mouse.n.01 mouse.n.01 +whippet.n.01 greyhound.n.01 +arabian.n.02 mammal.n.01 +cairn.n.02 dog.n.01 +carabao.n.01 ruminant.n.01 +european_water_shrew.n.01 water_shrew.n.01 +two-toed_sloth.n.02 sloth.n.02 +langur.n.01 langur.n.01 +jack.n.12 equine.n.01 +fawn.n.02 even-toed_ungulate.n.01 +bison.n.01 placental.n.01 +gemsbok.n.01 even-toed_ungulate.n.01 +kudu.n.01 ruminant.n.01 +woodland_caribou.n.01 mammal.n.01 +burmese_cat.n.01 cat.n.01 +wolverine.n.03 placental.n.01 +gayal.n.01 mammal.n.01 +billy.n.02 even-toed_ungulate.n.01 +indri.n.01 primate.n.02 +warhorse.n.03 odd-toed_ungulate.n.01 +greater_swiss_mountain_dog.n.01 carnivore.n.01 +lemur.n.01 mammal.n.01 +stirk.n.01 bovid.n.01 +prairie_dog.n.01 mammal.n.01 +bunny.n.02 placental.n.01 +aye-aye.n.01 placental.n.01 +airedale.n.01 hunting_dog.n.01 +puku.n.01 even-toed_ungulate.n.01 +antelope.n.01 bovid.n.01 +slender_loris.n.01 mammal.n.01 +grivet.n.01 primate.n.02 +mastiff.n.01 mastiff.n.01 +farm_horse.n.01 horse.n.01 +starnose_mole.n.01 mammal.n.01 +big-eared_bat.n.01 leafnose_bat.n.01 +saddle_horse.n.01 horse.n.01 +lesser_rorqual.n.01 lesser_rorqual.n.01 +civet.n.01 civet.n.01 +common_opossum.n.01 common_opossum.n.01 +potto.n.02 potto.n.02 +typical_jerboa.n.01 typical_jerboa.n.01 +house_mouse.n.01 house_mouse.n.01 +tarsius_glis.n.01 tarsier.n.01 +hazel_mouse.n.01 rodent.n.01 +yorkshire_terrier.n.01 yorkshire_terrier.n.01 +pinscher.n.01 carnivore.n.01 +brocket.n.02 placental.n.01 +bull_mastiff.n.01 carnivore.n.01 +mountain_goat.n.01 ungulate.n.01 +slender-tailed_meerkat.n.01 viverrine.n.01 +cow_pony.n.01 odd-toed_ungulate.n.01 +golden_retriever.n.01 hunting_dog.n.01 +whirlaway.n.01 ungulate.n.01 +bison.n.01 bovid.n.01 +fox_squirrel.n.01 rodent.n.01 +bay.n.07 odd-toed_ungulate.n.01 +european_rabbit.n.01 placental.n.01 +cinnamon_bear.n.01 bear.n.01 +bull.n.01 ruminant.n.01 +south_american_sea_lion.n.01 aquatic_mammal.n.01 +madagascar_cat.n.01 primate.n.02 +australopithecus_afarensis.n.01 australopithecine.n.01 +marten.n.01 mammal.n.01 +false_vampire.n.01 placental.n.01 +livestock.n.01 placental.n.01 +boxer.n.04 canine.n.02 +field_spaniel.n.01 sporting_dog.n.01 +redbone.n.01 carnivore.n.01 +lerot.n.01 lerot.n.01 +java_man.n.01 java_man.n.01 +bedlington_terrier.n.01 carnivore.n.01 +pole_horse.n.01 ungulate.n.01 +curly-coated_retriever.n.01 hunting_dog.n.01 +banded_palm_civet.n.01 placental.n.01 +rodent.n.01 rodent.n.01 +exmoor.n.02 exmoor.n.02 +woodland_caribou.n.01 placental.n.01 +roan.n.02 horse.n.01 +american_red_squirrel.n.01 placental.n.01 +mara.n.02 mammal.n.01 +desmodus_rotundus.n.01 carnivorous_bat.n.01 +stepper.n.03 ungulate.n.01 +trotting_horse.n.01 equine.n.01 +uakari.n.01 primate.n.02 +pteropus_hypomelanus.n.01 mammal.n.01 +ewe.n.03 mammal.n.01 +meerkat.n.01 viverrine.n.01 +bernese_mountain_dog.n.01 working_dog.n.01 +seizure-alert_dog.n.01 dog.n.01 +przewalski's_horse.n.01 ungulate.n.01 +sea_lion.n.01 aquatic_mammal.n.01 +black_rhinoceros.n.01 black_rhinoceros.n.01 +tiger_cat.n.01 placental.n.01 +lechwe.n.01 antelope.n.01 +onager.n.02 equine.n.01 +griffon.n.03 griffon.n.03 +common_zebra.n.01 common_zebra.n.01 +ayrshire.n.01 mammal.n.01 +bucking_bronco.n.01 odd-toed_ungulate.n.01 +ewe.n.03 sheep.n.01 +keeshond.n.01 spitz.n.01 +hind.n.02 ungulate.n.01 +narwhal.n.01 narwhal.n.01 +cavalry_horse.n.01 placental.n.01 +harbor_porpoise.n.01 dolphin.n.02 +forest_goat.n.01 even-toed_ungulate.n.01 +banded_palm_civet.n.01 carnivore.n.01 +bunny.n.02 rabbit.n.01 +pouched_mole.n.01 metatherian.n.01 +grampus.n.02 whale.n.02 +anoa.n.01 placental.n.01 +madagascar_cat.n.01 mammal.n.01 +crab-eating_opossum.n.01 marsupial.n.01 +eskimo_dog.n.01 placental.n.01 +serval.n.01 wildcat.n.03 +pollard.n.02 mammal.n.01 +norfolk_terrier.n.01 dog.n.01 +sable_antelope.n.01 ruminant.n.01 +vaquita.n.01 porpoise.n.01 +quagga.n.01 quagga.n.01 +langur.n.01 monkey.n.01 +dark_horse.n.02 odd-toed_ungulate.n.01 +brush-tailed_phalanger.n.01 mammal.n.01 +arabian_camel.n.01 camel.n.01 +nyala.n.02 even-toed_ungulate.n.01 +white_wolf.n.01 mammal.n.01 +saiga.n.01 even-toed_ungulate.n.01 +sei_whale.n.01 baleen_whale.n.01 +jack.n.12 placental.n.01 +sassaby.n.01 ruminant.n.01 +field_mouse.n.02 placental.n.01 +mule_deer.n.01 mammal.n.01 +elk.n.01 ruminant.n.01 +packhorse.n.01 packhorse.n.01 +welsh_terrier.n.01 canine.n.02 +eastern_chimpanzee.n.01 anthropoid_ape.n.01 +bovid.n.01 mammal.n.01 +lapin.n.02 lagomorph.n.01 +palomino.n.01 horse.n.01 +prosimian.n.01 placental.n.01 +elephant.n.01 elephant.n.01 +short-tailed_shrew.n.01 short-tailed_shrew.n.01 +domestic_ass.n.01 equine.n.01 +mare.n.01 mare.n.01 +bongo.n.02 antelope.n.01 +eskimo_dog.n.01 eskimo_dog.n.01 +greater_kudu.n.01 mammal.n.01 +macrotus.n.01 carnivorous_bat.n.01 +odd-toed_ungulate.n.01 odd-toed_ungulate.n.01 +vizsla.n.01 placental.n.01 +lerot.n.01 placental.n.01 +harbor_seal.n.01 harbor_seal.n.01 +pole_horse.n.01 equine.n.01 +black-tailed_deer.n.01 even-toed_ungulate.n.01 +horseshoe_bat.n.02 leafnose_bat.n.01 +mastiff.n.01 mammal.n.01 +mouse-eared_bat.n.01 bat.n.01 +pademelon.n.01 marsupial.n.01 +indian_buffalo.n.01 mammal.n.01 +pygmy_chimpanzee.n.01 placental.n.01 +coydog.n.01 canine.n.02 +madagascar_cat.n.01 placental.n.01 +new_world_beaver.n.01 mammal.n.01 +charger.n.01 warhorse.n.03 +leveret.n.01 hare.n.01 +deer.n.01 ruminant.n.01 +european_hare.n.01 hare.n.01 +pacer.n.02 odd-toed_ungulate.n.01 +primate.n.02 primate.n.02 +jackass_bat.n.01 mammal.n.01 +zoril.n.01 muishond.n.01 +irish_setter.n.01 irish_setter.n.01 +hog-nosed_skunk.n.01 hog-nosed_skunk.n.01 +mouse-eared_bat.n.01 mouse-eared_bat.n.01 +broodmare.n.01 odd-toed_ungulate.n.01 +cow.n.01 even-toed_ungulate.n.01 +ox.n.01 ox.n.01 +coach_horse.n.01 workhorse.n.02 +common_wallaby.n.01 common_wallaby.n.01 +tree_wallaby.n.01 tree_wallaby.n.01 +wirehair.n.01 wirehair.n.01 +pygmy_mouse.n.01 wood_mouse.n.01 +sausage_dog.n.01 mammal.n.01 +jaguar.n.01 feline.n.01 +female_mammal.n.01 mammal.n.01 +harpy.n.03 mammal.n.01 +longhorn.n.01 ruminant.n.01 +bearded_seal.n.01 earless_seal.n.01 +friesian.n.01 friesian.n.01 +wild_ass.n.01 equine.n.01 +talapoin.n.01 guenon.n.01 +brood_bitch.n.01 canine.n.02 +stallion.n.01 placental.n.01 +masked_shrew.n.01 shrew.n.02 +homo_soloensis.n.01 homo_soloensis.n.01 +english_toy_spaniel.n.01 canine.n.02 +sir_barton.n.01 horse.n.01 +harbor_seal.n.01 earless_seal.n.01 +springer.n.02 bovid.n.01 +cheetah.n.01 carnivore.n.01 +australian_sea_lion.n.01 aquatic_mammal.n.01 +chihuahua.n.03 canine.n.02 +columbian_mammoth.n.01 elephant.n.01 +harness_horse.n.01 placental.n.01 +post_horse.n.01 horse.n.01 +hispid_pocket_mouse.n.01 placental.n.01 +giant_panda.n.01 giant_panda.n.01 +genet.n.03 genet.n.03 +american_bison.n.01 bison.n.01 +smiledon_californicus.n.01 carnivore.n.01 +musk_kangaroo.n.01 marsupial.n.01 +kerry_blue_terrier.n.01 carnivore.n.01 +red_bat.n.01 vespertilian_bat.n.01 +african_elephant.n.01 elephant.n.01 +musk_kangaroo.n.01 metatherian.n.01 +round-tailed_muskrat.n.01 placental.n.01 +indri.n.01 placental.n.01 +draft_horse.n.01 draft_horse.n.01 +sivapithecus.n.01 sivapithecus.n.01 +gerenuk.n.01 placental.n.01 +hereford.n.01 bovid.n.01 +dun.n.01 placental.n.01 +smooth-haired_fox_terrier.n.01 canine.n.02 +warhorse.n.03 horse.n.01 +new_world_monkey.n.01 mammal.n.01 +takin.n.01 ruminant.n.01 +tiglon.n.01 placental.n.01 +starnose_mole.n.01 placental.n.01 +wether.n.01 placental.n.01 +platypus.n.01 monotreme.n.01 +bearded_seal.n.01 aquatic_mammal.n.01 +angora.n.03 placental.n.01 +feist.n.01 dog.n.01 +jaculus_jaculus.n.01 jaculus_jaculus.n.01 +mangabey.n.01 primate.n.02 +charger.n.01 odd-toed_ungulate.n.01 +wolf.n.01 carnivore.n.01 +puku.n.01 placental.n.01 +cocker_spaniel.n.01 mammal.n.01 +coypu.n.01 rodent.n.01 +norfolk_terrier.n.01 placental.n.01 +tibetan_terrier.n.01 placental.n.01 +harbor_porpoise.n.01 porpoise.n.01 +house_mouse.n.01 placental.n.01 +prairie_vole.n.01 wood_rat.n.01 +nude_mouse.n.01 rodent.n.01 +hooded_skunk.n.01 carnivore.n.01 +baronduki.n.01 baronduki.n.01 +border_collie.n.01 border_collie.n.01 +saber-toothed_tiger.n.01 feline.n.01 +lincoln.n.03 domestic_sheep.n.01 +raccoon_dog.n.01 raccoon_dog.n.01 +remount.n.01 placental.n.01 +pole_horse.n.01 trotting_horse.n.01 +meerkat.n.01 meerkat.n.01 +longwool.n.01 domestic_sheep.n.01 +kit_fox.n.02 placental.n.01 +italian_greyhound.n.01 hound.n.01 +jaguarundi.n.01 carnivore.n.01 +american_mink.n.01 placental.n.01 +arctic_ground_squirrel.n.01 squirrel.n.01 +schnauzer.n.01 canine.n.02 +aberdeen_angus.n.01 even-toed_ungulate.n.01 +cheetah.n.01 cheetah.n.01 +secretariat.n.02 secretariat.n.02 +hack.n.08 hack.n.08 +indian_elephant.n.01 pachyderm.n.01 +count_fleet.n.01 equine.n.01 +weasel.n.02 musteline_mammal.n.01 +abrocome.n.01 rodent.n.01 +chihuahua.n.03 mammal.n.01 +jaculus_jaculus.n.01 rodent.n.01 +pteropus_capestratus.n.01 bat.n.01 +fissiped_mammal.n.01 mammal.n.01 +irish_setter.n.01 placental.n.01 +timber_wolf.n.01 wolf.n.01 +wheel_horse.n.01 mammal.n.01 +eurasian_badger.n.01 carnivore.n.01 +scottish_deerhound.n.01 mammal.n.01 +old_english_sheepdog.n.01 working_dog.n.01 +little_chief_hare.n.01 lagomorph.n.01 +queen.n.09 fossorial_mammal.n.01 +wether.n.01 even-toed_ungulate.n.01 +griffon.n.03 sporting_dog.n.01 +phenacomys.n.01 vole.n.01 +gee-gee.n.01 odd-toed_ungulate.n.01 +blacktail_prairie_dog.n.01 mammal.n.01 +cocker_spaniel.n.01 hunting_dog.n.01 +stoat.n.01 placental.n.01 +affirmed.n.01 racehorse.n.01 +gordon_setter.n.01 mammal.n.01 +blenheim_spaniel.n.01 blenheim_spaniel.n.01 +bronco.n.01 placental.n.01 +prairie_dog.n.01 prairie_dog.n.01 +eastern_cottontail.n.01 placental.n.01 +friesian.n.01 mammal.n.01 +ayrshire.n.01 ayrshire.n.01 +slender-tailed_meerkat.n.01 mammal.n.01 +hominid.n.01 mammal.n.01 +soft-coated_wheaten_terrier.n.01 canine.n.02 +bonnet_macaque.n.01 macaque.n.01 +ermine.n.02 placental.n.01 +little_brown_bat.n.01 mammal.n.01 +bloodhound.n.01 carnivore.n.01 +hog_badger.n.01 placental.n.01 +chigetai.n.01 onager.n.02 +milking_shorthorn.n.01 cattle.n.01 +pointer.n.04 canine.n.02 +sei_whale.n.01 mammal.n.01 +assault.n.03 racehorse.n.01 +large_civet.n.01 placental.n.01 +homo_soloensis.n.01 mammal.n.01 +old_world_buffalo.n.01 bovid.n.01 +roebuck.n.01 even-toed_ungulate.n.01 +siamang.n.01 placental.n.01 +borzoi.n.01 placental.n.01 +toy_manchester.n.01 placental.n.01 +entellus.n.01 placental.n.01 +large_poodle.n.01 large_poodle.n.01 +swamp_rabbit.n.02 rabbit.n.01 +kudu.n.01 ungulate.n.01 +bird_dog.n.01 mammal.n.01 +bandicoot_rat.n.01 rat.n.01 +courser.n.03 canine.n.02 +reynard.n.01 fox.n.01 +retriever.n.01 hunting_dog.n.01 +cotswold.n.01 mammal.n.01 +egyptian_cat.n.01 placental.n.01 +waterbuck.n.01 ungulate.n.01 +common_zebra.n.01 placental.n.01 +elk.n.01 ungulate.n.01 +kitty.n.04 placental.n.01 +imperial_mammoth.n.01 proboscidean.n.01 +civet.n.01 placental.n.01 +addax.n.01 addax.n.01 +american_shrew_mole.n.01 american_shrew_mole.n.01 +golden_retriever.n.01 sporting_dog.n.01 +doberman.n.01 pinscher.n.01 +common_lynx.n.01 cat.n.01 +ram.n.05 ruminant.n.01 +razorback.n.01 ungulate.n.01 +foxhound.n.01 dog.n.01 +baboon.n.01 placental.n.01 +great_ape.n.01 ape.n.01 +redbone.n.01 placental.n.01 +puppy.n.01 canine.n.02 +mandrill.n.01 baboon.n.01 +pricket.n.02 mammal.n.01 +gibbon.n.02 placental.n.01 +kelpie.n.02 canine.n.02 +manchester_terrier.n.01 rat_terrier.n.01 +pipistrelle.n.01 mammal.n.01 +brahman.n.04 bovid.n.01 +sable.n.05 sable.n.05 +pacer.n.01 equine.n.01 +eurasian_otter.n.01 mammal.n.01 +lagomorph.n.01 placental.n.01 +bullterrier.n.01 canine.n.02 +coonhound.n.01 placental.n.01 +lechwe.n.01 mammal.n.01 +brocket.n.01 ruminant.n.01 +foxhound.n.01 carnivore.n.01 +alaska_fur_seal.n.01 alaska_fur_seal.n.01 +eland.n.01 even-toed_ungulate.n.01 +grizzly.n.01 bear.n.01 +feline.n.01 placental.n.01 +hoary_marmot.n.01 marmot.n.01 +alpaca.n.03 even-toed_ungulate.n.01 +talapoin.n.01 primate.n.02 +sussex_spaniel.n.01 dog.n.01 +longwool.n.01 even-toed_ungulate.n.01 +white-footed_mouse.n.01 white-footed_mouse.n.01 +groenendael.n.01 belgian_sheepdog.n.01 +chickeree.n.01 squirrel.n.01 +soft-coated_wheaten_terrier.n.01 dog.n.01 +jennet.n.01 mammal.n.01 +lippizan.n.01 mammal.n.01 +jaguar.n.01 jaguar.n.01 +cattalo.n.01 ruminant.n.01 +large_poodle.n.01 canine.n.02 +serotine.n.01 carnivorous_bat.n.01 +mountain_nyala.n.01 antelope.n.01 +bullock.n.01 bull.n.01 +spotted_lynx.n.01 placental.n.01 +common_lynx.n.01 common_lynx.n.01 +hare.n.01 hare.n.01 +water_dog.n.02 water_dog.n.02 +arctic_ground_squirrel.n.01 rodent.n.01 +mountain_sheep.n.01 ungulate.n.01 +false_vampire.n.01 carnivorous_bat.n.01 +gordon_setter.n.01 setter.n.02 +staffordshire_bullterrier.n.01 terrier.n.01 +dusky-footed_woodrat.n.01 dusky-footed_woodrat.n.01 +flying_mouse.n.01 metatherian.n.01 +central_chimpanzee.n.01 central_chimpanzee.n.01 +hart.n.03 deer.n.01 +post_horse.n.01 post_horse.n.01 +marten.n.01 marten.n.01 +affirmed.n.01 horse.n.01 +stag.n.02 placental.n.01 +red_fox.n.03 red_fox.n.03 +black-tailed_deer.n.01 ruminant.n.01 +tennessee_walker.n.01 mammal.n.01 +dik-dik.n.01 even-toed_ungulate.n.01 +hippopotamus.n.01 even-toed_ungulate.n.01 +mountain_beaver.n.01 placental.n.01 +porker.n.01 swine.n.01 +yorkshire_terrier.n.01 hunting_dog.n.01 +argali.n.01 wild_sheep.n.01 +antelope.n.01 ruminant.n.01 +sow.n.01 placental.n.01 +sennenhunde.n.01 canine.n.02 +pacer.n.01 ungulate.n.01 +virginia_deer.n.01 virginia_deer.n.01 +cavalry_horse.n.01 cavalry_horse.n.01 +impala.n.01 impala.n.01 +rogue_elephant.n.01 pachyderm.n.01 +mastodon.n.01 mastodon.n.01 +homo_habilis.n.01 primate.n.02 +spaniel.n.01 carnivore.n.01 +dryopithecine.n.01 mammal.n.01 +wirehair.n.01 dog.n.01 +pole_horse.n.02 horse.n.01 +water_buffalo.n.01 placental.n.01 +pony.n.02 odd-toed_ungulate.n.01 +true_marmoset.n.01 marmoset.n.01 +beef.n.01 even-toed_ungulate.n.01 +serow.n.01 ruminant.n.01 +nyala.n.02 ruminant.n.01 +new_world_beaver.n.01 placental.n.01 +billy.n.02 ungulate.n.01 +cayuse.n.01 horse.n.01 +cotton_mouse.n.01 cotton_mouse.n.01 +saki.n.03 saki.n.03 +royal.n.02 royal.n.02 +dormouse.n.01 placental.n.01 +peba.n.01 mammal.n.01 +hooded_seal.n.01 pinniped_mammal.n.01 +charger.n.01 horse.n.01 +common_zebra.n.01 equine.n.01 +plains_pocket_gopher.n.01 mammal.n.01 +potoroo.n.01 rat_kangaroo.n.01 +banteng.n.01 ox.n.02 +plains_pocket_mouse.n.01 pocket_mouse.n.01 +rorqual.n.01 aquatic_mammal.n.01 +harbor_seal.n.01 aquatic_mammal.n.01 +ferret.n.02 musteline_mammal.n.01 +australopithecus_robustus.n.01 hominid.n.01 +river_dolphin.n.01 whale.n.02 +patas.n.01 monkey.n.01 +orange_bat.n.01 placental.n.01 +ox.n.02 bovid.n.01 +harvest_mouse.n.02 placental.n.01 +bonnet_macaque.n.01 mammal.n.01 +slender_loris.n.01 slender_loris.n.01 +dinoceras.n.01 dinoceras.n.01 +buckskin.n.01 mammal.n.01 +siberian_husky.n.01 sled_dog.n.01 +water_vole.n.01 wood_rat.n.01 +killer_whale.n.01 aquatic_mammal.n.01 +wolf_pup.n.01 carnivore.n.01 +lechwe.n.01 lechwe.n.01 +collie.n.01 carnivore.n.01 +briard.n.01 briard.n.01 +plow_horse.n.01 ungulate.n.01 +jersey.n.05 bovine.n.01 +pilot_whale.n.01 mammal.n.01 +exmoor.n.01 ruminant.n.01 +seeing_eye_dog.n.01 canine.n.02 +devon.n.02 even-toed_ungulate.n.01 +bay.n.07 horse.n.01 +crab-eating_opossum.n.01 crab-eating_opossum.n.01 +sussex_spaniel.n.01 carnivore.n.01 +ice_bear.n.01 ice_bear.n.01 +llama.n.01 ungulate.n.01 +silky_anteater.n.01 edentate.n.01 +siamese_cat.n.01 placental.n.01 +southeastern_pocket_gopher.n.01 rat.n.01 +kaffir_cat.n.01 cat.n.01 +saddle_horse.n.01 odd-toed_ungulate.n.01 +grey_lemming.n.01 lemming.n.01 +tree_squirrel.n.01 placental.n.01 +schnauzer.n.01 placental.n.01 +belgian_sheepdog.n.01 dog.n.01 +baboon.n.01 primate.n.02 +canada_lynx.n.01 canada_lynx.n.01 +roebuck.n.01 placental.n.01 +cob.n.02 equine.n.01 +harrier.n.02 canine.n.02 +entlebucher.n.01 carnivore.n.01 +bloodhound.n.01 bloodhound.n.01 +kit_fox.n.02 carnivore.n.01 +rambouillet.n.01 ruminant.n.01 +alpaca.n.03 alpaca.n.03 +wisent.n.01 mammal.n.01 +white_whale.n.01 aquatic_mammal.n.01 +sloth.n.02 edentate.n.01 +sussex_spaniel.n.01 placental.n.01 +american_water_spaniel.n.01 placental.n.01 +leopardess.n.01 leopard.n.02 +tailless_tenrec.n.01 mammal.n.01 +atlantic_bottlenose_dolphin.n.01 dolphin.n.02 +sloth.n.02 mammal.n.01 +tamandua.n.01 mammal.n.01 +vixen.n.02 mammal.n.01 +longtail_weasel.n.01 weasel.n.02 +hooded_seal.n.01 seal.n.09 +fruit_bat.n.01 bat.n.01 +springer_spaniel.n.01 dog.n.01 +sable_antelope.n.01 placental.n.01 +musteline_mammal.n.01 musteline_mammal.n.01 +water_buffalo.n.01 water_buffalo.n.01 +spider_monkey.n.01 monkey.n.01 +carthorse.n.01 odd-toed_ungulate.n.01 +australopithecine.n.01 mammal.n.01 +skunk.n.04 mammal.n.01 +brush-tailed_porcupine.n.01 placental.n.01 +schnauzer.n.01 carnivore.n.01 +fallow_deer.n.01 even-toed_ungulate.n.01 +siamese_cat.n.01 feline.n.01 +cheviot.n.01 bovid.n.01 +hack.n.07 equine.n.01 +white_rhinoceros.n.01 placental.n.01 +jack.n.12 jack.n.12 +mountain_sheep.n.01 mountain_sheep.n.01 +crowbait.n.01 saddle_horse.n.01 +bactrian_camel.n.01 even-toed_ungulate.n.01 +boxer.n.04 dog.n.01 +milking_shorthorn.n.01 milking_shorthorn.n.01 +rhodesian_ridgeback.n.01 hunting_dog.n.01 +brown_hyena.n.01 carnivore.n.01 +cynocephalus_variegatus.n.01 flying_lemur.n.01 +indian_buffalo.n.01 water_buffalo.n.01 +galloway.n.02 ungulate.n.01 +bengal_tiger.n.01 tiger.n.02 +welsh_springer_spaniel.n.01 carnivore.n.01 +packhorse.n.01 equine.n.01 +remount.n.01 equine.n.01 +valley_pocket_gopher.n.01 rat.n.01 +mountain_beaver.n.01 mountain_beaver.n.01 +fur_seal.n.01 pinniped_mammal.n.01 +sealyham_terrier.n.01 welsh_terrier.n.01 +wolf.n.01 placental.n.01 +schipperke.n.01 watchdog.n.02 +mesohippus.n.01 placental.n.01 +tibetan_terrier.n.01 carnivore.n.01 +domestic_cat.n.01 cat.n.01 +mammoth.n.01 pachyderm.n.01 +syrian_bear.n.01 mammal.n.01 +tarsius_glis.n.01 primate.n.02 +blacktail_prairie_dog.n.01 rodent.n.01 +seeing_eye_dog.n.01 mammal.n.01 +dik-dik.n.01 ungulate.n.01 +little_chief_hare.n.01 mammal.n.01 +spaniel.n.01 canine.n.02 +okapi.n.01 ungulate.n.01 +moke.n.01 equine.n.01 +woolly_rhinoceros.n.01 odd-toed_ungulate.n.01 +pollard.n.02 placental.n.01 +angora.n.04 carnivore.n.01 +rock_hyrax.n.01 mammal.n.01 +cougar.n.01 cat.n.01 +common_raccoon.n.01 procyonid.n.01 +pygmy_sperm_whale.n.01 pygmy_sperm_whale.n.01 +even-toed_ungulate.n.01 even-toed_ungulate.n.01 +durham.n.02 even-toed_ungulate.n.01 +buckskin.n.01 buckskin.n.01 +humpback.n.03 humpback.n.03 +sea_cow.n.01 aquatic_mammal.n.01 +mountain_sheep.n.01 placental.n.01 +belgian_hare.n.01 lagomorph.n.01 +ruminant.n.01 ungulate.n.01 +river_otter.n.01 otter.n.02 +abrocome.n.01 mammal.n.01 +yak.n.02 yak.n.02 +shire.n.02 workhorse.n.02 +kuvasz.n.01 carnivore.n.01 +bitch.n.04 carnivore.n.01 +yorkshire_terrier.n.01 placental.n.01 +blue_whale.n.01 cetacean.n.01 +pinche.n.01 placental.n.01 +maltese_dog.n.01 carnivore.n.01 +hoary_marmot.n.01 mammal.n.01 +mole.n.06 mammal.n.01 +white_whale.n.01 cetacean.n.01 +yellowbelly_marmot.n.01 rodent.n.01 +jaguarundi.n.01 wildcat.n.03 +saber-toothed_tiger.n.01 mammal.n.01 +pony.n.05 pony.n.05 +housedog.n.01 housedog.n.01 +puppy.n.01 placental.n.01 +chow.n.03 spitz.n.01 +american_foxhound.n.01 hound.n.01 +alaska_fur_seal.n.01 pinniped_mammal.n.01 +brahman.n.04 mammal.n.01 +old_english_sheepdog.n.01 mammal.n.01 +count_fleet.n.01 odd-toed_ungulate.n.01 +slender-tailed_meerkat.n.01 placental.n.01 +pachyderm.n.01 mammal.n.01 +manatee.n.01 mammal.n.01 +miniature_schnauzer.n.01 miniature_schnauzer.n.01 +tiglon.n.01 big_cat.n.01 +wolf.n.01 canine.n.02 +english_setter.n.01 mammal.n.01 +homo_soloensis.n.01 homo.n.02 +aurochs.n.02 even-toed_ungulate.n.01 +nude_mouse.n.01 mammal.n.01 +whitetail_prairie_dog.n.01 mammal.n.01 +old_world_porcupine.n.01 mammal.n.01 +northern_flying_squirrel.n.01 american_flying_squirrel.n.01 +ass.n.03 odd-toed_ungulate.n.01 +guadalupe_fur_seal.n.01 mammal.n.01 +cow.n.01 placental.n.01 +porpoise.n.01 mammal.n.01 +suricate.n.01 viverrine.n.01 +dasyure.n.01 dasyure.n.01 +ground_sloth.n.01 megatherian.n.01 +oryx.n.01 ungulate.n.01 +wood_rabbit.n.01 lagomorph.n.01 +american_water_shrew.n.01 american_water_shrew.n.01 +puppy.n.01 carnivore.n.01 +affirmed.n.01 mammal.n.01 +narwhal.n.01 aquatic_mammal.n.01 +kudu.n.01 placental.n.01 +mantled_ground_squirrel.n.01 rodent.n.01 +dinoceras.n.01 placental.n.01 +old_world_least_weasel.n.01 musteline_mammal.n.01 +dolphin.n.02 whale.n.02 +agouti.n.01 placental.n.01 +elephant_seal.n.01 seal.n.09 +welsh_pony.n.01 ungulate.n.01 +ram.n.05 placental.n.01 +hound.n.01 placental.n.01 +indian_mongoose.n.01 mammal.n.01 +asian_wild_ox.n.01 ruminant.n.01 +milking_shorthorn.n.01 bovid.n.01 +lakeland_terrier.n.01 hunting_dog.n.01 +little_brown_bat.n.01 little_brown_bat.n.01 +harness_horse.n.01 harness_horse.n.01 +gazelle.n.01 bovid.n.01 +fisher.n.02 musteline_mammal.n.01 +new_world_tapir.n.01 new_world_tapir.n.01 +golden_hamster.n.01 mammal.n.01 +carabao.n.01 old_world_buffalo.n.01 +housedog.n.01 dog.n.01 +mule.n.01 mammal.n.01 +white-footed_mouse.n.01 mammal.n.01 +stalking-horse.n.04 placental.n.01 +rabbit-eared_bandicoot.n.01 bandicoot.n.01 +mountain_nyala.n.01 placental.n.01 +eurasian_badger.n.01 eurasian_badger.n.01 +humpback.n.03 baleen_whale.n.01 +hog.n.03 ungulate.n.01 +leporid.n.01 mammal.n.01 +lakeland_terrier.n.01 terrier.n.01 +deer_mouse.n.01 placental.n.01 +pole_horse.n.02 pole_horse.n.02 +entellus.n.01 langur.n.01 +mouser.n.01 cat.n.01 +aurochs.n.02 ox.n.02 +alaska_fur_seal.n.01 seal.n.09 +draft_horse.n.01 ungulate.n.01 +crab-eating_dog.n.01 mammal.n.01 +tusker.n.01 mammal.n.01 +sporting_dog.n.01 dog.n.01 +american_flying_squirrel.n.01 american_flying_squirrel.n.01 +kit_fox.n.01 placental.n.01 +griffon.n.03 dog.n.01 +pere_david's_deer.n.01 even-toed_ungulate.n.01 +fur_seal.n.02 eared_seal.n.01 +american_staffordshire_terrier.n.01 american_staffordshire_terrier.n.01 +tiger.n.02 carnivore.n.01 +earless_seal.n.01 earless_seal.n.01 +coonhound.n.01 carnivore.n.01 +jaguarundi.n.01 jaguarundi.n.01 +green_monkey.n.01 guenon.n.01 +fox.n.01 mammal.n.01 +hamster.n.01 placental.n.01 +prancer.n.01 saddle_horse.n.01 +impala.n.01 bovid.n.01 +english_springer.n.01 hunting_dog.n.01 +saluki.n.01 mammal.n.01 +mongoose.n.01 carnivore.n.01 +tarsius_glis.n.01 placental.n.01 +homo_sapiens_sapiens.n.01 primate.n.02 +terrier.n.01 dog.n.01 +guereza.n.01 colobus.n.01 +bear_cub.n.01 placental.n.01 +true_marmoset.n.01 new_world_monkey.n.01 +lion.n.01 lion.n.01 +alley_cat.n.01 alley_cat.n.01 +new_world_porcupine.n.01 rodent.n.01 +sorrel.n.05 sorrel.n.05 +border_terrier.n.01 dog.n.01 +tatouay.n.01 tatouay.n.01 +feist.n.01 feist.n.01 +bellwether.n.02 placental.n.01 +palfrey.n.01 horse.n.01 +lapdog.n.01 dog.n.01 +big-eared_bat.n.01 placental.n.01 +pacific_bottlenose_dolphin.n.01 mammal.n.01 +aquatic_mammal.n.01 aquatic_mammal.n.01 +leopard_cat.n.01 cat.n.01 +red_poll.n.01 red_poll.n.01 +corgi.n.01 placental.n.01 +bonnet_macaque.n.01 bonnet_macaque.n.01 +capuchin.n.02 new_world_monkey.n.01 +native_cat.n.01 marsupial.n.01 +scottish_deerhound.n.01 dog.n.01 +feist.n.01 canine.n.02 +sperm_whale.n.01 sperm_whale.n.01 +kitty.n.04 domestic_cat.n.01 +western_chimpanzee.n.01 placental.n.01 +bottle-nosed_whale.n.01 placental.n.01 +false_saber-toothed_tiger.n.01 carnivore.n.01 +elk.n.01 even-toed_ungulate.n.01 +muntjac.n.01 deer.n.01 +male_horse.n.01 ungulate.n.01 +markhor.n.01 goat.n.01 +vespertilian_bat.n.01 bat.n.01 +cro-magnon.n.01 mammal.n.01 +talapoin.n.01 placental.n.01 +wood_rat.n.01 mammal.n.01 +seizure-alert_dog.n.01 placental.n.01 +longwool.n.01 ruminant.n.01 +polo_pony.n.01 ungulate.n.01 +wether.n.01 ungulate.n.01 +pinniped_mammal.n.01 pinniped_mammal.n.01 +deer.n.01 deer.n.01 +mandrill.n.01 monkey.n.01 +corgi.n.01 carnivore.n.01 +woolly_indris.n.01 mammal.n.01 +friesian.n.01 placental.n.01 +seal.n.09 pinniped_mammal.n.01 +pekinese.n.01 carnivore.n.01 +springbok.n.01 antelope.n.01 +eurasian_hamster.n.01 mammal.n.01 +mouse.n.01 placental.n.01 +monkey.n.01 mammal.n.01 +meadow_vole.n.01 rodent.n.01 +lhasa.n.02 dog.n.01 +italian_greyhound.n.01 dog.n.01 +steenbok.n.01 mammal.n.01 +war_admiral.n.01 mammal.n.01 +starnose_mole.n.01 insectivore.n.01 +corgi.n.01 dog.n.01 +pekinese.n.01 mammal.n.01 +lagomorph.n.01 lagomorph.n.01 +coonhound.n.01 coonhound.n.01 +kangaroo_mouse.n.02 kangaroo_mouse.n.02 +farm_horse.n.01 mammal.n.01 +freetail.n.01 mammal.n.01 +longwool.n.01 ungulate.n.01 +sei_whale.n.01 sei_whale.n.01 +sassaby.n.01 mammal.n.01 +kit_fox.n.01 mammal.n.01 +fur_seal.n.02 mammal.n.01 +musk_ox.n.01 bovid.n.01 +american_mastodon.n.01 mastodon.n.01 +western_lowland_gorilla.n.01 placental.n.01 +mustang.n.01 pony.n.01 +rat_kangaroo.n.01 marsupial.n.01 +great_ape.n.01 placental.n.01 +woolly_mammoth.n.01 elephant.n.01 +stallion.n.01 ungulate.n.01 +steeplechaser.n.01 horse.n.01 +boston_bull.n.01 hunting_dog.n.01 +woolly_mammoth.n.01 proboscidean.n.01 +field_spaniel.n.01 mammal.n.01 +potto.n.02 primate.n.02 +striped_hyena.n.01 hyena.n.01 +manchester_terrier.n.01 carnivore.n.01 +uakari.n.01 placental.n.01 +chamois.n.02 even-toed_ungulate.n.01 +field_spaniel.n.01 dog.n.01 +american_water_spaniel.n.01 mammal.n.01 +chamois.n.02 chamois.n.02 +doberman.n.01 dog.n.01 +appenzeller.n.01 placental.n.01 +steed.n.01 warhorse.n.03 +manchester_terrier.n.01 terrier.n.01 +ferret.n.02 ferret.n.02 +wild_sheep.n.01 placental.n.01 +secretariat.n.02 mammal.n.01 +apar.n.01 apar.n.01 +three-toed_sloth.n.01 three-toed_sloth.n.01 +snake_muishond.n.01 snake_muishond.n.01 +springer_spaniel.n.01 carnivore.n.01 +clumber.n.01 sporting_dog.n.01 +sand_rat.n.02 rodent.n.01 +flying_phalanger.n.01 flying_phalanger.n.01 +afghan_hound.n.01 hound.n.01 +palomino.n.01 mammal.n.01 +cattle.n.01 bovid.n.01 +spouter.n.03 mammal.n.01 +patas.n.01 patas.n.01 +mink.n.03 musteline_mammal.n.01 +central_chimpanzee.n.01 ape.n.01 +merino.n.01 even-toed_ungulate.n.01 +war_admiral.n.01 equine.n.01 +macrotus.n.01 leafnose_bat.n.01 +silky_tamarin.n.01 marmoset.n.01 +shetland_pony.n.01 horse.n.01 +impala.n.01 ruminant.n.01 +anthropoid.n.02 placental.n.01 +meerkat.n.01 carnivore.n.01 +dik-dik.n.01 ruminant.n.01 +red_deer.n.01 ruminant.n.01 +norfolk_terrier.n.01 mammal.n.01 +marco_polo_sheep.n.01 mammal.n.01 +tom.n.02 feline.n.01 +green_monkey.n.01 placental.n.01 +great_pyrenees.n.01 great_pyrenees.n.01 +alpaca.n.03 ungulate.n.01 +blackbuck.n.01 antelope.n.01 +rhesus.n.01 monkey.n.01 +elephant_seal.n.01 earless_seal.n.01 +gemsbok.n.01 oryx.n.01 +sewer_rat.n.01 mammal.n.01 +sand_cat.n.01 wildcat.n.03 +hazel_mouse.n.01 mammal.n.01 +stallion.n.01 male_horse.n.01 +ibex.n.01 even-toed_ungulate.n.01 +red_deer.n.01 even-toed_ungulate.n.01 +meadow_jumping_mouse.n.01 rodent.n.01 +pipistrelle.n.01 bat.n.01 +jungle_cat.n.01 placental.n.01 +neandertal_man.n.01 homo.n.02 +brittany_spaniel.n.01 spaniel.n.01 +lion_cub.n.01 mammal.n.01 +field_spaniel.n.01 placental.n.01 +round-tailed_muskrat.n.01 mammal.n.01 +palm_cat.n.01 carnivore.n.01 +lhasa.n.02 mammal.n.01 +italian_greyhound.n.01 mammal.n.01 +vampire_bat.n.01 vampire_bat.n.01 +blue_fox.n.01 blue_fox.n.01 +seal.n.09 mammal.n.01 +red-backed_mouse.n.01 mammal.n.01 +stepper.n.03 equine.n.01 +howler_monkey.n.01 primate.n.02 +dairy_cattle.n.01 bovid.n.01 +appenzeller.n.01 canine.n.02 +common_raccoon.n.01 common_raccoon.n.01 +slender-tailed_meerkat.n.01 carnivore.n.01 +masked_shrew.n.01 masked_shrew.n.01 +cat.n.01 cat.n.01 +mouflon.n.01 ungulate.n.01 +tigress.n.01 tigress.n.01 +peking_man.n.01 homo_erectus.n.01 +sewer_rat.n.01 rodent.n.01 +guernsey.n.02 ruminant.n.01 +onager.n.02 ungulate.n.01 +great_ape.n.01 primate.n.02 +howler_monkey.n.01 mammal.n.01 +african_elephant.n.01 placental.n.01 +pocketed_bat.n.01 placental.n.01 +cavalry_horse.n.01 saddle_horse.n.01 +flying_fox.n.01 fruit_bat.n.01 +gazella_subgutturosa.n.01 even-toed_ungulate.n.01 +giant_schnauzer.n.01 carnivore.n.01 +true_marmoset.n.01 true_marmoset.n.01 +eared_seal.n.01 eared_seal.n.01 +dryopithecine.n.01 placental.n.01 +beaver_rat.n.01 rodent.n.01 +hunting_dog.n.01 carnivore.n.01 +blacktail_jackrabbit.n.01 placental.n.01 +draft_horse.n.01 equine.n.01 +kangaroo_mouse.n.01 pocket_rat.n.01 +guide_dog.n.01 working_dog.n.01 +ibizan_hound.n.01 hound.n.01 +griffon.n.02 mammal.n.01 +wire-haired_fox_terrier.n.01 hunting_dog.n.01 +echidna.n.02 monotreme.n.01 +angora.n.04 placental.n.01 +brown_swiss.n.01 ungulate.n.01 +australopithecine.n.01 australopithecine.n.01 +skunk.n.04 skunk.n.04 +gazelle.n.01 gazelle.n.01 +large_poodle.n.01 dog.n.01 +nilgai.n.01 bovid.n.01 +water_vole.n.02 rodent.n.01 +pocketed_bat.n.01 pocketed_bat.n.01 +bottlenose_dolphin.n.01 bottlenose_dolphin.n.01 +carthorse.n.01 workhorse.n.02 +equine.n.01 ungulate.n.01 +bellwether.n.02 bovid.n.01 +argali.n.01 argali.n.01 +fallow_deer.n.01 ruminant.n.01 +new_world_least_weasel.n.01 new_world_least_weasel.n.01 +lion_cub.n.01 placental.n.01 +tibetan_mastiff.n.01 placental.n.01 +eurasian_otter.n.01 carnivore.n.01 +whippet.n.01 dog.n.01 +hooded_skunk.n.01 hooded_skunk.n.01 +tiger_cat.n.02 cat.n.01 +kelpie.n.02 working_dog.n.01 +bellwether.n.02 ruminant.n.01 +domestic_cat.n.01 placental.n.01 +attack_dog.n.01 carnivore.n.01 +rhodesian_ridgeback.n.01 dog.n.01 +hominid.n.01 placental.n.01 +pygmy_sperm_whale.n.01 toothed_whale.n.01 +bellwether.n.02 bellwether.n.02 +fox_terrier.n.01 fox_terrier.n.01 +gnu.n.01 even-toed_ungulate.n.01 +bongo.n.02 ungulate.n.01 +rudapithecus.n.01 dryopithecine.n.01 +western_big-eared_bat.n.01 mammal.n.01 +coondog.n.01 hunting_dog.n.01 +bottlenose_dolphin.n.01 dolphin.n.02 +waterbuck.n.01 waterbuck.n.01 +hartebeest.n.01 ruminant.n.01 +least_shrew.n.01 insectivore.n.01 +harvest_mouse.n.02 mammal.n.01 +vervet.n.01 placental.n.01 +orange_bat.n.01 mammal.n.01 +cattalo.n.01 beef.n.01 +aardwolf.n.01 aardwolf.n.01 +tibetan_terrier.n.01 tibetan_terrier.n.01 +irish_wolfhound.n.01 canine.n.02 +mountain_nyala.n.01 ungulate.n.01 +margay.n.01 margay.n.01 +toy_manchester.n.01 dog.n.01 +lhasa.n.02 lhasa.n.02 +italian_greyhound.n.01 italian_greyhound.n.01 +loir.n.01 rodent.n.01 +groenendael.n.01 working_dog.n.01 +whirlaway.n.01 mammal.n.01 +toy_dog.n.01 carnivore.n.01 +cape_buffalo.n.01 ungulate.n.01 +spitz.n.01 dog.n.01 +manchester_terrier.n.01 mammal.n.01 +retriever.n.01 sporting_dog.n.01 +river_dolphin.n.01 cetacean.n.01 +pied_lemming.n.01 placental.n.01 +border_collie.n.01 working_dog.n.01 +foxhound.n.01 hound.n.01 +keeshond.n.01 dog.n.01 +hampshire.n.02 mammal.n.01 +welsh_springer_spaniel.n.01 springer_spaniel.n.01 +pere_david's_deer.n.01 deer.n.01 +imperial_mammoth.n.01 mammoth.n.01 +papillon.n.01 toy_spaniel.n.01 +rice_rat.n.01 placental.n.01 +australopithecus_robustus.n.01 australopithecine.n.01 +appenzeller.n.01 dog.n.01 +oryx.n.01 mammal.n.01 +mapinguari.n.01 edentate.n.01 +kangaroo_mouse.n.01 placental.n.01 +appenzeller.n.01 mammal.n.01 +addax.n.01 ungulate.n.01 +angwantibo.n.01 lemur.n.01 +welsh_springer_spaniel.n.01 sporting_dog.n.01 +plains_pocket_mouse.n.01 plains_pocket_mouse.n.01 +eastern_chimpanzee.n.01 primate.n.02 +soft-coated_wheaten_terrier.n.01 hunting_dog.n.01 +tasmanian_devil.n.01 dasyurid_marsupial.n.01 +wild_boar.n.01 placental.n.01 +american_red_squirrel.n.01 tree_squirrel.n.01 +heifer.n.01 cattle.n.01 +african_hunting_dog.n.01 canine.n.02 +brocket.n.02 ungulate.n.01 +goat_antelope.n.01 goat_antelope.n.01 +workhorse.n.02 ungulate.n.01 +toothed_whale.n.01 cetacean.n.01 +schipperke.n.01 canine.n.02 +field_mouse.n.02 mouse.n.01 +markhor.n.01 even-toed_ungulate.n.01 +typical_jerboa.n.01 placental.n.01 +silky_anteater.n.01 mammal.n.01 +echidna.n.02 prototherian.n.01 +protohippus.n.01 equine.n.01 +giant_kangaroo.n.01 kangaroo.n.01 +greater_kudu.n.01 bovid.n.01 +sea_lion.n.01 pinniped_mammal.n.01 +goat.n.01 bovid.n.01 +western_big-eared_bat.n.01 vespertilian_bat.n.01 +dairy_cattle.n.01 mammal.n.01 +american_foxhound.n.01 hunting_dog.n.01 +grasshopper_mouse.n.01 vole.n.01 +genet.n.03 mammal.n.01 +eastern_pipistrel.n.01 eastern_pipistrel.n.01 +flickertail.n.01 ground_squirrel.n.02 +heifer.n.01 ruminant.n.01 +bruin.n.01 bear.n.01 +earless_seal.n.01 placental.n.01 +warrigal.n.01 wild_horse.n.01 +pygmy_sperm_whale.n.01 whale.n.02 +hound.n.01 canine.n.02 +european_lemming.n.01 lemming.n.01 +proboscis_monkey.n.01 placental.n.01 +mule_deer.n.01 ungulate.n.01 +bassarisk.n.01 placental.n.01 +tabby.n.02 feline.n.01 +cheviot.n.01 sheep.n.01 +buck.n.05 mammal.n.01 +welsh_springer_spaniel.n.01 spaniel.n.01 +hare_wallaby.n.01 kangaroo.n.01 +cotton_mouse.n.01 wood_mouse.n.01 +river_otter.n.01 river_otter.n.01 +kanchil.n.01 kanchil.n.01 +mara.n.02 placental.n.01 +plains_pocket_gopher.n.01 plains_pocket_gopher.n.01 +long-tailed_porcupine.n.01 long-tailed_porcupine.n.01 +english_foxhound.n.01 foxhound.n.01 +bighorn.n.02 bovid.n.01 +lionet.n.01 feline.n.01 +brown_bear.n.01 brown_bear.n.01 +zebu.n.01 placental.n.01 +bezoar_goat.n.01 even-toed_ungulate.n.01 +dandie_dinmont.n.01 dandie_dinmont.n.01 +rudapithecus.n.01 placental.n.01 +takin.n.01 placental.n.01 +yearling.n.03 yearling.n.03 +pteropus_capestratus.n.01 pteropus_capestratus.n.01 +rice_rat.n.01 rat.n.01 +musk_deer.n.01 ruminant.n.01 +cuscus.n.01 marsupial.n.01 +gelding.n.01 male_horse.n.01 +frosted_bat.n.01 placental.n.01 +asian_wild_ox.n.01 even-toed_ungulate.n.01 +roe_deer.n.01 placental.n.01 +anoa.n.01 even-toed_ungulate.n.01 +watchdog.n.02 carnivore.n.01 +paca.n.01 placental.n.01 +sambar.n.01 even-toed_ungulate.n.01 +retriever.n.01 canine.n.02 +orangutan.n.01 ape.n.01 +american_black_bear.n.01 mammal.n.01 +european_rabbit.n.01 mammal.n.01 +dingo.n.01 canine.n.02 +clumber.n.01 dog.n.01 +chinchilla.n.03 placental.n.01 +aardwolf.n.01 placental.n.01 +stud.n.04 mammal.n.01 +aoudad.n.01 even-toed_ungulate.n.01 +chigetai.n.01 odd-toed_ungulate.n.01 +vizsla.n.01 sporting_dog.n.01 +black-and-tan_coonhound.n.01 hound.n.01 +grey_fox.n.01 mammal.n.01 +atlantic_bottlenose_dolphin.n.01 toothed_whale.n.01 +lion_cub.n.01 lion.n.01 +leonberg.n.01 placental.n.01 +oryx.n.01 ruminant.n.01 +wolf_pup.n.01 wolf.n.01 +ruminant.n.01 even-toed_ungulate.n.01 +small_civet.n.01 carnivore.n.01 +jaculus_jaculus.n.01 jerboa.n.01 +lesser_kudu.n.01 even-toed_ungulate.n.01 +koala.n.01 metatherian.n.01 +cow_pony.n.01 placental.n.01 +columbian_mammoth.n.01 proboscidean.n.01 +gerenuk.n.01 ruminant.n.01 +mink.n.03 mammal.n.01 +packrat.n.02 wood_rat.n.01 +gaur.n.01 ruminant.n.01 +jerboa_kangaroo.n.01 jerboa_kangaroo.n.01 +kit_fox.n.01 kit_fox.n.01 +skye_terrier.n.01 skye_terrier.n.01 +woodland_caribou.n.01 woodland_caribou.n.01 +leopardess.n.01 feline.n.01 +american_mastodon.n.01 mammal.n.01 +watchdog.n.02 placental.n.01 +lerot.n.01 dormouse.n.01 +false_vampire.n.01 bat.n.01 +hack.n.07 mammal.n.01 +brabancon_griffon.n.01 dog.n.01 +airedale.n.01 airedale.n.01 +bedlington_terrier.n.01 terrier.n.01 +toy_dog.n.01 canine.n.02 +common_dolphin.n.01 dolphin.n.02 +seizure-alert_dog.n.01 working_dog.n.01 +argali.n.01 mammal.n.01 +imperial_mammoth.n.01 placental.n.01 +labrador_retriever.n.01 placental.n.01 +liger.n.01 big_cat.n.01 +wild_ass.n.01 odd-toed_ungulate.n.01 +orangutan.n.01 mammal.n.01 +white_whale.n.01 white_whale.n.01 +welsh_pony.n.01 welsh_pony.n.01 +guanaco.n.01 llama.n.01 +arctic_ground_squirrel.n.01 arctic_ground_squirrel.n.01 +giraffe.n.01 ruminant.n.01 +mantled_ground_squirrel.n.01 mammal.n.01 +hack.n.08 ungulate.n.01 +lion.n.01 feline.n.01 +ox.n.02 ungulate.n.01 +bettong.n.01 mammal.n.01 +blackbuck.n.01 mammal.n.01 +slow_loris.n.01 lemur.n.01 +border_terrier.n.01 mammal.n.01 +bronco.n.01 mammal.n.01 +hispid_pocket_mouse.n.01 pocket_rat.n.01 +hare_wallaby.n.01 wallaby.n.01 +doberman.n.01 mammal.n.01 +tiger.n.02 big_cat.n.01 +buckskin.n.01 ungulate.n.01 +peking_man.n.01 hominid.n.01 +big-eared_bat.n.01 big-eared_bat.n.01 +golden_hamster.n.01 golden_hamster.n.01 +wirehair.n.01 terrier.n.01 +brewer's_mole.n.01 mammal.n.01 +okapi.n.01 ruminant.n.01 +silverback.n.01 great_ape.n.01 +kangaroo.n.01 mammal.n.01 +mule_deer.n.01 placental.n.01 +new_world_tapir.n.01 ungulate.n.01 +clumber.n.01 canine.n.02 +indian_elephant.n.01 mammal.n.01 +chamois.n.02 bovid.n.01 +bottlenose_dolphin.n.01 toothed_whale.n.01 +welsh.n.03 ungulate.n.01 +squirrel.n.01 placental.n.01 +zinjanthropus.n.01 mammal.n.01 +alaskan_brown_bear.n.01 brown_bear.n.01 +american_saddle_horse.n.01 odd-toed_ungulate.n.01 +ord_kangaroo_rat.n.01 rat.n.01 +hack.n.06 horse.n.01 +forest_goat.n.01 bovid.n.01 +entlebucher.n.01 entlebucher.n.01 +santa_gertrudis.n.01 ungulate.n.01 +egyptian_cat.n.01 cat.n.01 +barren_ground_caribou.n.01 placental.n.01 +serval.n.01 placental.n.01 +hunting_dog.n.01 hunting_dog.n.01 +lesser_kudu.n.01 mammal.n.01 +kob.n.01 waterbuck.n.01 +indian_buffalo.n.01 ungulate.n.01 +groenendael.n.01 mammal.n.01 +elephant_seal.n.01 placental.n.01 +brittany_spaniel.n.01 dog.n.01 +common_zebra.n.01 mammal.n.01 +guanaco.n.01 even-toed_ungulate.n.01 +aegyptopithecus.n.01 hominoid.n.01 +asiatic_black_bear.n.01 placental.n.01 +okapi.n.01 okapi.n.01 +phyllostomus_hastatus.n.01 placental.n.01 +seeing_eye_dog.n.01 seeing_eye_dog.n.01 +old_world_porcupine.n.01 old_world_porcupine.n.01 +tamarin.n.01 marmoset.n.01 +shetland_pony.n.01 pony.n.05 +wapiti.n.01 even-toed_ungulate.n.01 +bird_dog.n.01 hunting_dog.n.01 +dusky-footed_woodrat.n.01 mammal.n.01 +brewer's_mole.n.01 mole.n.06 +northern_pocket_gopher.n.01 placental.n.01 +wolfhound.n.01 dog.n.01 +stalking-horse.n.04 mammal.n.01 +silverback.n.01 primate.n.02 +meadow_jumping_mouse.n.01 meadow_jumping_mouse.n.01 +malamute.n.01 canine.n.02 +plains_pocket_mouse.n.01 rat.n.01 +tarpan.n.01 horse.n.01 +grey_lemming.n.01 placental.n.01 +komondor.n.01 dog.n.01 +harbor_seal.n.01 seal.n.09 +jird.n.01 placental.n.01 +world.n.08 world.n.08 +grey_lemming.n.01 grey_lemming.n.01 +damaraland_mole_rat.n.01 damaraland_mole_rat.n.01 +welsh_springer_spaniel.n.01 mammal.n.01 +spearnose_bat.n.01 bat.n.01 +jungle_cat.n.01 carnivore.n.01 +common_eland.n.01 even-toed_ungulate.n.01 +charolais.n.01 even-toed_ungulate.n.01 +dairy_cattle.n.01 bovine.n.01 +new_world_monkey.n.01 placental.n.01 +broadtail.n.02 even-toed_ungulate.n.01 +housedog.n.01 canine.n.02 +wisent.n.01 bovid.n.01 +horse.n.01 mammal.n.01 +malayan_tapir.n.01 ungulate.n.01 +harrier.n.02 hound.n.01 +marten.n.01 placental.n.01 +clydesdale.n.01 draft_horse.n.01 +broodmare.n.01 placental.n.01 +stone_marten.n.01 placental.n.01 +marsh_hare.n.01 rabbit.n.01 +sheep.n.01 sheep.n.01 +plott_hound.n.01 hound.n.01 +samoyed.n.03 samoyed.n.03 +blacktail_jackrabbit.n.01 mammal.n.01 +thomson's_gazelle.n.01 gazelle.n.01 +black-and-tan_coonhound.n.01 canine.n.02 +mexican_hairless.n.01 mexican_hairless.n.01 +metatherian.n.01 metatherian.n.01 +wolf.n.01 mammal.n.01 +mesohippus.n.01 mammal.n.01 +red_poll.n.01 mammal.n.01 +bowhead.n.01 baleen_whale.n.01 +silver_fox.n.01 fox.n.01 +cardigan.n.02 canine.n.02 +lincoln.n.03 ruminant.n.01 +pachyderm.n.01 placental.n.01 +watchdog.n.02 working_dog.n.01 +whirlaway.n.01 equine.n.01 +red-backed_mouse.n.01 rodent.n.01 +weimaraner.n.01 mammal.n.01 +bernese_mountain_dog.n.01 dog.n.01 +arabian_camel.n.01 placental.n.01 +pinche.n.01 primate.n.02 +pekinese.n.01 canine.n.02 +viscacha.n.01 rodent.n.01 +australopithecus_robustus.n.01 australopithecus_robustus.n.01 +ord_kangaroo_rat.n.01 ord_kangaroo_rat.n.01 +rambouillet.n.01 rambouillet.n.01 +lippizan.n.01 horse.n.01 +pug.n.01 placental.n.01 +kelpie.n.02 placental.n.01 +harp_seal.n.01 aquatic_mammal.n.01 +boxer.n.04 placental.n.01 +tamarau.n.01 mammal.n.01 +eastern_grey_squirrel.n.01 placental.n.01 +gemsbok.n.01 ruminant.n.01 +cattalo.n.01 bovid.n.01 +wether.n.01 sheep.n.01 +standard_poodle.n.01 standard_poodle.n.01 +mouflon.n.01 placental.n.01 +german_shepherd.n.01 canine.n.02 +old_world_beaver.n.01 rodent.n.01 +plott_hound.n.01 dog.n.01 +wire-haired_fox_terrier.n.01 placental.n.01 +pinche.n.01 mammal.n.01 +woodland_caribou.n.01 deer.n.01 +eastern_pipistrel.n.01 mammal.n.01 +american_bison.n.01 even-toed_ungulate.n.01 +poodle.n.01 placental.n.01 +indian_mongoose.n.01 viverrine.n.01 +neandertal_man.n.01 neandertal_man.n.01 +lapdog.n.01 carnivore.n.01 +mountain_gorilla.n.01 ape.n.01 +tasmanian_devil.n.01 tasmanian_devil.n.01 +cinnamon_bear.n.01 cinnamon_bear.n.01 +porpoise.n.01 dolphin.n.02 +raccoon_dog.n.01 carnivore.n.01 +rat_terrier.n.01 placental.n.01 +african_elephant.n.01 proboscidean.n.01 +field_spaniel.n.01 spaniel.n.01 +white_whale.n.01 toothed_whale.n.01 +wheel_horse.n.01 workhorse.n.02 +warhorse.n.03 equine.n.01 +agouti.n.01 agouti.n.01 +grivet.n.01 placental.n.01 +orangutan.n.01 orangutan.n.01 +pacer.n.02 ungulate.n.01 +retriever.n.01 mammal.n.01 +gnu.n.01 mammal.n.01 +king_charles_spaniel.n.01 mammal.n.01 +cob.n.02 harness_horse.n.01 +jennet.n.01 placental.n.01 +pomeranian.n.01 carnivore.n.01 +remount.n.01 odd-toed_ungulate.n.01 +oryx.n.01 antelope.n.01 +tamarin.n.01 monkey.n.01 +yorkshire_terrier.n.01 dog.n.01 +galago.n.01 primate.n.02 +heifer.n.01 placental.n.01 +hippopotamus.n.01 hippopotamus.n.01 +red-backed_mouse.n.01 red-backed_mouse.n.01 +indian_rhinoceros.n.01 rhinoceros.n.01 +friesian.n.01 bovid.n.01 +crab-eating_raccoon.n.01 procyonid.n.01 +wallaby.n.01 mammal.n.01 +nonstarter.n.02 mammal.n.01 +goat_antelope.n.01 even-toed_ungulate.n.01 +mountain_sheep.n.01 bovid.n.01 +bouvier_des_flandres.n.01 dog.n.01 +toy_manchester.n.01 hunting_dog.n.01 +longtail_weasel.n.01 musteline_mammal.n.01 +aquatic_mammal.n.01 placental.n.01 +macrotus.n.01 mammal.n.01 +kanchil.n.01 ungulate.n.01 +sheep.n.01 mammal.n.01 +macaque.n.01 monkey.n.01 +red_fox.n.02 canine.n.02 +thoroughbred.n.02 horse.n.01 +caracal.n.01 placental.n.01 +hinny.n.01 placental.n.01 +blenheim_spaniel.n.01 dog.n.01 +welsh_springer_spaniel.n.01 canine.n.02 +american_flying_squirrel.n.01 rodent.n.01 +appaloosa.n.01 saddle_horse.n.01 +barren_ground_caribou.n.01 ruminant.n.01 +bactrian_camel.n.01 bactrian_camel.n.01 +snowshoe_hare.n.01 leporid.n.01 +irish_water_spaniel.n.01 sporting_dog.n.01 +marsupial.n.01 mammal.n.01 +lincoln.n.03 mammal.n.01 +chiacoan_peccary.n.01 chiacoan_peccary.n.01 +miniature_schnauzer.n.01 dog.n.01 +american_water_spaniel.n.01 hunting_dog.n.01 +ape.n.01 placental.n.01 +eastern_cottontail.n.01 eastern_cottontail.n.01 +sea_lion.n.01 sea_lion.n.01 +spotted_hyena.n.01 mammal.n.01 +durham.n.02 durham.n.02 +ord_kangaroo_rat.n.01 rodent.n.01 +galloway.n.02 beef.n.01 +silky_pocket_mouse.n.01 pocket_mouse.n.01 +chestnut.n.06 ungulate.n.01 +tibetan_terrier.n.01 dog.n.01 +toy_terrier.n.01 mammal.n.01 +gee-gee.n.01 placental.n.01 +longwool.n.01 placental.n.01 +banteng.n.01 placental.n.01 +bovine.n.01 even-toed_ungulate.n.01 +borzoi.n.01 mammal.n.01 +three-year-old_horse.n.01 placental.n.01 +water_chevrotain.n.01 placental.n.01 +java_man.n.01 homo.n.02 +ibex.n.01 mammal.n.01 +miniature_pinscher.n.01 pinscher.n.01 +zebu.n.01 brahman.n.04 +muishond.n.01 weasel.n.02 +borzoi.n.01 wolfhound.n.01 +tigress.n.01 big_cat.n.01 +carabao.n.01 water_buffalo.n.01 +hare_wallaby.n.01 metatherian.n.01 +indian_rhinoceros.n.01 ungulate.n.01 +rabbit_ears.n.02 lagomorph.n.01 +tiger_cub.n.01 feline.n.01 +shire.n.02 ungulate.n.01 +bandicoot.n.01 bandicoot.n.01 +guinea_pig.n.02 guinea_pig.n.02 +wolverine.n.03 mammal.n.01 +soft-coated_wheaten_terrier.n.01 carnivore.n.01 +duplicidentata.n.01 duplicidentata.n.01 +cairn.n.02 hunting_dog.n.01 +sloth_bear.n.01 mammal.n.01 +shrew.n.02 mammal.n.01 +american_mink.n.01 mink.n.03 +wild_dog.n.01 canine.n.02 +sheep.n.01 placental.n.01 +neandertal_man.n.01 placental.n.01 +eurasian_badger.n.01 musteline_mammal.n.01 +pinscher.n.01 mammal.n.01 +bull_mastiff.n.01 mammal.n.01 +lapin.n.02 lapin.n.02 +mountain_goat.n.01 mountain_goat.n.01 +hack.n.06 mammal.n.01 +paranthropus.n.01 mammal.n.01 +cur.n.01 placental.n.01 +galloway.n.02 cattle.n.01 +lioness.n.01 carnivore.n.01 +pteropus_hypomelanus.n.01 fruit_bat.n.01 +old_world_least_weasel.n.01 carnivore.n.01 +merino.n.01 mammal.n.01 +hoary_marmot.n.01 placental.n.01 +remount.n.01 ungulate.n.01 +cynocephalus_variegatus.n.01 placental.n.01 +red_fox.n.02 placental.n.01 +bowhead.n.01 mammal.n.01 +small_civet.n.01 small_civet.n.01 +capuchin.n.02 placental.n.01 +giant_eland.n.01 giant_eland.n.01 +farm_horse.n.01 equine.n.01 +dark_horse.n.02 horse.n.01 +wolf_pup.n.01 canine.n.02 +seeing_eye_dog.n.01 placental.n.01 +bushbuck.n.01 antelope.n.01 +grevy's_zebra.n.01 ungulate.n.01 +fallow_deer.n.01 fallow_deer.n.01 +saiga.n.01 saiga.n.01 +spearnose_bat.n.01 carnivorous_bat.n.01 +eastern_chimpanzee.n.01 placental.n.01 +coati.n.01 procyonid.n.01 +horseshoe_bat.n.01 bat.n.01 +sable.n.05 carnivore.n.01 +shih-tzu.n.01 placental.n.01 +vaquita.n.01 dolphin.n.02 +maltese_dog.n.01 canine.n.02 +welsh_terrier.n.01 carnivore.n.01 +prairie_vole.n.01 vole.n.01 +cow.n.01 cattle.n.01 +malamute.n.01 mammal.n.01 +tigress.n.01 tiger.n.02 +zebra.n.01 zebra.n.01 +european_rabbit.n.01 european_rabbit.n.01 +rorqual.n.01 mammal.n.01 +sausage_dog.n.01 dachshund.n.01 +eskimo_dog.n.01 dog.n.01 +greater_kudu.n.01 kudu.n.01 +wapiti.n.01 deer.n.01 +virginia_deer.n.01 even-toed_ungulate.n.01 +border_terrier.n.01 placental.n.01 +pony.n.05 mammal.n.01 +mangabey.n.01 monkey.n.01 +killer_whale.n.01 placental.n.01 +boar.n.02 boar.n.02 +south_american_sea_lion.n.01 eared_seal.n.01 +gerenuk.n.01 antelope.n.01 +roe_deer.n.01 roe_deer.n.01 +whirlaway.n.01 whirlaway.n.01 +golden_mole.n.01 insectivore.n.01 +pygmy_marmoset.n.01 pygmy_marmoset.n.01 +cotswold.n.01 cotswold.n.01 +broadtail.n.02 placental.n.01 +black_sheep.n.02 sheep.n.01 +beaver.n.07 beaver.n.07 +gee-gee.n.01 ungulate.n.01 +rock_squirrel.n.01 mammal.n.01 +giant_schnauzer.n.01 hunting_dog.n.01 +japanese_spaniel.n.01 toy_dog.n.01 +stag.n.02 mammal.n.01 +jerboa.n.01 rodent.n.01 +hog-nosed_skunk.n.01 skunk.n.04 +bengal_tiger.n.01 carnivore.n.01 +new_world_least_weasel.n.01 musteline_mammal.n.01 +guenon.n.01 monkey.n.01 +toy_dog.n.01 dog.n.01 +domestic_ass.n.01 placental.n.01 +sei_whale.n.01 cetacean.n.01 +spitz.n.01 carnivore.n.01 +desmodus_rotundus.n.01 bat.n.01 +woolly_monkey.n.01 monkey.n.01 +walker_hound.n.01 carnivore.n.01 +grevy's_zebra.n.01 odd-toed_ungulate.n.01 +domestic_sheep.n.01 mammal.n.01 +police_dog.n.01 working_dog.n.01 +american_staffordshire_terrier.n.01 canine.n.02 +pallid_bat.n.01 pallid_bat.n.01 +irish_wolfhound.n.01 wolfhound.n.01 +silver_fox.n.01 carnivore.n.01 +clydesdale_terrier.n.01 terrier.n.01 +western_big-eared_bat.n.01 carnivorous_bat.n.01 +black_rhinoceros.n.01 rhinoceros.n.01 +war_admiral.n.01 thoroughbred.n.02 +indian_elephant.n.01 indian_elephant.n.01 +liver_chestnut.n.01 ungulate.n.01 +irish_wolfhound.n.01 mammal.n.01 +lynx.n.02 lynx.n.02 +bengal_tiger.n.01 feline.n.01 +brabancon_griffon.n.01 mammal.n.01 +kudu.n.01 mammal.n.01 +mountain_sheep.n.01 wild_sheep.n.01 +capuchin.n.02 monkey.n.01 +cattle.n.01 bovine.n.01 +mountain_gorilla.n.01 gorilla.n.01 +crowbait.n.01 odd-toed_ungulate.n.01 +manul.n.01 cat.n.01 +western_pipistrel.n.01 mammal.n.01 +secretariat.n.02 horse.n.01 +procyonid.n.01 procyonid.n.01 +mole_rat.n.01 placental.n.01 +black_rhinoceros.n.01 mammal.n.01 +kanchil.n.01 mammal.n.01 +english_setter.n.01 setter.n.02 +european_hare.n.01 mammal.n.01 +welsh_pony.n.01 placental.n.01 +shetland_sheepdog.n.01 carnivore.n.01 +whitetail_prairie_dog.n.01 rodent.n.01 +coati.n.01 placental.n.01 +pocket_rat.n.01 mammal.n.01 +tigress.n.01 feline.n.01 +civet.n.01 viverrine.n.01 +maltese_dog.n.01 dog.n.01 +green_monkey.n.01 monkey.n.01 +chickeree.n.01 mammal.n.01 +frosted_bat.n.01 mammal.n.01 +bat.n.01 bat.n.01 +swine.n.01 swine.n.01 +bongo.n.02 bovid.n.01 +bullock.n.02 ruminant.n.01 +tree_squirrel.n.01 tree_squirrel.n.01 +bloodhound.n.01 hound.n.01 +otter.n.02 mammal.n.01 +pole_horse.n.01 odd-toed_ungulate.n.01 +chiacoan_peccary.n.01 mammal.n.01 +kangaroo_mouse.n.02 mammal.n.01 +water_shrew.n.01 placental.n.01 +cryptoprocta.n.01 viverrine.n.01 +pony.n.01 odd-toed_ungulate.n.01 +pine_vole.n.01 pine_vole.n.01 +saki.n.03 monkey.n.01 +jersey.n.05 cattle.n.01 +peccary.n.01 peccary.n.01 +white_wolf.n.01 white_wolf.n.01 +cow.n.01 ungulate.n.01 +dinocerate.n.01 dinocerate.n.01 +marco_polo_sheep.n.01 wild_sheep.n.01 +cardigan.n.02 carnivore.n.01 +pere_david's_deer.n.01 mammal.n.01 +colobus.n.01 primate.n.02 +palfrey.n.01 placental.n.01 +jerboa_rat.n.01 placental.n.01 +pug.n.01 mammal.n.01 +java_man.n.01 primate.n.02 +asiatic_shrew_mole.n.01 mole.n.06 +onager.n.02 wild_ass.n.01 +rogue_elephant.n.01 rogue_elephant.n.01 +racehorse.n.01 racehorse.n.01 +omaha.n.04 horse.n.01 +ibizan_hound.n.01 mammal.n.01 +chacma.n.01 primate.n.02 +eastern_lowland_gorilla.n.01 primate.n.02 +wildcat.n.03 mammal.n.01 +guinea_pig.n.02 mammal.n.01 +king_charles_spaniel.n.01 canine.n.02 +setter.n.02 mammal.n.01 +jerboa_rat.n.01 jerboa_rat.n.01 +urial.n.01 ungulate.n.01 +echidna.n.01 prototherian.n.01 +borzoi.n.01 hunting_dog.n.01 +narwhal.n.01 cetacean.n.01 +red_poll.n.01 placental.n.01 +crab-eating_macaque.n.01 mammal.n.01 +hedgehog.n.02 insectivore.n.01 +fur_seal.n.02 seal.n.09 +badger.n.02 placental.n.01 +jaguar.n.01 carnivore.n.01 +welsh.n.03 even-toed_ungulate.n.01 +chihuahua.n.03 carnivore.n.01 +malayan_tapir.n.01 tapir.n.01 +welsh_terrier.n.01 hunting_dog.n.01 +tarsius_syrichta.n.01 tarsier.n.01 +affenpinscher.n.01 canine.n.02 +white_elephant.n.02 placental.n.01 +proconsul.n.03 hominoid.n.01 +bernese_mountain_dog.n.01 bernese_mountain_dog.n.01 +lakeland_terrier.n.01 lakeland_terrier.n.01 +rat_terrier.n.01 canine.n.02 +indian_mongoose.n.01 mongoose.n.01 +gayal.n.01 bovid.n.01 +large_civet.n.01 civet.n.01 +fox_terrier.n.01 placental.n.01 +fox.n.01 placental.n.01 +sussex_spaniel.n.01 hunting_dog.n.01 +appenzeller.n.01 sennenhunde.n.01 +smiledon_californicus.n.01 mammal.n.01 +sheep.n.01 bovid.n.01 +sinanthropus.n.01 placental.n.01 +toothed_whale.n.01 placental.n.01 +okapi.n.01 placental.n.01 +western_lowland_gorilla.n.01 primate.n.02 +liger.n.01 placental.n.01 +carabao.n.01 mammal.n.01 +wire-haired_fox_terrier.n.01 canine.n.02 +ratel.n.01 mammal.n.01 +brown_swiss.n.01 mammal.n.01 +sir_barton.n.01 odd-toed_ungulate.n.01 +afghan_hound.n.01 placental.n.01 +kob.n.01 even-toed_ungulate.n.01 +foxhound.n.01 mammal.n.01 +staffordshire_bullterrier.n.01 placental.n.01 +cocker_spaniel.n.01 sporting_dog.n.01 +mare.n.01 horse.n.01 +bellwether.n.02 wether.n.01 +boxer.n.04 working_dog.n.01 +cro-magnon.n.01 homo.n.02 +old_world_buffalo.n.01 even-toed_ungulate.n.01 +mesohippus.n.01 ungulate.n.01 +right_whale.n.01 aquatic_mammal.n.01 +vervet.n.01 monkey.n.01 +vixen.n.02 fox.n.01 +pembroke.n.01 corgi.n.01 +hog-nosed_skunk.n.01 mammal.n.01 +procyonid.n.01 carnivore.n.01 +hoary_marmot.n.01 hoary_marmot.n.01 +impala.n.01 even-toed_ungulate.n.01 +carthorse.n.01 placental.n.01 +patas.n.01 placental.n.01 +cairn.n.02 carnivore.n.01 +beaver_rat.n.01 water_rat.n.03 +capybara.n.01 rodent.n.01 +white_rhinoceros.n.01 odd-toed_ungulate.n.01 +sausage_dog.n.01 hunting_dog.n.01 +cuscus.n.01 metatherian.n.01 +spider_monkey.n.01 spider_monkey.n.01 +rabbit_ears.n.02 mammal.n.01 +eurasian_badger.n.01 placental.n.01 +sir_barton.n.01 mammal.n.01 +sporting_dog.n.01 carnivore.n.01 +percheron.n.01 equine.n.01 +thylacine.n.01 thylacine.n.01 +german_short-haired_pointer.n.01 dog.n.01 +tailless_tenrec.n.01 tenrec.n.01 +french_bulldog.n.01 bulldog.n.01 +brown_lemming.n.01 mammal.n.01 +dairy_cattle.n.01 placental.n.01 +grey_whale.n.01 cetacean.n.01 +hartebeest.n.01 ungulate.n.01 +large_poodle.n.01 placental.n.01 +gallant_fox.n.01 mammal.n.01 +pentail.n.01 pentail.n.01 +yellowbelly_marmot.n.01 marmot.n.01 +pouched_mouse.n.01 marsupial.n.01 +koala.n.01 marsupial.n.01 +red_wolf.n.01 carnivore.n.01 +sheep.n.01 even-toed_ungulate.n.01 +affirmed.n.01 placental.n.01 +fox.n.01 canine.n.02 +true_marmoset.n.01 mammal.n.01 +dormouse.n.01 dormouse.n.01 +staghound.n.01 hunting_dog.n.01 +bronco.n.01 equine.n.01 +common_wallaby.n.01 kangaroo.n.01 +irish_terrier.n.01 terrier.n.01 +weasel.n.02 mammal.n.01 +remount.n.01 remount.n.01 +black_fox.n.01 red_fox.n.03 +goat_antelope.n.01 mammal.n.01 +pronghorn.n.01 pronghorn.n.01 +spotted_lynx.n.01 spotted_lynx.n.01 +cattle.n.01 mammal.n.01 +american_water_spaniel.n.01 dog.n.01 +seizure-alert_dog.n.01 canine.n.02 +whitetail_prairie_dog.n.01 placental.n.01 +old_world_monkey.n.01 monkey.n.01 +wapiti.n.01 placental.n.01 +kitty.n.04 kitty.n.04 +persian_cat.n.01 placental.n.01 +gordon_setter.n.01 sporting_dog.n.01 +toy_manchester.n.01 carnivore.n.01 +indian_rhinoceros.n.01 indian_rhinoceros.n.01 +gerbil.n.01 placental.n.01 +indri.n.01 indri.n.01 +exmoor.n.01 bovid.n.01 +guano_bat.n.01 placental.n.01 +chevrotain.n.01 ruminant.n.01 +rudapithecus.n.01 mammal.n.01 +takin.n.01 mammal.n.01 +brown_hyena.n.01 hyena.n.01 +rabbit.n.01 lagomorph.n.01 +proboscis_monkey.n.01 monkey.n.01 +devon.n.02 bovine.n.01 +plains_pocket_gopher.n.01 placental.n.01 +meadow_jumping_mouse.n.01 jumping_mouse.n.01 +greyhound.n.01 dog.n.01 +aurochs.n.02 ungulate.n.01 +collared_pika.n.01 mammal.n.01 +wild_dog.n.01 wild_dog.n.01 +working_dog.n.01 dog.n.01 +sei_whale.n.01 placental.n.01 +american_badger.n.01 musteline_mammal.n.01 +gaur.n.01 bovine.n.01 +whale.n.02 cetacean.n.01 +count_fleet.n.01 placental.n.01 +urial.n.01 urial.n.01 +canada_lynx.n.01 carnivore.n.01 +bengal_tiger.n.01 bengal_tiger.n.01 +ferret_badger.n.01 ferret_badger.n.01 +merino.n.01 ruminant.n.01 +scotch_terrier.n.01 scotch_terrier.n.01 +crowbait.n.01 crowbait.n.01 +dwarf_sperm_whale.n.01 aquatic_mammal.n.01 +black-and-tan_coonhound.n.01 mammal.n.01 +nail-tailed_wallaby.n.01 wallaby.n.01 +brittany_spaniel.n.01 canine.n.02 +sewer_rat.n.01 placental.n.01 +sambar.n.01 sambar.n.01 +newfoundland.n.01 placental.n.01 +mudder.n.01 mudder.n.01 +pole_horse.n.02 equine.n.01 +kangaroo.n.01 metatherian.n.01 +ass.n.03 placental.n.01 +ground_squirrel.n.02 mammal.n.01 +snake_muishond.n.01 muishond.n.01 +vaquita.n.01 placental.n.01 +yellow-throated_marten.n.01 mammal.n.01 +dusky-footed_woodrat.n.01 packrat.n.02 +waterbuck.n.01 even-toed_ungulate.n.01 +quagga.n.01 ungulate.n.01 +anthropoid.n.02 mammal.n.01 +grey_whale.n.01 aquatic_mammal.n.01 +cow_pony.n.01 mammal.n.01 +poodle.n.01 poodle.n.01 +pere_david's_deer.n.01 pere_david's_deer.n.01 +timber_wolf.n.01 timber_wolf.n.01 +terrier.n.01 terrier.n.01 +border_terrier.n.01 canine.n.02 +new_world_least_weasel.n.01 carnivore.n.01 +mastodon.n.01 mammal.n.01 +durham.n.02 cattle.n.01 +hairy-legged_vampire_bat.n.01 hairy-legged_vampire_bat.n.01 +takin.n.01 ungulate.n.01 +pacer.n.01 placental.n.01 +mastiff.n.01 dog.n.01 +jersey.n.05 dairy_cattle.n.01 +zebu.n.01 ungulate.n.01 +grade.n.09 bovid.n.01 +boston_bull.n.01 placental.n.01 +bison.n.01 even-toed_ungulate.n.01 +american_saddle_horse.n.01 ungulate.n.01 +cow_pony.n.01 ungulate.n.01 +thylacine.n.01 marsupial.n.01 +bear.n.01 placental.n.01 +cashmere_goat.n.01 goat.n.01 +shih-tzu.n.01 canine.n.02 +swine.n.01 mammal.n.01 +california_sea_lion.n.01 placental.n.01 +springer.n.02 cattle.n.01 +indian_elephant.n.01 elephant.n.01 +fox_squirrel.n.01 mammal.n.01 +red_deer.n.01 deer.n.01 +staghound.n.01 hound.n.01 +collared_pika.n.01 lagomorph.n.01 +mammoth.n.01 elephant.n.01 +pine_vole.n.01 mammal.n.01 +equine.n.01 mammal.n.01 +skunk.n.04 carnivore.n.01 +stalking-horse.n.04 odd-toed_ungulate.n.01 +skye_terrier.n.01 mammal.n.01 +grivet.n.01 guenon.n.01 +harbor_porpoise.n.01 toothed_whale.n.01 +dinocerate.n.01 placental.n.01 +grampus.n.02 aquatic_mammal.n.01 +pointer.n.04 pointer.n.04 +spitz.n.01 spitz.n.01 +killer_whale.n.01 dolphin.n.02 +crowbait.n.01 horse.n.01 +harness_horse.n.01 equine.n.01 +lesser_panda.n.01 placental.n.01 +equine.n.01 odd-toed_ungulate.n.01 +muskrat.n.02 mammal.n.01 +broadtail.n.02 mammal.n.01 +nude_mouse.n.01 mouse.n.01 +wild_sheep.n.01 bovid.n.01 +water_vole.n.01 rodent.n.01 +warrigal.n.01 ungulate.n.01 +eohippus.n.01 equine.n.01 +war_admiral.n.01 ungulate.n.01 +pollard.n.02 ruminant.n.01 +clumber.n.01 placental.n.01 +leopard.n.02 mammal.n.01 +potto.n.02 lemur.n.01 +mesohippus.n.01 horse.n.01 +longhorn.n.01 ungulate.n.01 +yellow-throated_marten.n.01 placental.n.01 +hinny.n.01 equine.n.01 +rat_terrier.n.01 terrier.n.01 +otterhound.n.01 otterhound.n.01 +long-eared_bat.n.01 carnivorous_bat.n.01 +weimaraner.n.01 canine.n.02 +european_lemming.n.01 european_lemming.n.01 +rabbit-eared_bandicoot.n.01 mammal.n.01 +black_rhinoceros.n.01 ungulate.n.01 +bernese_mountain_dog.n.01 sennenhunde.n.01 +wallaby.n.01 marsupial.n.01 +tiger_cub.n.01 mammal.n.01 +dusky-footed_wood_rat.n.01 wood_rat.n.01 +caribou.n.01 ungulate.n.01 +cactus_mouse.n.01 cactus_mouse.n.01 +steller_sea_lion.n.01 steller_sea_lion.n.01 +gibbon.n.02 gibbon.n.02 +opossum.n.02 opossum.n.02 +dhole.n.01 carnivore.n.01 +long-tailed_porcupine.n.01 old_world_porcupine.n.01 +saki.n.03 placental.n.01 +royal.n.02 placental.n.01 +typical_jerboa.n.01 mammal.n.01 +setter.n.02 canine.n.02 +takin.n.01 bovid.n.01 +black_fox.n.01 carnivore.n.01 +asiatic_shrew_mole.n.01 mammal.n.01 +pademelon.n.01 mammal.n.01 +basenji.n.01 mammal.n.01 +stag.n.02 buck.n.05 +eastern_woodrat.n.01 placental.n.01 +cro-magnon.n.01 placental.n.01 +razorback.n.01 placental.n.01 +cairn.n.02 terrier.n.01 +coydog.n.01 mammal.n.01 +shepherd_dog.n.01 placental.n.01 +humpback.n.03 aquatic_mammal.n.01 +water_shrew.n.01 water_shrew.n.01 +brown_swiss.n.01 dairy_cattle.n.01 +norwegian_elkhound.n.01 dog.n.01 +american_flying_squirrel.n.01 squirrel.n.01 +lippizan.n.01 equine.n.01 +sea_lion.n.01 mammal.n.01 +jennet.n.01 equine.n.01 +american_red_squirrel.n.01 american_red_squirrel.n.01 +beaver_rat.n.01 beaver_rat.n.01 +greyhound.n.01 hound.n.01 +bird_dog.n.01 carnivore.n.01 +serotine.n.01 bat.n.01 +exmoor.n.02 mammal.n.01 +wallaby.n.01 wallaby.n.01 +english_setter.n.01 placental.n.01 +steenbok.n.01 bovid.n.01 +appaloosa.n.01 ungulate.n.01 +mountain_zebra.n.01 odd-toed_ungulate.n.01 +manatee.n.01 placental.n.01 +longtail_weasel.n.01 placental.n.01 +horseshoe_bat.n.02 horseshoe_bat.n.02 +frosted_bat.n.01 carnivorous_bat.n.01 +stoat.n.01 ermine.n.02 +spotted_skunk.n.01 carnivore.n.01 +caracal.n.01 feline.n.01 +chipmunk.n.01 mammal.n.01 +mara.n.02 mara.n.02 +siamese_cat.n.01 carnivore.n.01 +english_springer.n.01 dog.n.01 +mastiff_bat.n.01 mastiff_bat.n.01 +toy_manchester.n.01 toy_manchester.n.01 +otter_shrew.n.01 mammal.n.01 +broadtail.n.02 domestic_sheep.n.01 +two-year-old_horse.n.01 horse.n.01 +blenheim_spaniel.n.01 toy_spaniel.n.01 +cheetah.n.01 feline.n.01 +giant_panda.n.01 placental.n.01 +right_whale.n.01 placental.n.01 +griffon.n.03 hunting_dog.n.01 +southern_bog_lemming.n.01 southern_bog_lemming.n.01 +syrian_bear.n.01 bear.n.01 +fanaloka.n.01 civet.n.01 +hampshire.n.02 sheep.n.01 +bullock.n.01 bovine.n.01 +arctic_ground_squirrel.n.01 ground_squirrel.n.02 +curly-coated_retriever.n.01 canine.n.02 +yellow-throated_marten.n.01 yellow-throated_marten.n.01 +hooded_seal.n.01 hooded_seal.n.01 +tarsier.n.01 mammal.n.01 +angora.n.04 domestic_cat.n.01 +pinscher.n.01 working_dog.n.01 +bull_mastiff.n.01 working_dog.n.01 +pomeranian.n.01 pomeranian.n.01 +markhor.n.01 markhor.n.01 +leonberg.n.01 leonberg.n.01 +beaver.n.07 mammal.n.01 +australopithecus_robustus.n.01 mammal.n.01 +citation.n.06 ungulate.n.01 +terrier.n.01 mammal.n.01 +saluki.n.01 dog.n.01 +hedgehog.n.02 placental.n.01 +draft_horse.n.01 mammal.n.01 +warrigal.n.01 warrigal.n.01 +clumber.n.01 hunting_dog.n.01 +brittany_spaniel.n.01 brittany_spaniel.n.01 +jaculus_jaculus.n.01 mammal.n.01 +charger.n.01 charger.n.01 +big_cat.n.01 big_cat.n.01 +peba.n.01 peba.n.01 +komondor.n.01 carnivore.n.01 +guide_dog.n.01 dog.n.01 +bullock.n.01 mammal.n.01 +gallant_fox.n.01 horse.n.01 +ocelot.n.01 carnivore.n.01 +porpoise.n.01 whale.n.02 +margay.n.01 cat.n.01 +baboon.n.01 old_world_monkey.n.01 +quarter_horse.n.01 equine.n.01 +queen.n.09 mammal.n.01 +afghan_hound.n.01 canine.n.02 +opossum.n.02 marsupial.n.01 +cotswold.n.01 sheep.n.01 +silverback.n.01 mammal.n.01 +leopardess.n.01 leopardess.n.01 +big_brown_bat.n.01 big_brown_bat.n.01 +secretariat.n.02 ungulate.n.01 +edentate.n.01 mammal.n.01 +homo_erectus.n.01 homo_erectus.n.01 +pine_vole.n.01 vole.n.01 +roan.n.02 placental.n.01 +zoril.n.01 placental.n.01 +red_squirrel.n.02 red_squirrel.n.02 +cheetah.n.01 placental.n.01 +murine.n.01 murine.n.01 +mink.n.03 carnivore.n.01 +fissiped_mammal.n.01 fissiped_mammal.n.01 +miniature_schnauzer.n.01 carnivore.n.01 +musk_deer.n.01 musk_deer.n.01 +bighorn.n.02 bighorn.n.02 +vixen.n.02 canine.n.02 +standard_schnauzer.n.01 hunting_dog.n.01 +domestic_sheep.n.01 sheep.n.01 +thomson's_gazelle.n.01 antelope.n.01 +kerry_blue_terrier.n.01 placental.n.01 +drill.n.02 drill.n.02 +american_water_shrew.n.01 placental.n.01 +spouter.n.03 spouter.n.03 +grey_whale.n.01 whale.n.02 +red-backed_mouse.n.01 placental.n.01 +plow_horse.n.01 plow_horse.n.01 +water_dog.n.02 hunting_dog.n.01 +lesser_panda.n.01 lesser_panda.n.01 +african_elephant.n.01 pachyderm.n.01 +jersey.n.05 bovid.n.01 +australopithecus_boisei.n.01 australopithecus_boisei.n.01 +komondor.n.01 komondor.n.01 +beef.n.01 placental.n.01 +lhasa.n.02 placental.n.01 +lynx.n.02 placental.n.01 +border_collie.n.01 dog.n.01 +porcupine.n.01 rodent.n.01 +harp_seal.n.01 pinniped_mammal.n.01 +italian_greyhound.n.01 placental.n.01 +water_shrew.n.01 shrew.n.02 +african_wild_ass.n.01 equine.n.01 +polar_hare.n.01 placental.n.01 +blue_whale.n.01 mammal.n.01 +asian_wild_ox.n.01 mammal.n.01 +spaniel.n.01 hunting_dog.n.01 +rabbit-eared_bandicoot.n.01 marsupial.n.01 +cynopterus_sphinx.n.01 mammal.n.01 +pricket.n.02 placental.n.01 +gibbon.n.02 mammal.n.01 +bronco.n.01 horse.n.01 +black_sheep.n.02 ungulate.n.01 +galloway.n.02 even-toed_ungulate.n.01 +slow_loris.n.01 mammal.n.01 +puku.n.01 ungulate.n.01 +gayal.n.01 ox.n.02 +indri.n.01 mammal.n.01 +palomino.n.01 equine.n.01 +briard.n.01 carnivore.n.01 +yorkshire_terrier.n.01 carnivore.n.01 +nilgai.n.01 mammal.n.01 +steller_sea_lion.n.01 aquatic_mammal.n.01 +secretariat.n.02 equine.n.01 +chevrotain.n.01 mammal.n.01 +wild_horse.n.01 horse.n.01 +kitty.n.04 mammal.n.01 +ox.n.01 even-toed_ungulate.n.01 +tree_squirrel.n.01 mammal.n.01 +post_horse.n.01 equine.n.01 +northern_bog_lemming.n.01 mammal.n.01 +colobus.n.01 old_world_monkey.n.01 +belgian_sheepdog.n.01 canine.n.02 +mexican_pocket_mouse.n.01 pocket_rat.n.01 +pacific_walrus.n.01 pinniped_mammal.n.01 +tayra.n.01 musteline_mammal.n.01 +peking_man.n.01 peking_man.n.01 +snowshoe_hare.n.01 snowshoe_hare.n.01 +ferret.n.02 placental.n.01 +common_opossum.n.01 marsupial.n.01 +horseshoe_bat.n.02 bat.n.01 +puppy.n.01 dog.n.01 +french_bulldog.n.01 mammal.n.01 +kelpie.n.02 dog.n.01 +dingo.n.01 mammal.n.01 +wood_mouse.n.01 wood_mouse.n.01 +remount.n.01 horse.n.01 +arabian_camel.n.01 arabian_camel.n.01 +racehorse.n.01 placental.n.01 +killer_whale.n.01 killer_whale.n.01 +markhor.n.01 mammal.n.01 +saint_bernard.n.01 dog.n.01 +miniature_pinscher.n.01 mammal.n.01 +fissipedia.n.01 placental.n.01 +toothed_whale.n.01 whale.n.02 +muntjac.n.01 muntjac.n.01 +gee-gee.n.01 gee-gee.n.01 +carabao.n.01 ungulate.n.01 +homo_sapiens.n.01 homo.n.02 +sussex_spaniel.n.01 canine.n.02 +packrat.n.02 placental.n.01 +kid.n.05 mammal.n.01 +border_collie.n.01 canine.n.02 +dall_sheep.n.01 placental.n.01 +spotted_hyena.n.01 placental.n.01 +tree_wallaby.n.01 mammal.n.01 +stalking-horse.n.04 stalking-horse.n.04 +bunny.n.02 mammal.n.01 +aye-aye.n.01 mammal.n.01 +maltese.n.03 feline.n.01 +gemsbok.n.01 bovid.n.01 +domestic_goat.n.01 ruminant.n.01 +cougar.n.01 cougar.n.01 +bruin.n.01 bruin.n.01 +western_big-eared_bat.n.01 bat.n.01 +cairn.n.02 cairn.n.02 +pacific_walrus.n.01 aquatic_mammal.n.01 +cardigan.n.02 corgi.n.01 +pocketed_bat.n.01 freetail.n.01 +scottish_deerhound.n.01 placental.n.01 +narwhal.n.01 placental.n.01 +rottweiler.n.01 placental.n.01 +assault.n.03 odd-toed_ungulate.n.01 +addax.n.01 even-toed_ungulate.n.01 +pine_marten.n.01 marten.n.01 +homo_sapiens.n.01 mammal.n.01 +australopithecine.n.01 placental.n.01 +skunk.n.04 placental.n.01 +tamarin.n.01 primate.n.02 +brush-tailed_porcupine.n.01 mammal.n.01 +grizzly.n.01 grizzly.n.01 +proboscis_monkey.n.01 old_world_monkey.n.01 +leopard_cat.n.01 mammal.n.01 +pallid_bat.n.01 mammal.n.01 +american_water_spaniel.n.01 canine.n.02 +brocket.n.02 ruminant.n.01 +markhor.n.01 placental.n.01 +echidna.n.01 echidna.n.01 +murine.n.01 mammal.n.01 +mouflon.n.01 mountain_sheep.n.01 +griffon.n.02 griffon.n.02 +common_dolphin.n.01 placental.n.01 +gerenuk.n.01 gerenuk.n.01 +rhesus.n.01 rhesus.n.01 +kuvasz.n.01 kuvasz.n.01 +bitch.n.04 bitch.n.04 +alley_cat.n.01 cat.n.01 +miniature_pinscher.n.01 watchdog.n.02 +european_water_shrew.n.01 european_water_shrew.n.01 +charolais.n.01 charolais.n.01 +pilot_whale.n.01 cetacean.n.01 +entellus.n.01 monkey.n.01 +nyala.n.02 ungulate.n.01 +sperm_whale.n.01 whale.n.02 +tasmanian_devil.n.01 metatherian.n.01 +mouser.n.01 placental.n.01 +indian_elephant.n.01 proboscidean.n.01 +homo.n.02 hominid.n.01 +miniature_schnauzer.n.01 terrier.n.01 +mastodon.n.01 placental.n.01 +remount.n.01 saddle_horse.n.01 +cotton_rat.n.01 rodent.n.01 +simian.n.01 mammal.n.01 +two-toed_sloth.n.02 placental.n.01 +steller's_sea_cow.n.01 sea_cow.n.01 +clydesdale.n.01 placental.n.01 +saint_bernard.n.01 canine.n.02 +hart.n.03 even-toed_ungulate.n.01 +whippet.n.01 placental.n.01 +tamarin.n.01 new_world_monkey.n.01 +red_squirrel.n.02 placental.n.01 +lion.n.01 mammal.n.01 +tiger_cub.n.01 placental.n.01 +gopher.n.04 rat.n.01 +plains_pocket_mouse.n.01 rodent.n.01 +pocket_mouse.n.01 rat.n.01 +doe.n.02 mammal.n.01 +peccary.n.01 mammal.n.01 +welsh.n.03 bovid.n.01 +bunny.n.02 lagomorph.n.01 +koala.n.01 mammal.n.01 +ferret_badger.n.01 musteline_mammal.n.01 +pacer.n.02 horse.n.01 +sei_whale.n.01 whale.n.02 +english_toy_spaniel.n.01 dog.n.01 +ungulate.n.01 ungulate.n.01 +wombat.n.01 wombat.n.01 +panther.n.02 carnivore.n.01 +durham.n.02 bovid.n.01 +hog.n.03 swine.n.01 +maltese_dog.n.01 maltese_dog.n.01 +ratel.n.01 carnivore.n.01 +brittany_spaniel.n.01 carnivore.n.01 +black_sheep.n.02 even-toed_ungulate.n.01 +pacific_walrus.n.01 mammal.n.01 +cow.n.01 mammal.n.01 +springbok.n.01 ungulate.n.01 +basset.n.01 hound.n.01 +mule.n.01 equine.n.01 +raccoon.n.02 mammal.n.01 +eastern_grey_squirrel.n.01 eastern_grey_squirrel.n.01 +australian_terrier.n.01 hunting_dog.n.01 +great_dane.n.01 carnivore.n.01 +algeripithecus_minutus.n.01 hominoid.n.01 +squirrel_monkey.n.01 primate.n.02 +forest_goat.n.01 placental.n.01 +western_lowland_gorilla.n.01 mammal.n.01 +howler_monkey.n.01 howler_monkey.n.01 +jennet.n.01 jennet.n.01 +anthropoid_ape.n.01 placental.n.01 +boskop_man.n.01 boskop_man.n.01 +zinjanthropus.n.01 zinjanthropus.n.01 +otterhound.n.01 mammal.n.01 +manchester_terrier.n.01 manchester_terrier.n.01 +mylodontid.n.01 mammal.n.01 +saiga.n.01 ungulate.n.01 +vervet.n.01 guenon.n.01 +silky_terrier.n.01 carnivore.n.01 +malinois.n.01 malinois.n.01 +mountain_gorilla.n.01 primate.n.02 +dingo.n.01 carnivore.n.01 +walker_hound.n.01 placental.n.01 +toy_spaniel.n.01 toy_spaniel.n.01 +flat-coated_retriever.n.01 carnivore.n.01 +australopithecine.n.01 primate.n.02 +imperial_mammoth.n.01 pachyderm.n.01 +squirrel_monkey.n.01 mammal.n.01 +kitty.n.04 cat.n.01 +skunk.n.04 musteline_mammal.n.01 +harvest_mouse.n.02 harvest_mouse.n.02 +raccoon.n.02 raccoon.n.02 +guano_bat.n.01 carnivorous_bat.n.01 +ferret_badger.n.01 mammal.n.01 +atlantic_walrus.n.01 aquatic_mammal.n.01 +boarhound.n.01 hunting_dog.n.01 +dhole.n.01 placental.n.01 +billy.n.02 goat.n.01 +barren_ground_caribou.n.01 caribou.n.01 +horse.n.01 equine.n.01 +elephant_seal.n.01 aquatic_mammal.n.01 +nonstarter.n.02 ungulate.n.01 +goral.n.01 even-toed_ungulate.n.01 +hog_badger.n.01 mammal.n.01 +mule_deer.n.01 even-toed_ungulate.n.01 +blue_point_siamese.n.01 mammal.n.01 +shepherd_dog.n.01 working_dog.n.01 +guadalupe_fur_seal.n.01 eared_seal.n.01 +nyala.n.02 mammal.n.01 +friesian.n.01 cattle.n.01 +harnessed_antelope.n.01 placental.n.01 +roebuck.n.01 deer.n.01 +brown_lemming.n.01 placental.n.01 +lincoln.n.03 lincoln.n.03 +water_spaniel.n.01 carnivore.n.01 +phalanger.n.01 mammal.n.01 +bottle-nosed_whale.n.01 beaked_whale.n.01 +japanese_deer.n.01 mammal.n.01 +tree_shrew.n.01 placental.n.01 +aardwolf.n.01 mammal.n.01 +eastern_chimpanzee.n.01 great_ape.n.01 +blue_point_siamese.n.01 domestic_cat.n.01 +stalking-horse.n.04 equine.n.01 +zoril.n.01 carnivore.n.01 +woolly_indris.n.01 woolly_indris.n.01 +goral.n.01 goat_antelope.n.01 +greater_swiss_mountain_dog.n.01 canine.n.02 +water_spaniel.n.01 mammal.n.01 +basset.n.01 carnivore.n.01 +english_foxhound.n.01 dog.n.01 +jackal.n.01 placental.n.01 +housedog.n.01 carnivore.n.01 +nyala.n.02 nyala.n.02 +tabby.n.02 cat.n.01 +pouched_mole.n.01 marsupial.n.01 +blackbuck.n.01 ungulate.n.01 +giant_eland.n.01 ruminant.n.01 +cattle.n.01 ruminant.n.01 +mylodontid.n.01 placental.n.01 +border_terrier.n.01 border_terrier.n.01 +gelding.n.01 gelding.n.01 +domestic_goat.n.01 domestic_goat.n.01 +badger.n.02 badger.n.02 +shrew_mole.n.01 mammal.n.01 +douroucouli.n.01 primate.n.02 +american_mink.n.01 american_mink.n.01 +maltese_dog.n.01 mammal.n.01 +giant_kangaroo.n.01 mammal.n.01 +cryptoprocta.n.01 mammal.n.01 +horseshoe_bat.n.02 carnivorous_bat.n.01 +swamp_rabbit.n.02 placental.n.01 +stud.n.04 ungulate.n.01 +apar.n.01 edentate.n.01 +three-toed_sloth.n.01 edentate.n.01 +warrigal.n.01 placental.n.01 +tayra.n.01 placental.n.01 +brown_hyena.n.01 brown_hyena.n.01 +sloth.n.02 placental.n.01 +warthog.n.01 mammal.n.01 +dandie_dinmont.n.01 terrier.n.01 +african_hunting_dog.n.01 african_hunting_dog.n.01 +japanese_spaniel.n.01 japanese_spaniel.n.01 +wild_goat.n.01 mammal.n.01 +redbone.n.01 dog.n.01 +field_mouse.n.02 mammal.n.01 +bucking_bronco.n.01 mustang.n.01 +liver-spotted_dalmatian.n.01 dalmatian.n.02 +boar.n.02 mammal.n.01 +komondor.n.01 canine.n.02 +pied_lemming.n.01 rodent.n.01 +atlantic_walrus.n.01 mammal.n.01 +english_springer.n.01 mammal.n.01 +thoroughbred.n.02 mammal.n.01 +alpaca.n.03 llama.n.01 +mapinguari.n.01 mapinguari.n.01 +american_water_spaniel.n.01 american_water_spaniel.n.01 +striped_muishond.n.01 weasel.n.02 +guinea_pig.n.02 cavy.n.01 +silver_fox.n.01 canine.n.02 +remount.n.01 mammal.n.01 +gazelle.n.01 placental.n.01 +common_raccoon.n.01 placental.n.01 +springer.n.02 ruminant.n.01 +house_mouse.n.01 mammal.n.01 +grevy's_zebra.n.01 equine.n.01 +sassaby.n.01 antelope.n.01 +american_saddle_horse.n.01 placental.n.01 +english_foxhound.n.01 placental.n.01 +springer_spaniel.n.01 springer_spaniel.n.01 +toy_poodle.n.01 mammal.n.01 +hack.n.06 ungulate.n.01 +pygmy_mouse.n.01 placental.n.01 +echidna.n.02 mammal.n.01 +mongoose.n.01 viverrine.n.01 +siberian_husky.n.01 placental.n.01 +stablemate.n.01 odd-toed_ungulate.n.01 +stirk.n.01 bovine.n.01 +boskop_man.n.01 hominid.n.01 +mudder.n.01 racehorse.n.01 +caracal.n.01 cat.n.01 +protohippus.n.01 ungulate.n.01 +bongo.n.02 bongo.n.02 +musk_kangaroo.n.01 musk_kangaroo.n.01 +gerbil.n.01 rodent.n.01 +kaffir_cat.n.01 mammal.n.01 +wild_ass.n.01 ungulate.n.01 +norfolk_terrier.n.01 carnivore.n.01 +basenji.n.01 dog.n.01 +lion_cub.n.01 feline.n.01 +blacktail_jackrabbit.n.01 leporid.n.01 +corgi.n.01 canine.n.02 +chihuahua.n.03 dog.n.01 +plott_hound.n.01 canine.n.02 +antelope_squirrel.n.01 antelope_squirrel.n.01 +gnu.n.01 antelope.n.01 +little_brown_bat.n.01 placental.n.01 +drill.n.02 monkey.n.01 +spotted_hyena.n.01 canine.n.02 +beaver_rat.n.01 placental.n.01 +galago.n.01 placental.n.01 +crab-eating_macaque.n.01 primate.n.02 +hog_badger.n.01 hog_badger.n.01 +great_dane.n.01 canine.n.02 +fossa.n.03 placental.n.01 +okapi.n.01 even-toed_ungulate.n.01 +kob.n.01 bovid.n.01 +ice_bear.n.01 carnivore.n.01 +horseshoe_bat.n.01 leafnose_bat.n.01 +pygmy_chimpanzee.n.01 chimpanzee.n.01 +pinto.n.01 ungulate.n.01 +markhor.n.01 wild_goat.n.01 +ayrshire.n.01 ruminant.n.01 +chickeree.n.01 chickeree.n.01 +jerboa.n.01 jerboa.n.01 +lion_cub.n.01 carnivore.n.01 +billy.n.02 mammal.n.01 +bedlington_terrier.n.01 canine.n.02 +cavy.n.01 rodent.n.01 +southeastern_pocket_gopher.n.01 southeastern_pocket_gopher.n.01 +bucking_bronco.n.01 bucking_bronco.n.01 +tarsier.n.01 tarsier.n.01 +moke.n.01 placental.n.01 +roebuck.n.01 ungulate.n.01 +lemming.n.01 rodent.n.01 +chinchilla.n.03 rodent.n.01 +norwegian_elkhound.n.01 mammal.n.01 +dingo.n.01 dingo.n.01 +chacma.n.01 old_world_monkey.n.01 +greyhound.n.01 greyhound.n.01 +tiger_cat.n.01 tiger_cat.n.01 +irish_terrier.n.01 hunting_dog.n.01 +tiger.n.02 mammal.n.01 +titi.n.03 mammal.n.01 +broodmare.n.01 broodmare.n.01 +true_marmoset.n.01 monkey.n.01 +slender_loris.n.01 lemur.n.01 +steller_sea_lion.n.01 mammal.n.01 +schnauzer.n.01 mammal.n.01 +black_fox.n.01 mammal.n.01 +appaloosa.n.01 horse.n.01 +white_wolf.n.01 wolf.n.01 +africander.n.01 africander.n.01 +unguiculate.n.01 mammal.n.01 +ichneumon.n.01 carnivore.n.01 +pointer.n.04 mammal.n.01 +dasyure.n.01 mammal.n.01 +three-year-old_horse.n.01 racehorse.n.01 +police_dog.n.01 canine.n.02 +lynx.n.02 cat.n.01 +working_dog.n.01 placental.n.01 +red_fox.n.02 fox.n.01 +tabby.n.01 placental.n.01 +pilot_whale.n.01 placental.n.01 +tiger_cat.n.01 carnivore.n.01 +chigetai.n.01 chigetai.n.01 +french_bulldog.n.01 working_dog.n.01 +abyssinian.n.01 abyssinian.n.01 +loir.n.01 loir.n.01 +american_water_shrew.n.01 shrew.n.02 +stone_marten.n.01 musteline_mammal.n.01 +rogue_elephant.n.01 placental.n.01 +packrat.n.02 rodent.n.01 +kangaroo_mouse.n.02 rodent.n.01 +papillon.n.01 mammal.n.01 +english_toy_spaniel.n.01 toy_spaniel.n.01 +galloway.n.02 ruminant.n.01 +irish_water_spaniel.n.01 dog.n.01 +mountain_gorilla.n.01 mammal.n.01 +nilgai.n.01 antelope.n.01 +war_admiral.n.01 war_admiral.n.01 +white_wolf.n.01 carnivore.n.01 +belgian_hare.n.01 rabbit.n.01 +hartebeest.n.01 placental.n.01 +feline.n.01 carnivore.n.01 +shih-tzu.n.01 shih-tzu.n.01 +warthog.n.01 even-toed_ungulate.n.01 +silky_pocket_mouse.n.01 silky_pocket_mouse.n.01 +persian_cat.n.01 persian_cat.n.01 +affirmed.n.01 thoroughbred.n.02 +bluetick.n.01 hound.n.01 +cape_buffalo.n.01 even-toed_ungulate.n.01 +old_world_least_weasel.n.01 weasel.n.02 +fur_seal.n.01 placental.n.01 +jumping_mouse.n.01 placental.n.01 +snow_leopard.n.01 mammal.n.01 +mammoth.n.01 placental.n.01 +arctic_fox.n.01 placental.n.01 +pocket_rat.n.01 pocket_rat.n.01 +bassarisk.n.01 bassarisk.n.01 +wirehair.n.01 canine.n.02 +border_terrier.n.01 hunting_dog.n.01 +goat.n.01 ruminant.n.01 +royal.n.02 stag.n.02 +japanese_spaniel.n.01 mammal.n.01 +horse.n.01 horse.n.01 +war_admiral.n.01 horse.n.01 +crab-eating_raccoon.n.01 carnivore.n.01 +lechwe.n.01 placental.n.01 +toy_spaniel.n.01 dog.n.01 +warrigal.n.01 horse.n.01 +tamarau.n.01 ruminant.n.01 +staghound.n.01 dog.n.01 +gerenuk.n.01 mammal.n.01 +fawn.n.02 fawn.n.02 +toy_poodle.n.01 carnivore.n.01 +vole.n.01 rodent.n.01 +quarter_horse.n.01 placental.n.01 +mongoose.n.01 placental.n.01 +warhorse.n.03 warhorse.n.03 +dark_horse.n.02 racehorse.n.01 +black_squirrel.n.01 black_squirrel.n.01 +true_marmoset.n.01 placental.n.01 +rabbit.n.01 mammal.n.01 +manatee.n.01 manatee.n.01 +razorback.n.01 even-toed_ungulate.n.01 +sow.n.01 mammal.n.01 +malinois.n.01 placental.n.01 +old_english_sheepdog.n.01 carnivore.n.01 +hartebeest.n.01 bovid.n.01 +male_horse.n.01 mammal.n.01 +ant_bear.n.01 placental.n.01 +whippet.n.01 canine.n.02 +ord_kangaroo_rat.n.01 placental.n.01 +marmot.n.01 rodent.n.01 +crab-eating_macaque.n.01 monkey.n.01 +great_pyrenees.n.01 mammal.n.01 +secretariat.n.02 odd-toed_ungulate.n.01 +beagle.n.01 canine.n.02 +common_lynx.n.01 lynx.n.02 +hack.n.06 placental.n.01 +paranthropus.n.01 placental.n.01 +workhorse.n.02 horse.n.01 +american_mink.n.01 mammal.n.01 +musteline_mammal.n.01 carnivore.n.01 +homo.n.02 primate.n.02 +collared_pika.n.01 collared_pika.n.01 +african_hunting_dog.n.01 wild_dog.n.01 +puku.n.01 puku.n.01 +silky_terrier.n.01 hunting_dog.n.01 +irish_wolfhound.n.01 irish_wolfhound.n.01 +nyala.n.02 bovid.n.01 +snake_muishond.n.01 mammal.n.01 +appenzeller.n.01 working_dog.n.01 +thomson's_gazelle.n.01 bovid.n.01 +ichneumon.n.01 mongoose.n.01 +african_wild_ass.n.01 odd-toed_ungulate.n.01 +hackney.n.02 placental.n.01 +toy_manchester.n.01 canine.n.02 +caribou.n.01 caribou.n.01 +carthorse.n.01 mammal.n.01 +ibex.n.01 bovid.n.01 +woolly_mammoth.n.01 pachyderm.n.01 +cryptoprocta.n.01 placental.n.01 +australian_terrier.n.01 carnivore.n.01 +three-year-old_horse.n.01 mammal.n.01 +water_chevrotain.n.01 mammal.n.01 +chinchilla.n.03 chinchilla.n.03 +old_world_buffalo.n.01 old_world_buffalo.n.01 +przewalski's_horse.n.01 odd-toed_ungulate.n.01 +yearling.n.02 odd-toed_ungulate.n.01 +woodland_caribou.n.01 caribou.n.01 +jackass_bat.n.01 bat.n.01 +entlebucher.n.01 working_dog.n.01 +common_shrew.n.01 insectivore.n.01 +stud.n.04 placental.n.01 +pika.n.01 lagomorph.n.01 +harnessed_antelope.n.01 antelope.n.01 +courser.n.03 hunting_dog.n.01 +pilot_whale.n.01 pilot_whale.n.01 +entellus.n.01 entellus.n.01 +lippizan.n.01 saddle_horse.n.01 +common_zebra.n.01 ungulate.n.01 +lapin.n.02 leporid.n.01 +capuchin.n.02 mammal.n.01 +marmot.n.01 mammal.n.01 +badger.n.02 mammal.n.01 +titi.n.03 new_world_monkey.n.01 +brahman.n.04 ruminant.n.01 +greater_pichiciego.n.01 placental.n.01 +boston_bull.n.01 dog.n.01 +angora.n.03 lagomorph.n.01 +giant_eland.n.01 ungulate.n.01 +fissiped_mammal.n.01 placental.n.01 +aardwolf.n.01 hyena.n.01 +barbary_ape.n.01 placental.n.01 +lemming.n.01 mammal.n.01 +schnauzer.n.01 hunting_dog.n.01 +crab-eating_raccoon.n.01 crab-eating_raccoon.n.01 +red_bat.n.01 placental.n.01 +wisent.n.01 even-toed_ungulate.n.01 +chow.n.03 chow.n.03 +american_badger.n.01 badger.n.02 +yak.n.02 ruminant.n.01 +cavy.n.01 mammal.n.01 +water_buffalo.n.01 mammal.n.01 +woolly_monkey.n.01 mammal.n.01 +shire.n.02 shire.n.02 +bull.n.01 cattle.n.01 +entellus.n.01 mammal.n.01 +old_english_sheepdog.n.01 old_english_sheepdog.n.01 +meadow_jumping_mouse.n.01 placental.n.01 +eastern_grey_squirrel.n.01 rodent.n.01 +long-eared_bat.n.01 bat.n.01 +spitz.n.01 mammal.n.01 +komondor.n.01 working_dog.n.01 +cave_myotis.n.01 cave_myotis.n.01 +chesapeake_bay_retriever.n.01 hunting_dog.n.01 +spider_monkey.n.01 new_world_monkey.n.01 +kit_fox.n.02 mammal.n.01 +urial.n.01 mammal.n.01 +silky_anteater.n.01 anteater.n.02 +big-eared_bat.n.01 false_vampire.n.01 +bovine.n.01 ungulate.n.01 +irish_setter.n.01 sporting_dog.n.01 +pangolin.n.01 mammal.n.01 +warthog.n.01 ungulate.n.01 +kangaroo_rat.n.01 mammal.n.01 +count_fleet.n.01 ungulate.n.01 +toy_poodle.n.01 poodle.n.01 +indian_buffalo.n.01 old_world_buffalo.n.01 +giant_panda.n.01 carnivore.n.01 +entellus.n.01 primate.n.02 +jackal.n.01 canine.n.02 +gelding.n.01 equine.n.01 +australopithecus_africanus.n.01 hominid.n.01 +coondog.n.01 canine.n.02 +taguan.n.01 squirrel.n.01 +horse.n.01 odd-toed_ungulate.n.01 +afghan_hound.n.01 hunting_dog.n.01 +mediterranean_water_shrew.n.01 mediterranean_water_shrew.n.01 +king_charles_spaniel.n.01 toy_dog.n.01 +mylodon.n.01 mammal.n.01 +arabian.n.02 placental.n.01 +spider_monkey.n.01 primate.n.02 +valley_pocket_gopher.n.01 mammal.n.01 +pomeranian.n.01 dog.n.01 +hereford.n.01 hereford.n.01 +bruin.n.01 carnivore.n.01 +gaur.n.01 bovid.n.01 +retriever.n.01 dog.n.01 +pacer.n.01 racehorse.n.01 +tasmanian_devil.n.01 mammal.n.01 +cinnamon_bear.n.01 mammal.n.01 +mouflon.n.01 mammal.n.01 +africander.n.01 bovine.n.01 +mudder.n.01 odd-toed_ungulate.n.01 +ferret.n.02 polecat.n.02 +water_vole.n.02 water_vole.n.02 +king_charles_spaniel.n.01 carnivore.n.01 +briard.n.01 mammal.n.01 +milking_shorthorn.n.01 bovine.n.01 +mare.n.01 ungulate.n.01 +cur.n.01 dog.n.01 +mountain_gorilla.n.01 mountain_gorilla.n.01 +pied_lemming.n.01 mammal.n.01 +wolfhound.n.01 hound.n.01 +pygmy_chimpanzee.n.01 pygmy_chimpanzee.n.01 +shetland_pony.n.01 ungulate.n.01 +whippet.n.01 mammal.n.01 +manchester_terrier.n.01 placental.n.01 +greater_swiss_mountain_dog.n.01 dog.n.01 +two-toed_sloth.n.02 two-toed_sloth.n.02 +domestic_goat.n.01 goat.n.01 +common_wallaby.n.01 metatherian.n.01 +eastern_grey_squirrel.n.01 squirrel.n.01 +american_saddle_horse.n.01 equine.n.01 +vicuna.n.03 placental.n.01 +grevy's_zebra.n.01 placental.n.01 +ermine.n.02 weasel.n.02 +jumping_mouse.n.01 rodent.n.01 +south_american_sea_lion.n.01 seal.n.09 +boskop_man.n.01 placental.n.01 +gayal.n.01 bovine.n.01 +seeing_eye_dog.n.01 dog.n.01 +aperea.n.01 mammal.n.01 +bay.n.07 equine.n.01 +shetland_pony.n.01 mammal.n.01 +quagga.n.01 odd-toed_ungulate.n.01 +brown_bat.n.01 placental.n.01 +hispid_pocket_mouse.n.01 rat.n.01 +komondor.n.01 shepherd_dog.n.01 +fur_seal.n.01 seal.n.09 +bullterrier.n.01 mammal.n.01 +greater_swiss_mountain_dog.n.01 sennenhunde.n.01 +miniature_poodle.n.01 miniature_poodle.n.01 +wood_mouse.n.01 placental.n.01 +american_mink.n.01 musteline_mammal.n.01 +opossum_rat.n.01 mammal.n.01 +persian_cat.n.01 cat.n.01 +pithecanthropus.n.01 primate.n.02 +saluki.n.01 hound.n.01 +bactrian_camel.n.01 ungulate.n.01 +packhorse.n.01 placental.n.01 +european_wildcat.n.01 cat.n.01 +aurochs.n.02 aurochs.n.02 +cat.n.01 feline.n.01 +devon.n.02 bovid.n.01 +homo_erectus.n.01 primate.n.02 +large_poodle.n.01 poodle.n.01 +gerenuk.n.01 ungulate.n.01 +chevrotain.n.01 even-toed_ungulate.n.01 +striped_muishond.n.01 carnivore.n.01 +shire.n.02 placental.n.01 +tamandua.n.01 edentate.n.01 +mouflon.n.01 wild_sheep.n.01 +bighorn.n.02 wild_sheep.n.01 +nilgai.n.01 even-toed_ungulate.n.01 +kid.n.05 goat.n.01 +toy_terrier.n.01 carnivore.n.01 +skye_terrier.n.01 canine.n.02 +killer_whale.n.01 whale.n.02 +red_squirrel.n.02 squirrel.n.01 +babirusa.n.01 babirusa.n.01 +western_chimpanzee.n.01 ape.n.01 +squirrel_monkey.n.01 placental.n.01 +water_dog.n.02 carnivore.n.01 +gemsbok.n.01 gemsbok.n.01 +lincoln.n.03 placental.n.01 +unguiculata.n.01 placental.n.01 +giant_armadillo.n.01 giant_armadillo.n.01 +palomino.n.01 palomino.n.01 +smiledon_californicus.n.01 smiledon_californicus.n.01 +ground_sloth.n.01 ground_sloth.n.01 +suslik.n.01 suslik.n.01 +scottish_deerhound.n.01 scottish_deerhound.n.01 +seeing_eye_dog.n.01 guide_dog.n.01 +long-eared_bat.n.01 long-eared_bat.n.01 +wisent.n.01 bison.n.01 +northern_pocket_gopher.n.01 mammal.n.01 +sealyham_terrier.n.01 canine.n.02 +ice_bear.n.01 placental.n.01 +talapoin.n.01 old_world_monkey.n.01 +mountain_zebra.n.01 mammal.n.01 +toy_dog.n.01 placental.n.01 +exmoor.n.01 exmoor.n.01 +bandicoot_rat.n.01 mammal.n.01 +smiledon_californicus.n.01 feline.n.01 +otterhound.n.01 placental.n.01 +java_man.n.01 placental.n.01 +atlantic_bottlenose_dolphin.n.01 placental.n.01 +wild_ass.n.01 mammal.n.01 +western_lowland_gorilla.n.01 western_lowland_gorilla.n.01 +hound.n.01 carnivore.n.01 +mylodontid.n.01 edentate.n.01 +raccoon.n.02 placental.n.01 +glutton.n.02 musteline_mammal.n.01 +pine_marten.n.01 mammal.n.01 +sausage_dog.n.01 dog.n.01 +bowhead.n.01 whale.n.02 +peking_man.n.01 homo.n.02 +toy_poodle.n.01 canine.n.02 +dik-dik.n.01 antelope.n.01 +hominoid.n.01 mammal.n.01 +peludo.n.01 mammal.n.01 +brush-tailed_phalanger.n.01 marsupial.n.01 +mouser.n.01 feline.n.01 +livestock.n.01 mammal.n.01 +plains_pocket_mouse.n.01 pocket_rat.n.01 +crab-eating_raccoon.n.01 placental.n.01 +spouter.n.03 whale.n.02 +hinny.n.01 ungulate.n.01 +barren_ground_caribou.n.01 mammal.n.01 +tailless_tenrec.n.01 insectivore.n.01 +angora.n.04 angora.n.04 +zebu.n.01 mammal.n.01 +workhorse.n.02 odd-toed_ungulate.n.01 +carabao.n.01 bovid.n.01 +abyssinian.n.01 placental.n.01 +tom.n.02 carnivore.n.01 +wirehair.n.01 carnivore.n.01 +brown_lemming.n.01 brown_lemming.n.01 +pariah_dog.n.01 mammal.n.01 +clumber.n.01 clumber.n.01 +sussex_spaniel.n.01 spaniel.n.01 +grasshopper_mouse.n.01 mammal.n.01 +hog_badger.n.01 carnivore.n.01 +asiatic_shrew_mole.n.01 placental.n.01 +stone_marten.n.01 mammal.n.01 +groundhog.n.01 groundhog.n.01 +western_chimpanzee.n.01 primate.n.02 +napu.n.01 ruminant.n.01 +heifer.n.01 ungulate.n.01 +malamute.n.01 dog.n.01 +western_pipistrel.n.01 vespertilian_bat.n.01 +sable.n.05 musteline_mammal.n.01 +palfrey.n.01 ungulate.n.01 +spotted_lynx.n.01 carnivore.n.01 +dwarf_sperm_whale.n.01 toothed_whale.n.01 +pomeranian.n.01 placental.n.01 +bighorn.n.02 mammal.n.01 +scottish_deerhound.n.01 canine.n.02 +tree_wallaby.n.01 wallaby.n.01 +shire.n.02 mammal.n.01 +eared_seal.n.01 pinniped_mammal.n.01 +blacktail_jackrabbit.n.01 jackrabbit.n.01 +griffon.n.03 carnivore.n.01 +viverrine.n.01 carnivore.n.01 +pentail.n.01 mammal.n.01 +homo_sapiens.n.01 homo_sapiens.n.01 +big-eared_bat.n.01 carnivorous_bat.n.01 +lemming.n.01 lemming.n.01 +pollard.n.02 pollard.n.02 +aberdeen_angus.n.01 aberdeen_angus.n.01 +hyena.n.01 hyena.n.01 +manx.n.02 carnivore.n.01 +sir_barton.n.01 placental.n.01 +schipperke.n.01 working_dog.n.01 +smiledon_californicus.n.01 saber-toothed_tiger.n.01 +civet.n.01 carnivore.n.01 +plow_horse.n.01 workhorse.n.02 +elephant.n.01 mammal.n.01 +pinche.n.01 monkey.n.01 +rhodesian_man.n.01 homo.n.02 +suslik.n.01 placental.n.01 +harbor_porpoise.n.01 mammal.n.01 +hyrax.n.01 placental.n.01 +scottish_deerhound.n.01 hunting_dog.n.01 +fossorial_mammal.n.01 fossorial_mammal.n.01 +percheron.n.01 draft_horse.n.01 +french_bulldog.n.01 french_bulldog.n.01 +borzoi.n.01 dog.n.01 +farm_horse.n.01 workhorse.n.02 +valley_pocket_gopher.n.01 gopher.n.04 +addax.n.01 ruminant.n.01 +aberdeen_angus.n.01 bovid.n.01 +puku.n.01 antelope.n.01 +sable_antelope.n.01 antelope.n.01 +new_world_porcupine.n.01 porcupine.n.01 +lesser_kudu.n.01 antelope.n.01 +spaniel.n.01 placental.n.01 +sennenhunde.n.01 mammal.n.01 +canada_porcupine.n.01 rodent.n.01 +omaha.n.04 thoroughbred.n.02 +papillon.n.01 dog.n.01 +wether.n.01 mammal.n.01 +sausage_dog.n.01 canine.n.02 +toy_poodle.n.01 dog.n.01 +marsh_hare.n.01 placental.n.01 +right_whale.n.01 baleen_whale.n.01 +valley_pocket_gopher.n.01 rodent.n.01 +southeastern_pocket_gopher.n.01 gopher.n.04 +irish_terrier.n.01 canine.n.02 +pygmy_marmoset.n.01 marmoset.n.01 +porpoise.n.01 toothed_whale.n.01 +black-and-tan_coonhound.n.01 carnivore.n.01 +arabian_camel.n.01 ungulate.n.01 +antelope_squirrel.n.01 mammal.n.01 +beagle.n.01 placental.n.01 +australopithecine.n.01 hominid.n.01 +dormouse.n.01 rodent.n.01 +tortoiseshell.n.03 carnivore.n.01 +exmoor.n.01 domestic_sheep.n.01 +milking_shorthorn.n.01 ungulate.n.01 +onager.n.02 mammal.n.01 +south_american_sea_lion.n.01 pinniped_mammal.n.01 +leafnose_bat.n.01 leafnose_bat.n.01 +charger.n.01 mammal.n.01 +quarter_horse.n.01 quarter_horse.n.01 +sand_rat.n.01 sand_rat.n.01 +basset.n.01 mammal.n.01 +new_world_tapir.n.01 odd-toed_ungulate.n.01 +jaguarundi.n.01 mammal.n.01 +coyote.n.01 placental.n.01 +american_red_squirrel.n.01 squirrel.n.01 +miniature_schnauzer.n.01 schnauzer.n.01 +hedgehog.n.02 mammal.n.01 +woolly_mammoth.n.01 mammal.n.01 +cob.n.02 ungulate.n.01 +rottweiler.n.01 dog.n.01 +otterhound.n.01 hound.n.01 +fisher.n.02 fisher.n.02 +buckskin.n.01 odd-toed_ungulate.n.01 +kangaroo.n.01 kangaroo.n.01 +lesser_ape.n.01 placental.n.01 +roebuck.n.01 ruminant.n.01 +black-and-tan_coonhound.n.01 placental.n.01 +yearling.n.03 mammal.n.01 +pteropus_capestratus.n.01 mammal.n.01 +secretariat.n.02 thoroughbred.n.02 +pony.n.05 horse.n.01 +shire.n.02 horse.n.01 +tibetan_mastiff.n.01 mammal.n.01 +tortoiseshell.n.03 domestic_cat.n.01 +rat_kangaroo.n.01 rat_kangaroo.n.01 +cetacean.n.01 mammal.n.01 +gordon_setter.n.01 gordon_setter.n.01 +labrador_retriever.n.01 carnivore.n.01 +american_foxhound.n.01 foxhound.n.01 +asian_wild_ox.n.01 bovid.n.01 +jerboa_rat.n.01 mammal.n.01 +kelpie.n.02 mammal.n.01 +pole_horse.n.02 draft_horse.n.01 +bull.n.01 bovine.n.01 +tamarisk_gerbil.n.01 rodent.n.01 +packhorse.n.01 workhorse.n.02 +kob.n.01 antelope.n.01 +mole.n.06 placental.n.01 +guenon.n.01 placental.n.01 +beagle.n.01 dog.n.01 +baronduki.n.01 squirrel.n.01 +brood_bitch.n.01 mammal.n.01 +sled_dog.n.01 canine.n.02 +sloth_bear.n.01 sloth_bear.n.01 +griffon.n.02 carnivore.n.01 +guano_bat.n.01 mammal.n.01 +bighorn.n.02 even-toed_ungulate.n.01 +sable.n.05 placental.n.01 +cheviot.n.01 placental.n.01 +deer.n.01 even-toed_ungulate.n.01 +lesser_kudu.n.01 bovid.n.01 +stablemate.n.01 mammal.n.01 +common_lynx.n.01 carnivore.n.01 +sassaby.n.01 ungulate.n.01 +bulldog.n.01 mammal.n.01 +spotted_lynx.n.01 feline.n.01 +three-toed_sloth.n.01 sloth.n.02 +swamp_rabbit.n.02 swamp_rabbit.n.02 +samoyed.n.03 dog.n.01 +forest_goat.n.01 forest_goat.n.01 +muntjac.n.01 even-toed_ungulate.n.01 +paca.n.01 paca.n.01 +long-eared_bat.n.01 placental.n.01 +ape.n.01 primate.n.02 +broodmare.n.01 mare.n.01 +zebu.n.01 even-toed_ungulate.n.01 +aoudad.n.01 bovid.n.01 +smooth-haired_fox_terrier.n.01 fox_terrier.n.01 +lechwe.n.01 waterbuck.n.01 +tabby.n.02 placental.n.01 +weimaraner.n.01 dog.n.01 +gib.n.02 placental.n.01 +broodmare.n.01 mammal.n.01 +mountain_gorilla.n.01 great_ape.n.01 +angora.n.02 ruminant.n.01 +brush-tailed_porcupine.n.01 rodent.n.01 +australopithecus_africanus.n.01 placental.n.01 +bonnet_macaque.n.01 old_world_monkey.n.01 +pygmy_chimpanzee.n.01 ape.n.01 +echidna.n.01 monotreme.n.01 +pacer.n.02 mammal.n.01 +trotting_horse.n.01 placental.n.01 +old_english_sheepdog.n.01 canine.n.02 +scotch_terrier.n.01 hunting_dog.n.01 +wheel_horse.n.01 wheel_horse.n.01 +woolly_indris.n.01 lemur.n.01 +eurasian_hamster.n.01 eurasian_hamster.n.01 +dachshund.n.01 placental.n.01 +cheetah.n.01 mammal.n.01 +tailless_tenrec.n.01 tailless_tenrec.n.01 +arctic_fox.n.01 mammal.n.01 +jack.n.12 mammal.n.01 +tom.n.02 tom.n.02 +english_springer.n.01 canine.n.02 +rabbit_ears.n.02 placental.n.01 +eurasian_badger.n.01 mammal.n.01 +norwegian_elkhound.n.01 canine.n.02 +guadalupe_fur_seal.n.01 pinniped_mammal.n.01 +red_squirrel.n.02 rodent.n.01 +southern_flying_squirrel.n.01 squirrel.n.01 +california_sea_lion.n.01 pinniped_mammal.n.01 +aye-aye.n.01 lemur.n.01 +red_bat.n.01 carnivorous_bat.n.01 +citation.n.06 odd-toed_ungulate.n.01 +liver-spotted_dalmatian.n.01 carnivore.n.01 +longhorn.n.01 placental.n.01 +longwool.n.01 sheep.n.01 +mountain_paca.n.01 mountain_paca.n.01 +steed.n.01 horse.n.01 +entlebucher.n.01 placental.n.01 +tabby.n.01 cat.n.01 +atlantic_bottlenose_dolphin.n.01 bottlenose_dolphin.n.01 +rhesus.n.01 macaque.n.01 +bovine.n.01 placental.n.01 +bernese_mountain_dog.n.01 mammal.n.01 +collared_peccary.n.01 mammal.n.01 +crowbait.n.01 equine.n.01 +attack_dog.n.01 attack_dog.n.01 +old_world_monkey.n.01 mammal.n.01 +ungulata.n.01 ungulata.n.01 +hog_badger.n.01 musteline_mammal.n.01 +lagomorph.n.01 mammal.n.01 +coonhound.n.01 mammal.n.01 +liver-spotted_dalmatian.n.01 mammal.n.01 +takin.n.01 even-toed_ungulate.n.01 +cynopterus_sphinx.n.01 placental.n.01 +ord_kangaroo_rat.n.01 mammal.n.01 +chihuahua.n.03 toy_dog.n.01 +common_lynx.n.01 mammal.n.01 +dinocerate.n.01 ungulate.n.01 +indian_buffalo.n.01 even-toed_ungulate.n.01 +boarhound.n.01 canine.n.02 +dark_horse.n.02 mammal.n.01 +pointer.n.04 carnivore.n.01 +west_highland_white_terrier.n.01 dog.n.01 +afghan_hound.n.01 dog.n.01 +lippizan.n.01 ungulate.n.01 +red_wolf.n.01 mammal.n.01 +southeastern_pocket_gopher.n.01 placental.n.01 +australopithecus_boisei.n.01 mammal.n.01 +common_eland.n.01 bovid.n.01 +wildcat.n.03 cat.n.01 +arabian_camel.n.01 mammal.n.01 +polecat.n.02 musteline_mammal.n.01 +big-eared_bat.n.01 bat.n.01 +bovid.n.01 even-toed_ungulate.n.01 +guide_dog.n.01 canine.n.02 +hyena.n.01 placental.n.01 +longtail_weasel.n.01 mammal.n.01 +chamois.n.02 placental.n.01 +striped_hyena.n.01 canine.n.02 +pocketed_bat.n.01 mammal.n.01 +attack_dog.n.01 dog.n.01 +leopard_cat.n.01 wildcat.n.03 +cotswold.n.01 placental.n.01 +pine_marten.n.01 placental.n.01 +hominoid.n.01 placental.n.01 +suricate.n.01 meerkat.n.01 +stirk.n.01 ungulate.n.01 +mediterranean_water_shrew.n.01 water_shrew.n.01 +rice_rat.n.01 rice_rat.n.01 +homo_erectus.n.01 homo.n.02 +sea_otter.n.01 carnivore.n.01 +indian_mongoose.n.01 carnivore.n.01 +banded_palm_civet.n.01 civet.n.01 +cape_buffalo.n.01 ruminant.n.01 +razorback.n.01 mammal.n.01 +sow.n.01 even-toed_ungulate.n.01 +mountain_zebra.n.01 placental.n.01 +hunting_dog.n.01 dog.n.01 +proconsul.n.03 proconsul.n.03 +mylodon.n.01 mylodon.n.01 +slender-tailed_meerkat.n.01 meerkat.n.01 +sambar.n.01 deer.n.01 +hog-nosed_skunk.n.01 carnivore.n.01 +rock_wallaby.n.01 wallaby.n.01 +mountain_nyala.n.01 mountain_nyala.n.01 +polo_pony.n.01 equine.n.01 +ox.n.02 bovine.n.01 +wood_rabbit.n.01 leporid.n.01 +lippizan.n.01 lippizan.n.01 +sir_barton.n.01 thoroughbred.n.02 +burmese_cat.n.01 domestic_cat.n.01 +burro.n.01 burro.n.01 +angwantibo.n.01 primate.n.02 +miniature_pinscher.n.01 working_dog.n.01 +sporting_dog.n.01 sporting_dog.n.01 +blue_whale.n.01 aquatic_mammal.n.01 +australopithecus_africanus.n.01 australopithecine.n.01 +sealyham_terrier.n.01 mammal.n.01 +simian.n.01 primate.n.02 +pine_marten.n.01 carnivore.n.01 +fox_terrier.n.01 carnivore.n.01 +mandrill.n.01 old_world_monkey.n.01 +steller's_sea_cow.n.01 mammal.n.01 +opossum.n.02 mammal.n.01 +shetland_sheepdog.n.01 shepherd_dog.n.01 +california_sea_lion.n.01 sea_lion.n.01 +silverback.n.01 ape.n.01 +old_world_buffalo.n.01 mammal.n.01 +snowshoe_hare.n.01 mammal.n.01 +brown_swiss.n.01 even-toed_ungulate.n.01 +urial.n.01 even-toed_ungulate.n.01 +rat_terrier.n.01 carnivore.n.01 +afghan_hound.n.01 carnivore.n.01 +tarpan.n.01 ungulate.n.01 +snow_leopard.n.01 feline.n.01 +hack.n.08 equine.n.01 +hog_badger.n.01 badger.n.02 +west_highland_white_terrier.n.01 canine.n.02 +muntjac.n.01 ungulate.n.01 +palfrey.n.01 saddle_horse.n.01 +otterhound.n.01 carnivore.n.01 +arctic_ground_squirrel.n.01 placental.n.01 +alaska_fur_seal.n.01 eared_seal.n.01 +irish_water_spaniel.n.01 placental.n.01 +golden_retriever.n.01 mammal.n.01 +shepherd_dog.n.01 dog.n.01 +kudu.n.01 antelope.n.01 +golden_retriever.n.01 dog.n.01 +eastern_pipistrel.n.01 vespertilian_bat.n.01 +macrotus.n.01 placental.n.01 +borzoi.n.01 carnivore.n.01 +jackass_bat.n.01 carnivorous_bat.n.01 +chesapeake_bay_retriever.n.01 carnivore.n.01 +common_dolphin.n.01 toothed_whale.n.01 +south_american_sea_lion.n.01 sea_lion.n.01 +welsh.n.03 mammal.n.01 +goat.n.01 ungulate.n.01 +anoa.n.01 old_world_buffalo.n.01 +roan.n.02 odd-toed_ungulate.n.01 +guadalupe_fur_seal.n.01 guadalupe_fur_seal.n.01 +round-tailed_muskrat.n.01 rodent.n.01 +burmese_cat.n.01 mammal.n.01 +hudson_bay_collared_lemming.n.01 lemming.n.01 +drill.n.02 primate.n.02 +springer.n.02 bovine.n.01 +bettong.n.01 bettong.n.01 +african_wild_ass.n.01 african_wild_ass.n.01 +persian_cat.n.01 feline.n.01 +affirmed.n.01 ungulate.n.01 +american_flying_squirrel.n.01 placental.n.01 +ichneumon.n.01 ichneumon.n.01 +western_chimpanzee.n.01 western_chimpanzee.n.01 +courser.n.03 courser.n.03 +european_wildcat.n.01 placental.n.01 +great_pyrenees.n.01 carnivore.n.01 +shetland_sheepdog.n.01 shetland_sheepdog.n.01 +mule_deer.n.01 ruminant.n.01 +groundhog.n.01 marmot.n.01 +redbone.n.01 hunting_dog.n.01 +sassaby.n.01 placental.n.01 +nanny.n.02 goat.n.01 +flickertail.n.01 mammal.n.01 +milking_shorthorn.n.01 dairy_cattle.n.01 +farm_horse.n.01 placental.n.01 +springer_spaniel.n.01 mammal.n.01 +musk_ox.n.01 mammal.n.01 +thoroughbred.n.02 odd-toed_ungulate.n.01 +water_vole.n.02 placental.n.01 +striped_skunk.n.01 musteline_mammal.n.01 +black_sheep.n.02 ruminant.n.01 +fur_seal.n.01 eared_seal.n.01 +puku.n.01 mammal.n.01 +crab-eating_dog.n.01 wild_dog.n.01 +bobcat.n.01 feline.n.01 +green_monkey.n.01 mammal.n.01 +earless_seal.n.01 mammal.n.01 +marco_polo_sheep.n.01 placental.n.01 +chiacoan_peccary.n.01 even-toed_ungulate.n.01 +sand_rat.n.02 mammal.n.01 +phenacomys.n.01 placental.n.01 +carnivorous_bat.n.01 bat.n.01 +okapi.n.01 mammal.n.01 +shetland_sheepdog.n.01 working_dog.n.01 +seattle_slew.n.01 placental.n.01 +rabbit_ears.n.02 leporid.n.01 +false_saber-toothed_tiger.n.01 placental.n.01 +bull.n.01 even-toed_ungulate.n.01 +domestic_cat.n.01 feline.n.01 +clydesdale_terrier.n.01 skye_terrier.n.01 +gayal.n.01 even-toed_ungulate.n.01 +brown_bat.n.01 bat.n.01 +spouter.n.03 placental.n.01 +livestock.n.01 livestock.n.01 +harp_seal.n.01 harp_seal.n.01 +pooch.n.01 mammal.n.01 +seizure-alert_dog.n.01 carnivore.n.01 +pocket_mouse.n.01 mammal.n.01 +jerboa.n.01 placental.n.01 +australopithecus_afarensis.n.01 hominid.n.01 +mudder.n.01 horse.n.01 +alaskan_brown_bear.n.01 bear.n.01 +european_wildcat.n.01 mammal.n.01 +brush-tailed_phalanger.n.01 brush-tailed_phalanger.n.01 +cow_pony.n.01 saddle_horse.n.01 +cougar.n.01 feline.n.01 +bovid.n.01 ungulate.n.01 +naked_mole_rat.n.01 fossorial_mammal.n.01 +coyote.n.01 coyote.n.01 +domestic_ass.n.01 ass.n.03 +wild_goat.n.01 placental.n.01 +binturong.n.01 placental.n.01 +western_big-eared_bat.n.01 western_big-eared_bat.n.01 +little_brown_bat.n.01 carnivorous_bat.n.01 +thomson's_gazelle.n.01 ungulate.n.01 +jerboa_kangaroo.n.01 marsupial.n.01 +atlantic_bottlenose_dolphin.n.01 cetacean.n.01 +woolly_indris.n.01 primate.n.02 +ox.n.01 bovid.n.01 +setter.n.02 placental.n.01 +grizzly.n.01 placental.n.01 +babirusa.n.01 even-toed_ungulate.n.01 +deer_mouse.n.01 rodent.n.01 +western_lowland_gorilla.n.01 ape.n.01 +lakeland_terrier.n.01 wirehair.n.01 +bengal_tiger.n.01 mammal.n.01 +horseshoe_bat.n.02 mammal.n.01 +gordon_setter.n.01 dog.n.01 +racehorse.n.01 odd-toed_ungulate.n.01 +blue_fox.n.01 carnivore.n.01 +pygmy_sperm_whale.n.01 placental.n.01 +even-toed_ungulate.n.01 placental.n.01 +homo_sapiens.n.01 hominid.n.01 +crab-eating_opossum.n.01 opossum.n.02 +colobus.n.01 colobus.n.01 +gerenuk.n.01 even-toed_ungulate.n.01 +bovid.n.01 ruminant.n.01 +leonberg.n.01 mammal.n.01 +water_vole.n.01 mammal.n.01 +irish_setter.n.01 setter.n.02 +marsh_hare.n.01 wood_rabbit.n.01 +seal.n.09 placental.n.01 +rhesus.n.01 primate.n.02 +beagle.n.01 hunting_dog.n.01 +heifer.n.01 heifer.n.01 +wood_mouse.n.01 rodent.n.01 +toy_spaniel.n.01 placental.n.01 +brabancon_griffon.n.01 griffon.n.02 +mangabey.n.01 mammal.n.01 +peludo.n.01 armadillo.n.01 +paranthropus.n.01 hominid.n.01 +lioness.n.01 mammal.n.01 +tree_wallaby.n.01 marsupial.n.01 +aberdeen_angus.n.01 cattle.n.01 +silky_terrier.n.01 canine.n.02 +unguiculate.n.01 unguiculate.n.01 +shih-tzu.n.01 carnivore.n.01 +abrocome.n.01 placental.n.01 +eastern_grey_squirrel.n.01 tree_squirrel.n.01 +ibex.n.01 ibex.n.01 +barbary_ape.n.01 barbary_ape.n.01 +mole_rat.n.02 mole_rat.n.02 +ox.n.02 mammal.n.01 +western_big-eared_bat.n.01 placental.n.01 +rhesus.n.01 mammal.n.01 +kuvasz.n.01 mammal.n.01 +sand_rat.n.02 placental.n.01 +sled_dog.n.01 placental.n.01 +pony.n.02 mammal.n.01 +west_highland_white_terrier.n.01 carnivore.n.01 +bitch.n.04 mammal.n.01 +hearing_dog.n.01 working_dog.n.01 +eohippus.n.01 odd-toed_ungulate.n.01 +false_saber-toothed_tiger.n.01 saber-toothed_tiger.n.01 +roe_deer.n.01 ruminant.n.01 +border_terrier.n.01 carnivore.n.01 +wild_goat.n.01 ruminant.n.01 +airedale.n.01 dog.n.01 +count_fleet.n.01 mammal.n.01 +malinois.n.01 dog.n.01 +mastiff.n.01 placental.n.01 +plow_horse.n.01 mammal.n.01 +guernsey.n.02 ungulate.n.01 +coach_horse.n.01 equine.n.01 +chamois.n.02 ungulate.n.01 +coondog.n.01 mammal.n.01 +appaloosa.n.01 mammal.n.01 +housedog.n.01 working_dog.n.01 +spotted_lynx.n.01 lynx.n.02 +domestic_sheep.n.01 ruminant.n.01 +small_civet.n.01 civet.n.01 +warthog.n.01 warthog.n.01 +gazelle.n.01 ungulate.n.01 +collie.n.01 placental.n.01 +roan.n.02 roan.n.02 +hart.n.03 ungulate.n.01 +briard.n.01 working_dog.n.01 +tiger.n.02 feline.n.01 +miniature_pinscher.n.01 canine.n.02 +pipistrelle.n.01 pipistrelle.n.01 +river_otter.n.01 mammal.n.01 +napu.n.01 napu.n.01 +redbone.n.01 redbone.n.01 +otter.n.02 otter.n.02 +dugong.n.01 mammal.n.01 +tarsier.n.01 primate.n.02 +alley_cat.n.01 domestic_cat.n.01 +northern_pocket_gopher.n.01 rodent.n.01 +african_wild_ass.n.01 ass.n.03 +sled_dog.n.01 dog.n.01 +columbian_mammoth.n.01 mammal.n.01 +plow_horse.n.01 odd-toed_ungulate.n.01 +european_water_shrew.n.01 shrew.n.02 +milking_shorthorn.n.01 even-toed_ungulate.n.01 +anteater.n.02 mammal.n.01 +standard_poodle.n.01 poodle.n.01 +great_pyrenees.n.01 canine.n.02 +tamandua.n.01 placental.n.01 +grade.n.09 grade.n.09 +harbor_porpoise.n.01 placental.n.01 +right_whale.n.01 whale.n.02 +crab-eating_dog.n.01 canine.n.02 +muntjac.n.01 ruminant.n.01 +tiglon.n.01 mammal.n.01 +cotton_rat.n.01 mammal.n.01 +ibex.n.01 ungulate.n.01 +california_sea_lion.n.01 seal.n.09 +rhodesian_man.n.01 hominid.n.01 +bezoar_goat.n.01 placental.n.01 +stone_marten.n.01 marten.n.01 +exmoor.n.01 placental.n.01 +monkey.n.01 monkey.n.01 +pricket.n.02 deer.n.01 +field_mouse.n.02 field_mouse.n.02 +western_chimpanzee.n.01 anthropoid_ape.n.01 +pithecanthropus.n.01 mammal.n.01 +kaffir_cat.n.01 feline.n.01 +broadtail.n.02 ungulate.n.01 +siberian_husky.n.01 canine.n.02 +hamster.n.01 hamster.n.01 +wild_horse.n.01 placental.n.01 +harbor_porpoise.n.01 aquatic_mammal.n.01 +liver-spotted_dalmatian.n.01 canine.n.02 +rabbit_ears.n.02 rabbit_ears.n.02 +belgian_sheepdog.n.01 belgian_sheepdog.n.01 +aurochs.n.02 bovine.n.01 +drill.n.02 mammal.n.01 +hog-nosed_skunk.n.01 placental.n.01 +assault.n.03 mammal.n.01 +harnessed_antelope.n.01 ungulate.n.01 +aperea.n.01 rodent.n.01 +ewe.n.03 bovid.n.01 +drill.n.02 old_world_monkey.n.01 +racehorse.n.01 mammal.n.01 +pony.n.01 equine.n.01 +toy_manchester.n.01 terrier.n.01 +pocket_mouse.n.01 pocket_mouse.n.01 +abyssinian.n.01 cat.n.01 +kudu.n.01 even-toed_ungulate.n.01 +cat.n.01 mammal.n.01 +green_monkey.n.01 green_monkey.n.01 +gazella_subgutturosa.n.01 ungulate.n.01 +wild_sheep.n.01 mammal.n.01 +affenpinscher.n.01 dog.n.01 +musk_deer.n.01 mammal.n.01 +barren_ground_caribou.n.01 deer.n.01 +mangabey.n.01 mangabey.n.01 +cavy.n.01 placental.n.01 +tiger_cat.n.01 feline.n.01 +bulldog.n.01 bulldog.n.01 +hereford.n.01 placental.n.01 +japanese_deer.n.01 placental.n.01 +norfolk_terrier.n.01 hunting_dog.n.01 +citation.n.06 equine.n.01 +tree_squirrel.n.01 squirrel.n.01 +jennet.n.01 ass.n.03 +whippet.n.01 hunting_dog.n.01 +packhorse.n.01 ungulate.n.01 +phenacomys.n.01 rodent.n.01 +domestic_sheep.n.01 even-toed_ungulate.n.01 +gordon_setter.n.01 hunting_dog.n.01 +humpback.n.03 placental.n.01 +serval.n.01 feline.n.01 +water_chevrotain.n.01 chevrotain.n.01 +wire-haired_fox_terrier.n.01 dog.n.01 +saki.n.03 new_world_monkey.n.01 +old_world_porcupine.n.01 rodent.n.01 +hart.n.03 mammal.n.01 +hognose_bat.n.01 placental.n.01 +boar.n.02 even-toed_ungulate.n.01 +water_spaniel.n.01 spaniel.n.01 +nanny.n.02 even-toed_ungulate.n.01 +frosted_bat.n.01 frosted_bat.n.01 +kit_fox.n.02 kit_fox.n.02 +fox_squirrel.n.01 fox_squirrel.n.01 +borzoi.n.01 hound.n.01 +sporting_dog.n.01 canine.n.02 +vicuna.n.03 even-toed_ungulate.n.01 +great_ape.n.01 anthropoid_ape.n.01 +bearded_seal.n.01 bearded_seal.n.01 +southern_bog_lemming.n.01 lemming.n.01 +barbary_ape.n.01 primate.n.02 +groenendael.n.01 dog.n.01 +two-toed_sloth.n.01 placental.n.01 +rambouillet.n.01 mammal.n.01 +pole_horse.n.01 mammal.n.01 +common_eland.n.01 ungulate.n.01 +cape_buffalo.n.01 placental.n.01 +labrador_retriever.n.01 sporting_dog.n.01 +chesapeake_bay_retriever.n.01 placental.n.01 +swamp_rabbit.n.02 lagomorph.n.01 +pembroke.n.01 mammal.n.01 +pygmy_mouse.n.01 rodent.n.01 +eland.n.01 antelope.n.01 +mare.n.01 placental.n.01 +armadillo.n.01 mammal.n.01 +springbok.n.01 placental.n.01 +bruin.n.01 mammal.n.01 +indian_rhinoceros.n.01 placental.n.01 +sealyham_terrier.n.01 placental.n.01 +ox.n.01 placental.n.01 +greater_kudu.n.01 placental.n.01 +eurasian_otter.n.01 eurasian_otter.n.01 +saber-toothed_tiger.n.01 saber-toothed_tiger.n.01 +charger.n.01 saddle_horse.n.01 +wheel_horse.n.01 odd-toed_ungulate.n.01 +steller_sea_lion.n.01 seal.n.09 +lakeland_terrier.n.01 dog.n.01 +brown_swiss.n.01 bovine.n.01 +peludo.n.01 peludo.n.01 +pine_marten.n.01 pine_marten.n.01 +hominoid.n.01 hominoid.n.01 +javanthropus.n.01 primate.n.02 +prancer.n.01 equine.n.01 +giant_kangaroo.n.01 marsupial.n.01 +american_water_spaniel.n.01 water_spaniel.n.01 +mountain_sheep.n.01 ruminant.n.01 +bushbuck.n.01 ruminant.n.01 +river_otter.n.01 carnivore.n.01 +yearling.n.03 placental.n.01 +pteropus_capestratus.n.01 placental.n.01 +warrigal.n.01 odd-toed_ungulate.n.01 +springbok.n.01 gazelle.n.01 +fruit_bat.n.01 placental.n.01 +charolais.n.01 placental.n.01 +harvest_mouse.n.02 rodent.n.01 +grivet.n.01 grivet.n.01 +wild_goat.n.01 wild_goat.n.01 +western_chimpanzee.n.01 chimpanzee.n.01 +coondog.n.01 coonhound.n.01 +vampire_bat.n.01 bat.n.01 +vole.n.01 placental.n.01 +smooth-haired_fox_terrier.n.01 terrier.n.01 +kid.n.05 even-toed_ungulate.n.01 +palomino.n.01 ungulate.n.01 +groenendael.n.01 placental.n.01 +dachshund.n.01 mammal.n.01 +pomeranian.n.01 mammal.n.01 +bighorn.n.02 placental.n.01 +goat_antelope.n.01 ungulate.n.01 +red_squirrel.n.02 mammal.n.01 +border_collie.n.01 placental.n.01 +guereza.n.01 placental.n.01 +miniature_pinscher.n.01 carnivore.n.01 +bear_cub.n.01 bear_cub.n.01 +chow.n.03 carnivore.n.01 +dasyurid_marsupial.n.01 metatherian.n.01 +red_poll.n.01 even-toed_ungulate.n.01 +red_fox.n.03 placental.n.01 +guadalupe_fur_seal.n.01 fur_seal.n.02 +american_bison.n.01 ungulate.n.01 +gallant_fox.n.01 odd-toed_ungulate.n.01 +chesapeake_bay_retriever.n.01 canine.n.02 +red_wolf.n.01 placental.n.01 +bear_cub.n.01 mammal.n.01 +gnu.n.01 placental.n.01 +golden_hamster.n.01 hamster.n.01 +slow_loris.n.01 placental.n.01 +dalmatian.n.02 canine.n.02 +bullock.n.02 bovine.n.01 +irish_water_spaniel.n.01 canine.n.02 +vespertilian_bat.n.01 carnivorous_bat.n.01 +ram.n.05 ungulate.n.01 +cougar.n.01 wildcat.n.03 +black_fox.n.01 canine.n.02 +macaque.n.01 primate.n.02 +dhole.n.01 dhole.n.01 +steeplechaser.n.01 ungulate.n.01 +rhinoceros.n.01 mammal.n.01 +squirrel_monkey.n.01 monkey.n.01 +bouvier_des_flandres.n.01 mammal.n.01 +post_horse.n.01 odd-toed_ungulate.n.01 +giant_panda.n.01 mammal.n.01 +old_world_monkey.n.01 placental.n.01 +sand_rat.n.02 gerbil.n.01 +brown_rat.n.01 rodent.n.01 +typical_jerboa.n.01 rodent.n.01 +true_marmoset.n.01 primate.n.02 +bulldog.n.01 canine.n.02 +bettong.n.01 rat_kangaroo.n.01 +charolais.n.01 mammal.n.01 +alley_cat.n.01 carnivore.n.01 +manatee.n.01 sea_cow.n.01 +hampshire.n.02 placental.n.01 +zoril.n.01 weasel.n.02 +leonberg.n.01 carnivore.n.01 +dall_sheep.n.01 ungulate.n.01 +count_fleet.n.01 horse.n.01 +jaguarundi.n.01 cat.n.01 +black_sheep.n.02 mammal.n.01 +old_world_least_weasel.n.01 old_world_least_weasel.n.01 +elephant_seal.n.01 pinniped_mammal.n.01 +cheviot.n.01 domestic_sheep.n.01 +sausage_dog.n.01 placental.n.01 +bottle-nosed_whale.n.01 aquatic_mammal.n.01 +forest_goat.n.01 ruminant.n.01 +lincoln.n.03 bovid.n.01 +toy_manchester.n.01 rat_terrier.n.01 +southeastern_pocket_gopher.n.01 rodent.n.01 +cinnamon_bear.n.01 carnivore.n.01 +bullterrier.n.01 dog.n.01 +harrier.n.02 mammal.n.01 +bulldog.n.01 working_dog.n.01 +yak.n.02 placental.n.01 +tenrec.n.01 placental.n.01 +cro-magnon.n.01 cro-magnon.n.01 +red_deer.n.01 placental.n.01 +jackal.n.01 jackal.n.01 +meadow_jumping_mouse.n.01 mammal.n.01 +reynard.n.01 carnivore.n.01 +pichiciago.n.01 placental.n.01 +workhorse.n.02 workhorse.n.02 +norwich_terrier.n.01 norwich_terrier.n.01 +jungle_cat.n.01 wildcat.n.03 +least_shrew.n.01 mammal.n.01 +plott_hound.n.01 mammal.n.01 +jerboa_rat.n.01 rodent.n.01 +lemming.n.01 placental.n.01 +harnessed_antelope.n.01 mammal.n.01 +african_hunting_dog.n.01 mammal.n.01 +polo_pony.n.01 horse.n.01 +toy_spaniel.n.01 canine.n.02 +collared_peccary.n.01 peccary.n.01 +clydesdale.n.01 workhorse.n.02 +suricate.n.01 mammal.n.01 +bloodhound.n.01 mammal.n.01 +packhorse.n.01 horse.n.01 +male_horse.n.01 horse.n.01 +baboon.n.01 baboon.n.01 +brown_rat.n.01 rat.n.01 +platypus.n.01 prototherian.n.01 +plains_pocket_gopher.n.01 rodent.n.01 +leveret.n.01 leveret.n.01 +reynard.n.01 placental.n.01 +antelope_squirrel.n.01 placental.n.01 +ocelot.n.01 wildcat.n.03 +australopithecus_boisei.n.01 primate.n.02 +bezoar_goat.n.01 wild_goat.n.01 +hog-nosed_skunk.n.01 musteline_mammal.n.01 +great_ape.n.01 great_ape.n.01 +virginia_deer.n.01 ruminant.n.01 +pollard.n.02 ungulate.n.01 +merino.n.01 placental.n.01 +steller's_sea_cow.n.01 steller's_sea_cow.n.01 +working_dog.n.01 working_dog.n.01 +homo_habilis.n.01 mammal.n.01 +addax.n.01 mammal.n.01 +brown_hyena.n.01 canine.n.02 +wether.n.01 bovid.n.01 +serval.n.01 serval.n.01 +airedale.n.01 mammal.n.01 +cheetah.n.01 big_cat.n.01 +antelope_squirrel.n.01 rodent.n.01 +skye_terrier.n.01 hunting_dog.n.01 +groenendael.n.01 shepherd_dog.n.01 +dugong.n.01 dugong.n.01 +baleen_whale.n.01 baleen_whale.n.01 +burro.n.01 mammal.n.01 +malayan_tapir.n.01 placental.n.01 +bobcat.n.01 cat.n.01 +citation.n.06 mammal.n.01 +irish_setter.n.01 mammal.n.01 +tiglon.n.01 tiglon.n.01 +japanese_deer.n.01 japanese_deer.n.01 +gee-gee.n.01 equine.n.01 +devon.n.02 ungulate.n.01 +smiledon_californicus.n.01 big_cat.n.01 +harrier.n.02 hunting_dog.n.01 +american_shrew_mole.n.01 shrew_mole.n.01 +wolf.n.01 wolf.n.01 +mesohippus.n.01 mesohippus.n.01 +yellowbelly_marmot.n.01 yellowbelly_marmot.n.01 +guide_dog.n.01 guide_dog.n.01 +farm_horse.n.01 farm_horse.n.01 +samoyed.n.03 placental.n.01 +galloway.n.02 placental.n.01 +vixen.n.02 placental.n.01 +water_dog.n.02 mammal.n.01 +rhinoceros.n.01 placental.n.01 +old_world_beaver.n.01 beaver.n.07 +cur.n.01 carnivore.n.01 +brush-tailed_phalanger.n.01 metatherian.n.01 +attack_dog.n.01 working_dog.n.01 +jerboa_kangaroo.n.01 rat_kangaroo.n.01 +dusky-footed_woodrat.n.01 placental.n.01 +hack.n.08 odd-toed_ungulate.n.01 +boskop_man.n.01 homo.n.02 +new_world_least_weasel.n.01 weasel.n.02 +polar_hare.n.01 mammal.n.01 +megatherian.n.01 mammal.n.01 +homo_habilis.n.01 homo.n.02 +canine.n.02 placental.n.01 +eastern_chipmunk.n.01 mammal.n.01 +western_pipistrel.n.01 bat.n.01 +draft_horse.n.01 horse.n.01 +gelding.n.01 placental.n.01 +homo_sapiens_sapiens.n.01 placental.n.01 +beaked_whale.n.01 whale.n.02 +lesser_ape.n.01 lesser_ape.n.01 +standard_schnauzer.n.01 dog.n.01 +spearnose_bat.n.01 spearnose_bat.n.01 +american_saddle_horse.n.01 saddle_horse.n.01 +caribou.n.01 deer.n.01 +grison.n.01 placental.n.01 +stirk.n.01 mammal.n.01 +ass.n.03 equine.n.01 +red_fox.n.03 mammal.n.01 +hare_wallaby.n.01 marsupial.n.01 +protohippus.n.01 protohippus.n.01 +finback.n.01 whale.n.02 +ant_bear.n.01 ant_bear.n.01 +phalanger.n.01 phalanger.n.01 +appaloosa.n.01 appaloosa.n.01 +prototherian.n.01 prototherian.n.01 +peking_man.n.01 primate.n.02 +longhorn.n.01 cattle.n.01 +porpoise.n.01 aquatic_mammal.n.01 +capybara.n.01 placental.n.01 +big_cat.n.01 placental.n.01 +thomson's_gazelle.n.01 mammal.n.01 +fanaloka.n.01 placental.n.01 +caracal.n.01 mammal.n.01 +tamarisk_gerbil.n.01 placental.n.01 +pine_vole.n.01 rodent.n.01 +beaked_whale.n.01 aquatic_mammal.n.01 +columbian_mammoth.n.01 placental.n.01 +przewalski's_horse.n.01 wild_horse.n.01 +boar.n.02 placental.n.01 +mexican_hairless.n.01 carnivore.n.01 +porker.n.01 even-toed_ungulate.n.01 +abyssinian.n.01 mammal.n.01 +grampus.n.02 dolphin.n.02 +siamang.n.01 mammal.n.01 +springer_spaniel.n.01 placental.n.01 +hinny.n.01 hinny.n.01 +hind.n.02 deer.n.01 +lapin.n.02 mammal.n.01 +mountain_goat.n.01 mammal.n.01 +pug.n.01 pug.n.01 +coypu.n.01 coypu.n.01 +flying_lemur.n.01 placental.n.01 +bucking_bronco.n.01 mammal.n.01 +curly-coated_retriever.n.01 dog.n.01 +black-footed_ferret.n.01 black-footed_ferret.n.01 +llama.n.01 placental.n.01 +australopithecus_afarensis.n.01 mammal.n.01 +pekinese.n.01 toy_dog.n.01 +springbok.n.01 even-toed_ungulate.n.01 +pole_horse.n.02 placental.n.01 +abyssinian.n.01 domestic_cat.n.01 +jackrabbit.n.01 mammal.n.01 +stone_marten.n.01 carnivore.n.01 +grampus.n.02 cetacean.n.01 +fox_squirrel.n.01 tree_squirrel.n.01 +new_world_monkey.n.01 primate.n.02 +brown_lemming.n.01 rodent.n.01 +kiang.n.01 equine.n.01 +water_spaniel.n.01 dog.n.01 +eared_seal.n.01 seal.n.09 +draft_horse.n.01 placental.n.01 +fur_seal.n.02 placental.n.01 +rottweiler.n.01 mammal.n.01 +sable.n.05 marten.n.01 +clydesdale.n.01 equine.n.01 +springbok.n.01 mammal.n.01 +polar_hare.n.01 lagomorph.n.01 +dolphin.n.02 placental.n.01 +gerbil.n.01 mammal.n.01 +american_black_bear.n.01 bear.n.01 +santa_gertrudis.n.01 bovine.n.01 +mountain_paca.n.01 mammal.n.01 +kiang.n.01 kiang.n.01 +wapiti.n.01 mammal.n.01 +banteng.n.01 ruminant.n.01 +hearing_dog.n.01 hearing_dog.n.01 +malamute.n.01 malamute.n.01 +asiatic_black_bear.n.01 carnivore.n.01 +stalking-horse.n.04 ungulate.n.01 +rambouillet.n.01 placental.n.01 +silver_fox.n.01 placental.n.01 +grison.n.01 musteline_mammal.n.01 +asiatic_shrew_mole.n.01 shrew_mole.n.01 +cashmere_goat.n.01 cashmere_goat.n.01 +solo_man.n.01 solo_man.n.01 +wood_rabbit.n.01 placental.n.01 +snowshoe_hare.n.01 lagomorph.n.01 +odd-toed_ungulate.n.01 ungulate.n.01 +bandicoot_rat.n.01 rodent.n.01 +pronghorn.n.01 mammal.n.01 +muishond.n.01 carnivore.n.01 +steller_sea_lion.n.01 pinniped_mammal.n.01 +ox.n.02 placental.n.01 +dog.n.01 placental.n.01 +porker.n.01 mammal.n.01 +labrador_retriever.n.01 labrador_retriever.n.01 +house_mouse.n.01 rodent.n.01 +sealyham_terrier.n.01 carnivore.n.01 +dasyurid_marsupial.n.01 marsupial.n.01 +german_shepherd.n.01 shepherd_dog.n.01 +flat-coated_retriever.n.01 mammal.n.01 +pony.n.02 equine.n.01 +cayuse.n.01 pony.n.01 +chihuahua.n.03 placental.n.01 +waterbuck.n.01 ruminant.n.01 +large_civet.n.01 viverrine.n.01 +thomson's_gazelle.n.01 even-toed_ungulate.n.01 +golden_mole.n.01 placental.n.01 +bay.n.07 placental.n.01 +greyhound.n.01 placental.n.01 +cayuse.n.01 equine.n.01 +swine.n.01 even-toed_ungulate.n.01 +echidna.n.02 echidna.n.02 +springer_spaniel.n.01 canine.n.02 +java_man.n.01 hominid.n.01 +dalmatian.n.02 mammal.n.01 +common_zebra.n.01 zebra.n.01 +saint_bernard.n.01 working_dog.n.01 +gazelle.n.01 even-toed_ungulate.n.01 +aoudad.n.01 wild_sheep.n.01 +bearded_seal.n.01 pinniped_mammal.n.01 +finback.n.01 cetacean.n.01 +burmese_cat.n.01 feline.n.01 +giant_schnauzer.n.01 placental.n.01 +polecat.n.02 placental.n.01 +mudder.n.01 ungulate.n.01 +tasmanian_devil.n.01 marsupial.n.01 +proconsul.n.03 placental.n.01 +placental.n.01 placental.n.01 +mountain_nyala.n.01 even-toed_ungulate.n.01 +manul.n.01 feline.n.01 +bullock.n.01 even-toed_ungulate.n.01 +palm_cat.n.01 civet.n.01 +pinto.n.01 horse.n.01 +cattalo.n.01 placental.n.01 +fossa.n.03 mammal.n.01 +miniature_poodle.n.01 mammal.n.01 +german_short-haired_pointer.n.01 hunting_dog.n.01 +northern_pocket_gopher.n.01 rat.n.01 +blackbuck.n.01 even-toed_ungulate.n.01 +oryx.n.01 even-toed_ungulate.n.01 +cow.n.01 bovine.n.01 +plains_pocket_mouse.n.01 placental.n.01 +tortoiseshell.n.03 tortoiseshell.n.03 +bucking_bronco.n.01 placental.n.01 +polecat.n.02 carnivore.n.01 +tapir.n.01 placental.n.01 +horse.n.01 placental.n.01 +metatherian.n.01 mammal.n.01 +liger.n.01 mammal.n.01 +wolverine.n.03 musteline_mammal.n.01 +monotreme.n.01 mammal.n.01 +insectivore.n.01 mammal.n.01 +camel.n.01 mammal.n.01 +cotton_rat.n.01 placental.n.01 +tibetan_terrier.n.01 terrier.n.01 +arabian.n.02 odd-toed_ungulate.n.01 +protohippus.n.01 horse.n.01 +anthropoid_ape.n.01 primate.n.02 +mammoth.n.01 mammoth.n.01 +jaguar.n.01 placental.n.01 +bottle-nosed_whale.n.01 whale.n.02 +persian_cat.n.01 domestic_cat.n.01 +mammoth.n.01 mammal.n.01 +chimpanzee.n.01 great_ape.n.01 +sand_cat.n.01 cat.n.01 +affenpinscher.n.01 watchdog.n.02 +tamarau.n.01 ungulate.n.01 +arctic_fox.n.01 canine.n.02 +guernsey.n.02 mammal.n.01 +two-year-old_horse.n.01 placental.n.01 +woolly_rhinoceros.n.01 rhinoceros.n.01 +mudder.n.01 placental.n.01 +working_dog.n.01 canine.n.02 +red_wolf.n.01 red_wolf.n.01 +bushbuck.n.01 mammal.n.01 +river_otter.n.01 placental.n.01 +serow.n.01 goat_antelope.n.01 +common_opossum.n.01 mammal.n.01 +madagascar_cat.n.01 lemur.n.01 +jack.n.12 odd-toed_ungulate.n.01 +big_brown_bat.n.01 placental.n.01 +sussex_spaniel.n.01 mammal.n.01 +pika.n.01 placental.n.01 +eastern_cottontail.n.01 lagomorph.n.01 +redbone.n.01 hound.n.01 +cattalo.n.01 ungulate.n.01 +fur_seal.n.02 aquatic_mammal.n.01 +tabby.n.01 feline.n.01 +howler_monkey.n.01 monkey.n.01 +kiang.n.01 placental.n.01 +kerry_blue_terrier.n.01 dog.n.01 +airedale.n.01 canine.n.02 +smooth-haired_fox_terrier.n.01 carnivore.n.01 +lucy.n.01 primate.n.02 +gazella_subgutturosa.n.01 mammal.n.01 +appaloosa.n.01 odd-toed_ungulate.n.01 +woolly_mammoth.n.01 mammoth.n.01 +vole.n.01 vole.n.01 +canada_lynx.n.01 feline.n.01 +masked_shrew.n.01 mammal.n.01 +aurochs.n.02 ruminant.n.01 +odd-toed_ungulate.n.01 placental.n.01 +giant_schnauzer.n.01 terrier.n.01 +greater_kudu.n.01 greater_kudu.n.01 +wild_boar.n.01 ungulate.n.01 +bay.n.07 ungulate.n.01 +pipistrelle.n.01 vespertilian_bat.n.01 +duplicidentata.n.01 lagomorph.n.01 +white-tailed_jackrabbit.n.01 lagomorph.n.01 +ground_squirrel.n.02 placental.n.01 +plow_horse.n.01 horse.n.01 +manul.n.01 wildcat.n.03 +rat_terrier.n.01 dog.n.01 +addax.n.01 placental.n.01 +war_admiral.n.01 odd-toed_ungulate.n.01 +chesapeake_bay_retriever.n.01 sporting_dog.n.01 +broadtail.n.02 sheep.n.01 +pacific_bottlenose_dolphin.n.01 whale.n.02 +razorback.n.01 swine.n.01 +lioness.n.01 lioness.n.01 +bobcat.n.01 lynx.n.02 +common_eland.n.01 common_eland.n.01 +false_saber-toothed_tiger.n.01 false_saber-toothed_tiger.n.01 +agouti.n.01 rodent.n.01 +hare_wallaby.n.01 hare_wallaby.n.01 +hind.n.02 hind.n.02 +irish_water_spaniel.n.01 irish_water_spaniel.n.01 +toy_terrier.n.01 canine.n.02 +thylacine.n.01 mammal.n.01 +vizsla.n.01 mammal.n.01 +tarpan.n.01 wild_horse.n.01 +ungulate.n.01 mammal.n.01 +mouser.n.01 domestic_cat.n.01 +lesser_kudu.n.01 ruminant.n.01 +bulldog.n.01 placental.n.01 +durham.n.02 ruminant.n.01 +angora.n.02 placental.n.01 +cayuse.n.01 ungulate.n.01 +greater_swiss_mountain_dog.n.01 placental.n.01 +hognose_bat.n.01 bat.n.01 +mule.n.01 ungulate.n.01 +carabao.n.01 even-toed_ungulate.n.01 +hartebeest.n.01 antelope.n.01 +flying_fox.n.01 bat.n.01 +silky_tamarin.n.01 placental.n.01 +pole_horse.n.02 ungulate.n.01 +armadillo.n.01 armadillo.n.01 +ibizan_hound.n.01 placental.n.01 +bettong.n.01 metatherian.n.01 +chesapeake_bay_retriever.n.01 retriever.n.01 +anoa.n.01 ruminant.n.01 +manx.n.02 domestic_cat.n.01 +ord_kangaroo_rat.n.01 pocket_rat.n.01 +harness_horse.n.01 odd-toed_ungulate.n.01 +bettong.n.01 marsupial.n.01 +cave_myotis.n.01 carnivorous_bat.n.01 +sinanthropus.n.01 hominid.n.01 +musk_kangaroo.n.01 mammal.n.01 +gelding.n.01 ungulate.n.01 +two-year-old_horse.n.01 two-year-old_horse.n.01 +fossa.n.03 fossa.n.03 +lucy.n.01 australopithecine.n.01 +grison.n.01 carnivore.n.01 +chamois.n.02 mammal.n.01 +lhasa.n.02 hunting_dog.n.01 +italian_greyhound.n.01 hunting_dog.n.01 +steed.n.01 mammal.n.01 +caracal.n.01 lynx.n.02 +sea_otter.n.01 sea_otter.n.01 +anthropoid_ape.n.01 mammal.n.01 +kangaroo_mouse.n.02 placental.n.01 +titi.n.03 monkey.n.01 +dachshund.n.01 hunting_dog.n.01 +toy_terrier.n.01 toy_terrier.n.01 +gemsbok.n.01 antelope.n.01 +cavalry_horse.n.01 mammal.n.01 +wood_rat.n.01 wood_rat.n.01 +markhor.n.01 bovid.n.01 +racehorse.n.01 horse.n.01 +guereza.n.01 old_world_monkey.n.01 +steed.n.01 ungulate.n.01 +kid.n.05 ruminant.n.01 +new_world_monkey.n.01 monkey.n.01 +roe_deer.n.01 mammal.n.01 +billy.n.02 placental.n.01 +zebra.n.01 ungulate.n.01 +rambouillet.n.01 even-toed_ungulate.n.01 +dasyure.n.01 metatherian.n.01 +mexican_pocket_mouse.n.01 mammal.n.01 +rice_rat.n.01 mammal.n.01 +sambar.n.01 placental.n.01 +yearling.n.02 equine.n.01 +mustang.n.01 equine.n.01 +white_whale.n.01 placental.n.01 +big_brown_bat.n.01 carnivorous_bat.n.01 +collie.n.01 canine.n.02 +argali.n.01 ungulate.n.01 +serotine.n.01 mammal.n.01 +bowhead.n.01 placental.n.01 +stallion.n.01 stallion.n.01 +cattle.n.01 even-toed_ungulate.n.01 +ape.n.01 ape.n.01 +english_setter.n.01 dog.n.01 +bear.n.01 carnivore.n.01 +panther.n.02 mammal.n.01 +raccoon_dog.n.01 mammal.n.01 +boston_bull.n.01 mammal.n.01 +red_poll.n.01 ungulate.n.01 +tree_shrew.n.01 mammal.n.01 +new_world_monkey.n.01 new_world_monkey.n.01 +giant_eland.n.01 antelope.n.01 +genet.n.03 placental.n.01 +bullterrier.n.01 terrier.n.01 +musk_deer.n.01 even-toed_ungulate.n.01 +woolly_monkey.n.01 woolly_monkey.n.01 +giraffe.n.01 placental.n.01 +dryopithecine.n.01 primate.n.02 +canine.n.02 canine.n.02 +fanaloka.n.01 carnivore.n.01 +cardigan.n.02 mammal.n.01 +water_vole.n.02 vole.n.01 +red_deer.n.01 ungulate.n.01 +bouvier_des_flandres.n.01 shepherd_dog.n.01 +pacer.n.02 equine.n.01 +old_world_beaver.n.01 placental.n.01 +white-tailed_jackrabbit.n.01 hare.n.01 +doberman.n.01 canine.n.02 +bullock.n.02 ungulate.n.01 +english_springer.n.01 carnivore.n.01 +harp_seal.n.01 seal.n.09 +kangaroo_mouse.n.02 rat.n.01 +sennenhunde.n.01 carnivore.n.01 +heifer.n.01 bovid.n.01 +cougar.n.01 mammal.n.01 +eastern_lowland_gorilla.n.01 gorilla.n.01 +marco_polo_sheep.n.01 bovid.n.01 +red_deer.n.01 mammal.n.01 +guide_dog.n.01 placental.n.01 +bronco.n.01 odd-toed_ungulate.n.01 +hyena.n.01 canine.n.02 +saddle_horse.n.01 equine.n.01 +beef.n.01 ruminant.n.01 +grivet.n.01 old_world_monkey.n.01 +lucy.n.01 lucy.n.01 +potoroo.n.01 potoroo.n.01 +pony.n.05 ungulate.n.01 +vizsla.n.01 carnivore.n.01 +jackal.n.01 carnivore.n.01 +feist.n.01 placental.n.01 +marmot.n.01 placental.n.01 +smooth-haired_fox_terrier.n.01 smooth-haired_fox_terrier.n.01 +dryopithecine.n.01 dryopithecine.n.01 +cob.n.02 horse.n.01 +bottlenose_dolphin.n.01 whale.n.02 +cattalo.n.01 mammal.n.01 +eastern_woodrat.n.01 rodent.n.01 +grey.n.07 horse.n.01 +collie.n.01 dog.n.01 +dalmatian.n.02 dog.n.01 +pricket.n.02 ungulate.n.01 +beaver_rat.n.01 mammal.n.01 +shepherd_dog.n.01 carnivore.n.01 +virginia_deer.n.01 mammal.n.01 +beef.n.01 bovine.n.01 +hampshire.n.02 hampshire.n.02 +pacific_walrus.n.01 pacific_walrus.n.01 +longwool.n.01 longwool.n.01 +hyrax.n.01 hyrax.n.01 +serotine.n.01 serotine.n.01 +liver_chestnut.n.01 placental.n.01 +leopard.n.02 carnivore.n.01 +asiatic_black_bear.n.01 bear.n.01 +european_hare.n.01 european_hare.n.01 +jungle_cat.n.01 mammal.n.01 +common_zebra.n.01 odd-toed_ungulate.n.01 +harbor_seal.n.01 placental.n.01 +bongo.n.02 ruminant.n.01 +coydog.n.01 placental.n.01 +protohippus.n.01 odd-toed_ungulate.n.01 +bandicoot_rat.n.01 placental.n.01 +gazella_subgutturosa.n.01 gazelle.n.01 +ice_bear.n.01 mammal.n.01 +water_spaniel.n.01 canine.n.02 +mammal.n.01 mammal.n.01 +pariah_dog.n.01 carnivore.n.01 +wild_horse.n.01 wild_horse.n.01 +eared_seal.n.01 placental.n.01 +white-lipped_peccary.n.01 mammal.n.01 +dun.n.01 dun.n.01 +pacific_bottlenose_dolphin.n.01 dolphin.n.02 +desmodus_rotundus.n.01 placental.n.01 +harpy.n.03 harpy.n.03 +lynx.n.02 feline.n.01 +pinche.n.01 tamarin.n.01 +quagga.n.01 mammal.n.01 +brown_swiss.n.01 ruminant.n.01 +mountain_nyala.n.01 bovid.n.01 +water_buffalo.n.01 bovid.n.01 +neandertal_man.n.01 primate.n.02 +australopithecus_robustus.n.01 primate.n.02 +hairy-legged_vampire_bat.n.01 bat.n.01 +bouvier_des_flandres.n.01 working_dog.n.01 +lesser_rorqual.n.01 aquatic_mammal.n.01 +pariah_dog.n.01 dog.n.01 +black-tailed_deer.n.01 black-tailed_deer.n.01 +porker.n.01 ungulate.n.01 +bottlenose_dolphin.n.01 mammal.n.01 +mudder.n.01 equine.n.01 +toy_manchester.n.01 manchester_terrier.n.01 +monotreme.n.01 monotreme.n.01 +insectivore.n.01 insectivore.n.01 +tibetan_terrier.n.01 canine.n.02 +orangutan.n.01 primate.n.02 +musk_ox.n.01 ruminant.n.01 +setter.n.02 setter.n.02 +ram.n.05 bovid.n.01 +forest_goat.n.01 ungulate.n.01 +heifer.n.01 cow.n.01 +bronco.n.01 ungulate.n.01 +hamster.n.01 mammal.n.01 +toothed_whale.n.01 toothed_whale.n.01 +domestic_llama.n.01 mammal.n.01 +wolverine.n.03 wolverine.n.03 +wild_dog.n.01 placental.n.01 +arctic_fox.n.01 fox.n.01 +mole_rat.n.02 mammal.n.01 +attack_dog.n.01 canine.n.02 +smooth-haired_fox_terrier.n.01 placental.n.01 +dusky-footed_wood_rat.n.01 dusky-footed_wood_rat.n.01 +horseshoe_bat.n.01 mammal.n.01 +pine_vole.n.01 placental.n.01 +przewalski's_horse.n.01 przewalski's_horse.n.01 +australian_terrier.n.01 mammal.n.01 +citation.n.06 placental.n.01 +tigress.n.01 mammal.n.01 +welsh.n.03 welsh.n.03 +american_water_shrew.n.01 mammal.n.01 +brocket.n.02 even-toed_ungulate.n.01 +old_world_monkey.n.01 old_world_monkey.n.01 +baronduki.n.01 mammal.n.01 +homo_erectus.n.01 hominid.n.01 +canada_porcupine.n.01 placental.n.01 +malamute.n.01 placental.n.01 +staffordshire_bullterrier.n.01 bullterrier.n.01 +pointer.n.04 dog.n.01 +european_wood_mouse.n.01 field_mouse.n.02 +greater_kudu.n.01 ungulate.n.01 +ewe.n.03 ruminant.n.01 +hampshire.n.02 ruminant.n.01 +stepper.n.03 placental.n.01 +spotted_skunk.n.01 skunk.n.04 +red-backed_mouse.n.01 vole.n.01 +kit_fox.n.02 canine.n.02 +crab-eating_macaque.n.01 macaque.n.01 +leporid.n.01 lagomorph.n.01 +phenacomys.n.01 wood_rat.n.01 +hog.n.03 placental.n.01 +razorback.n.01 razorback.n.01 +stoat.n.01 carnivore.n.01 +lesser_kudu.n.01 ungulate.n.01 +bezoar_goat.n.01 bezoar_goat.n.01 +sennenhunde.n.01 sennenhunde.n.01 +thoroughbred.n.02 racehorse.n.01 +curly-coated_retriever.n.01 curly-coated_retriever.n.01 +gazella_subgutturosa.n.01 gazella_subgutturosa.n.01 +spotted_lynx.n.01 cat.n.01 +tapir.n.01 tapir.n.01 +dusky-footed_woodrat.n.01 rodent.n.01 +saddle_horse.n.01 mammal.n.01 +shrew_mole.n.01 mole.n.06 +friesian.n.01 ruminant.n.01 +siamang.n.01 primate.n.02 +nyala.n.02 placental.n.01 +post_horse.n.01 ungulate.n.01 +brittany_spaniel.n.01 sporting_dog.n.01 +gallant_fox.n.01 ungulate.n.01 +world.n.08 primate.n.02 +manx.n.02 cat.n.01 +viscacha.n.01 mammal.n.01 +australopithecus_afarensis.n.01 primate.n.02 +housedog.n.01 watchdog.n.02 +european_wood_mouse.n.01 mammal.n.01 +bull.n.01 mammal.n.01 +canada_lynx.n.01 lynx.n.02 +gomphothere.n.01 proboscidean.n.01 +pony.n.02 placental.n.01 +dhole.n.01 mammal.n.01 +welsh_springer_spaniel.n.01 hunting_dog.n.01 +cuscus.n.01 mammal.n.01 +golden_retriever.n.01 canine.n.02 +grey_whale.n.01 placental.n.01 +western_pipistrel.n.01 carnivorous_bat.n.01 +jackrabbit.n.01 jackrabbit.n.01 +cotton_rat.n.01 cotton_rat.n.01 +bushbuck.n.01 ungulate.n.01 +police_dog.n.01 carnivore.n.01 +shrew.n.02 placental.n.01 +gazelle.n.01 ruminant.n.01 +dinoceras.n.01 ungulate.n.01 +saint_bernard.n.01 carnivore.n.01 +hairy-legged_vampire_bat.n.01 placental.n.01 +goat.n.01 goat.n.01 +guenon.n.01 mammal.n.01 +affenpinscher.n.01 affenpinscher.n.01 +tenrec.n.01 mammal.n.01 +kid.n.05 kid.n.05 +guadalupe_fur_seal.n.01 seal.n.09 +impala.n.01 antelope.n.01 +hairy-legged_vampire_bat.n.01 vampire_bat.n.01 +guanaco.n.01 placental.n.01 +rat_kangaroo.n.01 kangaroo.n.01 +old_world_porcupine.n.01 porcupine.n.01 +stoat.n.01 stoat.n.01 +ferret_badger.n.01 carnivore.n.01 +australopithecus_africanus.n.01 primate.n.02 +pony.n.01 mammal.n.01 +echidna.n.01 mammal.n.01 +assault.n.03 equine.n.01 +opossum.n.02 metatherian.n.01 +tibetan_mastiff.n.01 working_dog.n.01 +jaguar.n.01 big_cat.n.01 +yearling.n.02 mammal.n.01 +jird.n.01 gerbil.n.01 +kinkajou.n.01 procyonid.n.01 +rottweiler.n.01 rottweiler.n.01 +caribou.n.01 mammal.n.01 +rorqual.n.01 rorqual.n.01 +springer.n.02 springer.n.02 +toy_dog.n.01 toy_dog.n.01 +bighorn.n.02 mountain_sheep.n.01 +goral.n.01 bovid.n.01 +western_lowland_gorilla.n.01 gorilla.n.01 +mountain_goat.n.01 ruminant.n.01 +cro-magnon.n.01 homo_sapiens.n.01 +river_dolphin.n.01 mammal.n.01 +pinto.n.01 equine.n.01 +caracal.n.01 caracal.n.01 +wapiti.n.01 wapiti.n.01 +mole_rat.n.01 mammal.n.01 +silky_pocket_mouse.n.01 pocket_rat.n.01 +two-toed_sloth.n.01 edentate.n.01 +ayrshire.n.01 bovine.n.01 +onager.n.02 odd-toed_ungulate.n.01 +zinjanthropus.n.01 hominid.n.01 +bloodhound.n.01 placental.n.01 +eastern_chipmunk.n.01 squirrel.n.01 +courser.n.03 mammal.n.01 +least_shrew.n.01 shrew.n.02 +american_marten.n.01 placental.n.01 +doe.n.02 placental.n.01 +canada_lynx.n.01 placental.n.01 +dwarf_sperm_whale.n.01 cetacean.n.01 +eastern_dasyure.n.01 mammal.n.01 +silky_pocket_mouse.n.01 placental.n.01 +napu.n.01 chevrotain.n.01 +ratel.n.01 ratel.n.01 +marmot.n.01 marmot.n.01 +hereford.n.01 ruminant.n.01 +labrador_retriever.n.01 dog.n.01 +australian_terrier.n.01 australian_terrier.n.01 +slender_loris.n.01 placental.n.01 +red_fox.n.02 carnivore.n.01 +steed.n.01 equine.n.01 +musk_deer.n.01 placental.n.01 +whale.n.02 mammal.n.01 +mustang.n.01 mustang.n.01 +wire-haired_fox_terrier.n.01 wire-haired_fox_terrier.n.01 +roan.n.02 mammal.n.01 +coach_horse.n.01 odd-toed_ungulate.n.01 +panther.n.02 placental.n.01 +dandie_dinmont.n.01 dog.n.01 +yellow-throated_marten.n.01 carnivore.n.01 +male_horse.n.01 odd-toed_ungulate.n.01 +eurasian_hamster.n.01 hamster.n.01 +crabeater_seal.n.01 mammal.n.01 +wisent.n.01 ruminant.n.01 +spotted_lynx.n.01 mammal.n.01 +american_badger.n.01 mammal.n.01 +bushbuck.n.01 harnessed_antelope.n.01 +antelope_squirrel.n.01 ground_squirrel.n.02 +american_saddle_horse.n.01 mammal.n.01 +lesser_ape.n.01 primate.n.02 +plains_pocket_gopher.n.01 rat.n.01 +brahman.n.04 even-toed_ungulate.n.01 +chevrotain.n.01 placental.n.01 +cotswold.n.01 domestic_sheep.n.01 +tenrec.n.01 insectivore.n.01 +maltese.n.03 cat.n.01 +cow.n.01 bovid.n.01 +yearling.n.02 yearling.n.02 +vaquita.n.01 vaquita.n.01 +guernsey.n.02 placental.n.01 +chiacoan_peccary.n.01 ungulate.n.01 +american_harvest_mouse.n.01 placental.n.01 +rhodesian_ridgeback.n.01 mammal.n.01 +briard.n.01 canine.n.02 +mountain_beaver.n.01 rodent.n.01 +belgian_hare.n.01 belgian_hare.n.01 +pony.n.05 odd-toed_ungulate.n.01 +hudson_bay_collared_lemming.n.01 mammal.n.01 +lincoln.n.03 even-toed_ungulate.n.01 +sealyham_terrier.n.01 hunting_dog.n.01 +clydesdale_terrier.n.01 clydesdale_terrier.n.01 +even-toed_ungulate.n.01 ungulate.n.01 +mule_deer.n.01 mule_deer.n.01 +przewalski's_horse.n.01 horse.n.01 +ayrshire.n.01 cattle.n.01 +malamute.n.01 working_dog.n.01 +chiacoan_peccary.n.01 peccary.n.01 +palm_cat.n.01 palm_cat.n.01 +weasel.n.02 carnivore.n.01 +valley_pocket_gopher.n.01 placental.n.01 +american_saddle_horse.n.01 horse.n.01 +english_foxhound.n.01 canine.n.02 +nude_mouse.n.01 placental.n.01 +asiatic_black_bear.n.01 asiatic_black_bear.n.01 +otter_shrew.n.01 placental.n.01 +roebuck.n.01 roe_deer.n.01 +africander.n.01 placental.n.01 +exmoor.n.02 horse.n.01 +polecat.n.02 polecat.n.02 +arabian_camel.n.01 even-toed_ungulate.n.01 +roan.n.02 ungulate.n.01 +eastern_pipistrel.n.01 carnivorous_bat.n.01 +pygmy_sperm_whale.n.01 mammal.n.01 +gopher.n.04 mammal.n.01 +even-toed_ungulate.n.01 mammal.n.01 +valley_pocket_gopher.n.01 pocket_rat.n.01 +old_english_sheepdog.n.01 placental.n.01 +soft-coated_wheaten_terrier.n.01 soft-coated_wheaten_terrier.n.01 +feist.n.01 carnivore.n.01 +pademelon.n.01 wallaby.n.01 +macaque.n.01 mammal.n.01 +wapiti.n.01 ungulate.n.01 +horseshoe_bat.n.02 placental.n.01 +workhorse.n.02 mammal.n.01 +norwich_terrier.n.01 mammal.n.01 +babirusa.n.01 ungulate.n.01 +water_spaniel.n.01 placental.n.01 +suslik.n.01 rodent.n.01 +grevy's_zebra.n.01 grevy's_zebra.n.01 +griffon.n.02 dog.n.01 +dik-dik.n.01 mammal.n.01 +harrier.n.02 dog.n.01 +american_mastodon.n.01 american_mastodon.n.01 +bushbuck.n.01 even-toed_ungulate.n.01 +golden_mole.n.01 golden_mole.n.01 +guernsey.n.02 dairy_cattle.n.01 +tamarin.n.01 mammal.n.01 +red_poll.n.01 bovine.n.01 +american_water_shrew.n.01 insectivore.n.01 +hind.n.02 placental.n.01 +grey.n.07 equine.n.01 +typical_jerboa.n.01 jerboa.n.01 +blacktail_jackrabbit.n.01 blacktail_jackrabbit.n.01 +snow_leopard.n.01 big_cat.n.01 +pomeranian.n.01 canine.n.02 +steeplechaser.n.01 mammal.n.01 +wild_goat.n.01 ungulate.n.01 +vervet.n.01 vervet.n.01 +humpback.n.03 cetacean.n.01 +blue_point_siamese.n.01 placental.n.01 +royal.n.02 buck.n.05 +australian_sea_lion.n.01 eared_seal.n.01 +mole_rat.n.01 mole_rat.n.01 +hooded_skunk.n.01 skunk.n.04 +aoudad.n.01 ruminant.n.01 +foxhound.n.01 hunting_dog.n.01 +european_wildcat.n.01 european_wildcat.n.01 +brocket.n.01 placental.n.01 +wapiti.n.01 ruminant.n.01 +banteng.n.01 mammal.n.01 +farm_horse.n.01 ungulate.n.01 +damaraland_mole_rat.n.01 fossorial_mammal.n.01 +tiger_cat.n.02 placental.n.01 +nilgai.n.01 placental.n.01 +world.n.08 placental.n.01 +javanthropus.n.01 mammal.n.01 +woodland_caribou.n.01 ungulate.n.01 +flying_phalanger.n.01 mammal.n.01 +sea_lion.n.01 seal.n.09 +chimpanzee.n.01 anthropoid_ape.n.01 +simian.n.01 simian.n.01 +alaskan_brown_bear.n.01 alaskan_brown_bear.n.01 +timber_wolf.n.01 placental.n.01 +anteater.n.02 anteater.n.02 +dachshund.n.01 carnivore.n.01 +eastern_dasyure.n.01 dasyurid_marsupial.n.01 +marco_polo_sheep.n.01 ungulate.n.01 +homo.n.02 placental.n.01 +irish_terrier.n.01 dog.n.01 +terrier.n.01 canine.n.02 +dolphin.n.02 mammal.n.01 +northern_flying_squirrel.n.01 placental.n.01 +american_bison.n.01 ruminant.n.01 +water_vole.n.01 water_vole.n.01 +uakari.n.01 uakari.n.01 +kiang.n.01 ungulate.n.01 +cape_buffalo.n.01 cape_buffalo.n.01 +small_civet.n.01 viverrine.n.01 +aperea.n.01 placental.n.01 +argali.n.01 even-toed_ungulate.n.01 +aegyptopithecus.n.01 placental.n.01 +siberian_husky.n.01 dog.n.01 +horseshoe_bat.n.01 placental.n.01 +golden_mole.n.01 mole.n.06 +common_shrew.n.01 shrew.n.02 +tennessee_walker.n.01 tennessee_walker.n.01 +chipmunk.n.01 chipmunk.n.01 +pouched_mole.n.01 mammal.n.01 +sperm_whale.n.01 cetacean.n.01 +three-year-old_horse.n.01 equine.n.01 +skye_terrier.n.01 carnivore.n.01 +collared_peccary.n.01 collared_peccary.n.01 +lapin.n.02 placental.n.01 +devon.n.02 mammal.n.01 +white-lipped_peccary.n.01 white-lipped_peccary.n.01 +pinche.n.01 marmoset.n.01 +mountain_goat.n.01 placental.n.01 +domestic_llama.n.01 placental.n.01 +european_water_shrew.n.01 mammal.n.01 +monotreme.n.01 prototherian.n.01 +siberian_husky.n.01 carnivore.n.01 +burmese_cat.n.01 carnivore.n.01 +bat.n.01 mammal.n.01 +toy_terrier.n.01 dog.n.01 +galago.n.01 mammal.n.01 +opossum_rat.n.01 marsupial.n.01 +cocker_spaniel.n.01 canine.n.02 +goral.n.01 placental.n.01 +european_lemming.n.01 mammal.n.01 +bloodhound.n.01 hunting_dog.n.01 +staghound.n.01 placental.n.01 +mustang.n.01 horse.n.01 +viscacha.n.01 placental.n.01 +gomphothere.n.01 placental.n.01 +buck.n.05 placental.n.01 +roebuck.n.01 mammal.n.01 +pronghorn.n.01 even-toed_ungulate.n.01 +white_whale.n.01 dolphin.n.02 +galloway.n.02 bovid.n.01 +poodle.n.01 dog.n.01 +water_rat.n.03 water_rat.n.03 +aoudad.n.01 mammal.n.01 +police_dog.n.01 mammal.n.01 +aperea.n.01 aperea.n.01 +wild_horse.n.01 mammal.n.01 +horse.n.01 ungulate.n.01 +domestic_cat.n.01 domestic_cat.n.01 +european_wood_mouse.n.01 european_wood_mouse.n.01 +pariah_dog.n.01 pariah_dog.n.01 +bull.n.01 bull.n.01 +kob.n.01 ruminant.n.01 +blue_fox.n.01 arctic_fox.n.01 +sambar.n.01 mammal.n.01 +mediterranean_water_shrew.n.01 shrew.n.02 +jaculus_jaculus.n.01 placental.n.01 +red_wolf.n.01 canine.n.02 +prairie_vole.n.01 placental.n.01 +kelpie.n.02 kelpie.n.02 +common_eland.n.01 ruminant.n.01 +hoary_marmot.n.01 rodent.n.01 +domestic_cat.n.01 mammal.n.01 +grey_whale.n.01 baleen_whale.n.01 +mediterranean_water_shrew.n.01 placental.n.01 +common_dolphin.n.01 mammal.n.01 +weasel.n.02 weasel.n.02 +water_dog.n.02 placental.n.01 +courser.n.03 placental.n.01 +right_whale.n.01 mammal.n.01 +procyonid.n.01 mammal.n.01 +atlantic_walrus.n.01 placental.n.01 +bat.n.01 placental.n.01 +english_springer.n.01 spaniel.n.01 +imperial_mammoth.n.01 mammal.n.01 +nonstarter.n.02 nonstarter.n.02 +burro.n.01 placental.n.01 +sperm_whale.n.01 toothed_whale.n.01 +brown_hyena.n.01 placental.n.01 +eastern_lowland_gorilla.n.01 anthropoid_ape.n.01 +swine.n.01 placental.n.01 +large_civet.n.01 carnivore.n.01 +jird.n.01 rodent.n.01 +spouter.n.03 aquatic_mammal.n.01 +lionet.n.01 big_cat.n.01 +bear.n.01 mammal.n.01 +watchdog.n.02 mammal.n.01 +hack.n.07 placental.n.01 +homo_habilis.n.01 placental.n.01 +dairy_cattle.n.01 dairy_cattle.n.01 +pembroke.n.01 placental.n.01 +cavalry_horse.n.01 horse.n.01 +red_squirrel.n.02 tree_squirrel.n.01 +serow.n.01 placental.n.01 +pademelon.n.01 kangaroo.n.01 +africander.n.01 even-toed_ungulate.n.01 +rat_kangaroo.n.01 mammal.n.01 +serow.n.01 bovid.n.01 +guano_bat.n.01 freetail.n.01 +saint_bernard.n.01 mammal.n.01 +american_mastodon.n.01 proboscidean.n.01 +gomphothere.n.01 gomphothere.n.01 +stirk.n.01 even-toed_ungulate.n.01 +omaha.n.04 ungulate.n.01 +river_dolphin.n.01 aquatic_mammal.n.01 +roe_deer.n.01 ungulate.n.01 +sand_cat.n.01 sand_cat.n.01 +dugong.n.01 aquatic_mammal.n.01 +pacific_bottlenose_dolphin.n.01 pacific_bottlenose_dolphin.n.01 +porcupine.n.01 placental.n.01 +unguiculate.n.01 placental.n.01 +goral.n.01 ruminant.n.01 +english_setter.n.01 canine.n.02 +oryx.n.01 bovid.n.01 +javanthropus.n.01 placental.n.01 +longwool.n.01 mammal.n.01 +water_shrew.n.01 mammal.n.01 +steller's_sea_cow.n.01 placental.n.01 +bulldog.n.01 dog.n.01 +domestic_ass.n.01 ungulate.n.01 +kuvasz.n.01 placental.n.01 +rhesus.n.01 placental.n.01 +bitch.n.04 placental.n.01 +hispid_pocket_mouse.n.01 rodent.n.01 +sow.n.01 sow.n.01 +pinto.n.01 pinto.n.01 +eastern_pipistrel.n.01 bat.n.01 +american_shrew_mole.n.01 insectivore.n.01 +liver_chestnut.n.01 mammal.n.01 +black_rat.n.01 black_rat.n.01 +hampshire.n.02 even-toed_ungulate.n.01 +woolly_mammoth.n.01 woolly_mammoth.n.01 +griffon.n.03 placental.n.01 +harvest_mouse.n.02 mouse.n.01 +przewalski's_horse.n.01 mammal.n.01 +kit_fox.n.01 fox.n.01 +pricket.n.02 even-toed_ungulate.n.01 +boarhound.n.01 dog.n.01 +setter.n.02 dog.n.01 +brown_lemming.n.01 lemming.n.01 +german_short-haired_pointer.n.01 carnivore.n.01 +genet.n.03 viverrine.n.01 +lerot.n.01 mammal.n.01 +pallid_bat.n.01 bat.n.01 +marsh_hare.n.01 lagomorph.n.01 +steeplechaser.n.01 steeplechaser.n.01 +proboscis_monkey.n.01 mammal.n.01 +stud.n.04 stallion.n.01 +alaska_fur_seal.n.01 fur_seal.n.01 +dusky-footed_wood_rat.n.01 mammal.n.01 +alley_cat.n.01 mammal.n.01 +rabbit.n.01 leporid.n.01 +false_saber-toothed_tiger.n.01 feline.n.01 +two-toed_sloth.n.01 two-toed_sloth.n.01 +liver_chestnut.n.01 horse.n.01 +pointer.n.04 sporting_dog.n.01 +cow.n.01 cow.n.01 +pony.n.01 pony.n.01 +canada_porcupine.n.01 porcupine.n.01 +onager.n.02 ass.n.03 +yak.n.02 bovine.n.01 +meadow_vole.n.01 meadow_vole.n.01 +marmoset.n.01 marmoset.n.01 +ground_squirrel.n.02 ground_squirrel.n.02 +dusky-footed_woodrat.n.01 wood_rat.n.01 +blue_whale.n.01 blue_whale.n.01 +german_short-haired_pointer.n.01 german_short-haired_pointer.n.01 +gorilla.n.01 anthropoid_ape.n.01 +lincoln.n.03 sheep.n.01 +lesser_rorqual.n.01 placental.n.01 +bandicoot.n.01 marsupial.n.01 +porpoise.n.01 cetacean.n.01 +ruminant.n.01 mammal.n.01 +flying_mouse.n.01 phalanger.n.01 +springer_spaniel.n.01 spaniel.n.01 +pilot_whale.n.01 whale.n.02 +lippizan.n.01 odd-toed_ungulate.n.01 +alaskan_brown_bear.n.01 mammal.n.01 +algeripithecus_minutus.n.01 placental.n.01 +retriever.n.01 placental.n.01 +golden_retriever.n.01 retriever.n.01 +eastern_woodrat.n.01 mammal.n.01 +blue_point_siamese.n.01 siamese_cat.n.01 +percheron.n.01 workhorse.n.02 +squirrel_monkey.n.01 squirrel_monkey.n.01 +gallant_fox.n.01 placental.n.01 +big_brown_bat.n.01 vespertilian_bat.n.01 +barbary_ape.n.01 macaque.n.01 +english_foxhound.n.01 hound.n.01 +anoa.n.01 mammal.n.01 +gee-gee.n.01 horse.n.01 +glutton.n.02 placental.n.01 +southern_flying_squirrel.n.01 rodent.n.01 +waterbuck.n.01 antelope.n.01 +killer_whale.n.01 mammal.n.01 +south_american_sea_lion.n.01 south_american_sea_lion.n.01 +stepper.n.03 stepper.n.03 +clydesdale.n.01 clydesdale.n.01 +stud.n.04 horse.n.01 +moke.n.01 domestic_ass.n.01 +northern_pocket_gopher.n.01 pocket_rat.n.01 +quarter_horse.n.01 saddle_horse.n.01 +omaha.n.04 mammal.n.01 +spaniel.n.01 sporting_dog.n.01 +gordon_setter.n.01 carnivore.n.01 +courser.n.03 dog.n.01 +wolfhound.n.01 mammal.n.01 +newfoundland.n.01 newfoundland.n.01 +vaquita.n.01 whale.n.02 +thoroughbred.n.02 equine.n.01 +siberian_husky.n.01 working_dog.n.01 +palfrey.n.01 equine.n.01 +crabeater_seal.n.01 aquatic_mammal.n.01 +caracal.n.01 wildcat.n.03 +large_civet.n.01 mammal.n.01 +stablemate.n.01 equine.n.01 +chestnut.n.06 mammal.n.01 +three-year-old_horse.n.01 ungulate.n.01 +water_chevrotain.n.01 ungulate.n.01 +merino.n.01 ungulate.n.01 +australopithecus_africanus.n.01 australopithecus_africanus.n.01 +green_monkey.n.01 primate.n.02 +hairy-legged_vampire_bat.n.01 carnivorous_bat.n.01 +vervet.n.01 mammal.n.01 +labrador_retriever.n.01 canine.n.02 +eurasian_badger.n.01 badger.n.02 +leopard.n.02 big_cat.n.01 +eskimo_dog.n.01 canine.n.02 +dark_horse.n.02 ungulate.n.01 +norwegian_elkhound.n.01 hound.n.01 +polecat.n.02 mammal.n.01 +anthropoid.n.02 primate.n.02 +silky_terrier.n.01 terrier.n.01 +warhorse.n.03 placental.n.01 +fissiped_mammal.n.01 carnivore.n.01 +jackal.n.01 mammal.n.01 +dairy_cattle.n.01 even-toed_ungulate.n.01 +hispid_pocket_mouse.n.01 mammal.n.01 +bottle-nosed_whale.n.01 toothed_whale.n.01 +lioness.n.01 lion.n.01 +terrier.n.01 placental.n.01 +bear.n.01 bear.n.01 +gordon_setter.n.01 placental.n.01 +shih-tzu.n.01 toy_dog.n.01 +ground_sloth.n.01 edentate.n.01 +columbian_mammoth.n.01 pachyderm.n.01 +red_wolf.n.01 wolf.n.01 +capuchin.n.02 primate.n.02 +aberdeen_angus.n.01 mammal.n.01 +gib.n.02 feline.n.01 +count_fleet.n.01 racehorse.n.01 +nonstarter.n.02 horse.n.01 +columbian_mammoth.n.01 mammoth.n.01 +mountain_chinchilla.n.01 mountain_chinchilla.n.01 +kanchil.n.01 placental.n.01 +tortoiseshell.n.03 placental.n.01 +water_vole.n.01 placental.n.01 +brown_swiss.n.01 brown_swiss.n.01 +anoa.n.01 anoa.n.01 +lion_cub.n.01 lion_cub.n.01 +flat-coated_retriever.n.01 sporting_dog.n.01 +potto.n.02 placental.n.01 +arctic_ground_squirrel.n.01 mammal.n.01 +pilot_whale.n.01 toothed_whale.n.01 +walrus.n.01 mammal.n.01 +harbor_porpoise.n.01 whale.n.02 +bearded_seal.n.01 placental.n.01 +grey_lemming.n.01 rodent.n.01 +toothed_whale.n.01 aquatic_mammal.n.01 +mexican_pocket_mouse.n.01 rodent.n.01 +milking_shorthorn.n.01 placental.n.01 +pinto.n.01 odd-toed_ungulate.n.01 +hampshire.n.02 domestic_sheep.n.01 +gib.n.02 carnivore.n.01 +african_elephant.n.01 mammal.n.01 +black-tailed_deer.n.01 placental.n.01 +mouflon.n.01 even-toed_ungulate.n.01 +humpback.n.03 mammal.n.01 +american_water_spaniel.n.01 sporting_dog.n.01 +rodent.n.01 placental.n.01 +mouse.n.01 mammal.n.01 +leopard_cat.n.01 carnivore.n.01 +jird.n.01 mammal.n.01 +musteline_mammal.n.01 mammal.n.01 +jerboa_kangaroo.n.01 mammal.n.01 +hampshire.n.02 ungulate.n.01 +striped_skunk.n.01 striped_skunk.n.01 +longtail_weasel.n.01 carnivore.n.01 +collared_peccary.n.01 placental.n.01 +porpoise.n.01 porpoise.n.01 +old_world_beaver.n.01 mammal.n.01 +western_grey_squirrel.n.01 rodent.n.01 +harrier.n.02 carnivore.n.01 +american_staffordshire_terrier.n.01 dog.n.01 +mexican_hairless.n.01 mammal.n.01 +arabian.n.02 horse.n.01 +walker_hound.n.01 mammal.n.01 +alpaca.n.03 placental.n.01 +walker_hound.n.01 dog.n.01 +proboscidean.n.01 placental.n.01 +steeplechaser.n.01 placental.n.01 +fissipedia.n.01 fissipedia.n.01 +ox.n.01 ruminant.n.01 +saki.n.03 mammal.n.01 +brown_swiss.n.01 bovid.n.01 +royal.n.02 mammal.n.01 +thoroughbred.n.02 ungulate.n.01 +australian_terrier.n.01 terrier.n.01 +wirehair.n.01 mammal.n.01 +steenbok.n.01 even-toed_ungulate.n.01 +ferret.n.02 mammal.n.01 +kinkajou.n.01 mammal.n.01 +wolf_pup.n.01 placental.n.01 +vicuna.n.03 mammal.n.01 +lakeland_terrier.n.01 mammal.n.01 +skye_terrier.n.01 dog.n.01 +american_water_shrew.n.01 water_shrew.n.01 +white-tailed_jackrabbit.n.01 leporid.n.01 +tiger_cat.n.02 feline.n.01 +humpback.n.03 whale.n.02 +cob.n.02 odd-toed_ungulate.n.01 +coondog.n.01 carnivore.n.01 +west_highland_white_terrier.n.01 hunting_dog.n.01 +cavalry_horse.n.01 odd-toed_ungulate.n.01 +attack_dog.n.01 mammal.n.01 +ungulata.n.01 mammal.n.01 +gazella_subgutturosa.n.01 antelope.n.01 +angwantibo.n.01 mammal.n.01 +fox_terrier.n.01 mammal.n.01 +sealyham_terrier.n.01 dog.n.01 +irish_setter.n.01 carnivore.n.01 +palomino.n.01 placental.n.01 +ocelot.n.01 mammal.n.01 +cynopterus_sphinx.n.01 fruit_bat.n.01 +mandrill.n.01 placental.n.01 +patas.n.01 old_world_monkey.n.01 +black-tailed_deer.n.01 ungulate.n.01 +hooded_seal.n.01 placental.n.01 +shire.n.02 equine.n.01 +boskop_man.n.01 homo_sapiens.n.01 +elk.n.01 mammal.n.01 +muishond.n.01 mammal.n.01 +american_staffordshire_terrier.n.01 placental.n.01 +hunting_dog.n.01 canine.n.02 +american_harvest_mouse.n.01 american_harvest_mouse.n.01 +dark_horse.n.02 placental.n.01 +otter_shrew.n.01 otter_shrew.n.01 +grison.n.01 mammal.n.01 +brahman.n.04 brahman.n.04 +bandicoot_rat.n.01 bandicoot_rat.n.01 +black-and-tan_coonhound.n.01 coonhound.n.01 +mylodon.n.01 placental.n.01 +mountain_chinchilla.n.01 rodent.n.01 +kerry_blue_terrier.n.01 kerry_blue_terrier.n.01 +brabancon_griffon.n.01 canine.n.02 +grey.n.07 grey.n.07 +rock_wallaby.n.01 metatherian.n.01 +citation.n.06 racehorse.n.01 +manul.n.01 manul.n.01 +western_grey_squirrel.n.01 western_grey_squirrel.n.01 +anthropoid_ape.n.01 anthropoid_ape.n.01 +antelope_squirrel.n.01 squirrel.n.01 +bucking_bronco.n.01 pony.n.01 +maltese_dog.n.01 placental.n.01 +pinniped_mammal.n.01 mammal.n.01 +common_raccoon.n.01 carnivore.n.01 +anoa.n.01 ungulate.n.01 +dwarf_sperm_whale.n.01 mammal.n.01 +sea_otter.n.01 placental.n.01 +mouflon.n.01 bovid.n.01 +pole_horse.n.02 odd-toed_ungulate.n.01 +orange_bat.n.01 orange_bat.n.01 +water_chevrotain.n.01 even-toed_ungulate.n.01 +taguan.n.01 asiatic_flying_squirrel.n.01 +ermine.n.02 carnivore.n.01 +scotch_terrier.n.01 dog.n.01 +mountain_chinchilla.n.01 mammal.n.01 +dasyure.n.01 dasyurid_marsupial.n.01 +golden_hamster.n.01 placental.n.01 +pithecanthropus.n.01 hominid.n.01 +draft_horse.n.01 odd-toed_ungulate.n.01 +crab-eating_macaque.n.01 crab-eating_macaque.n.01 +polo_pony.n.01 placental.n.01 +standard_schnauzer.n.01 schnauzer.n.01 +crab-eating_opossum.n.01 mammal.n.01 +stirk.n.01 ruminant.n.01 +tibetan_mastiff.n.01 mastiff.n.01 +feist.n.01 cur.n.01 +striped_skunk.n.01 placental.n.01 +brown_bear.n.01 bear.n.01 +mountain_zebra.n.01 equine.n.01 +western_lowland_gorilla.n.01 great_ape.n.01 +keeshond.n.01 placental.n.01 +cashmere_goat.n.01 ruminant.n.01 +ocelot.n.01 ocelot.n.01 +tiger_cat.n.02 mammal.n.01 +narwhal.n.01 mammal.n.01 +grampus.n.02 toothed_whale.n.01 +beaked_whale.n.01 placental.n.01 +red_fox.n.03 canine.n.02 +hind.n.02 red_deer.n.01 +zebra.n.01 placental.n.01 +camel.n.01 placental.n.01 +grey_fox.n.01 fox.n.01 +jackass_bat.n.01 vespertilian_bat.n.01 +wild_goat.n.01 bovid.n.01 +australopithecus_africanus.n.01 mammal.n.01 +palm_cat.n.01 placental.n.01 +solo_man.n.01 homo_soloensis.n.01 +cow.n.02 mammal.n.01 +potoroo.n.01 metatherian.n.01 +cow_pony.n.01 cow_pony.n.01 +borzoi.n.01 borzoi.n.01 +irish_terrier.n.01 irish_terrier.n.01 +coati.n.01 mammal.n.01 +steed.n.01 steed.n.01 +shetland_pony.n.01 placental.n.01 +kelpie.n.02 shepherd_dog.n.01 +syrian_bear.n.01 placental.n.01 +devon.n.02 ruminant.n.01 +whippet.n.01 whippet.n.01 +digitigrade_mammal.n.01 placental.n.01 +yellowbelly_marmot.n.01 mammal.n.01 +two-toed_sloth.n.02 edentate.n.01 +morgan.n.06 placental.n.01 +chevrotain.n.01 chevrotain.n.01 +orange_bat.n.01 carnivorous_bat.n.01 +silky_anteater.n.01 silky_anteater.n.01 +american_badger.n.01 carnivore.n.01 +african_hunting_dog.n.01 placental.n.01 +barren_ground_caribou.n.01 ungulate.n.01 +springer_spaniel.n.01 hunting_dog.n.01 +welsh_terrier.n.01 dog.n.01 +blenheim_spaniel.n.01 carnivore.n.01 +harp_seal.n.01 mammal.n.01 +poodle.n.01 carnivore.n.01 +new_world_beaver.n.01 rodent.n.01 +kit_fox.n.01 canine.n.02 +marmoset.n.01 new_world_monkey.n.01 +pere_david's_deer.n.01 ruminant.n.01 +stallion.n.01 mammal.n.01 +wild_horse.n.01 ungulate.n.01 +ayrshire.n.01 even-toed_ungulate.n.01 +white_rhinoceros.n.01 mammal.n.01 +siamang.n.01 anthropoid_ape.n.01 +lionet.n.01 carnivore.n.01 +shetland_sheepdog.n.01 mammal.n.01 +gopher.n.04 rodent.n.01 +kudu.n.01 bovid.n.01 +omaha.n.04 racehorse.n.01 +spaniel.n.01 dog.n.01 +unguiculata.n.01 mammal.n.01 +odd-toed_ungulate.n.01 mammal.n.01 +ichneumon.n.01 placental.n.01 +argali.n.01 ruminant.n.01 +california_sea_lion.n.01 aquatic_mammal.n.01 +chow.n.03 placental.n.01 +german_shepherd.n.01 german_shepherd.n.01 +bison.n.01 bison.n.01 +billy.n.02 billy.n.02 +great_dane.n.01 great_dane.n.01 +scotch_terrier.n.01 canine.n.02 +guide_dog.n.01 mammal.n.01 +bullock.n.02 cattle.n.01 +white_rhinoceros.n.01 rhinoceros.n.01 +hackney.n.02 harness_horse.n.01 +white-lipped_peccary.n.01 ungulate.n.01 +striped_skunk.n.01 skunk.n.04 +otterhound.n.01 hunting_dog.n.01 +pentail.n.01 placental.n.01 +aurochs.n.02 mammal.n.01 +setter.n.02 sporting_dog.n.01 +opossum_rat.n.01 opossum_rat.n.01 +cactus_mouse.n.01 wood_mouse.n.01 +big_brown_bat.n.01 mammal.n.01 +peccary.n.01 placental.n.01 +columbian_mammoth.n.01 columbian_mammoth.n.01 +sea_cow.n.01 mammal.n.01 +capybara.n.01 capybara.n.01 +starnose_mole.n.01 starnose_mole.n.01 +kid.n.05 ungulate.n.01 +entlebucher.n.01 mammal.n.01 +blue_whale.n.01 placental.n.01 +irish_terrier.n.01 carnivore.n.01 +standard_poodle.n.01 placental.n.01 +bison.n.01 ungulate.n.01 +charger.n.01 placental.n.01 +maltese.n.03 maltese.n.03 +zinjanthropus.n.01 australopithecine.n.01 +morgan.n.06 morgan.n.06 +brocket.n.01 brocket.n.01 +pine_marten.n.01 musteline_mammal.n.01 +angora.n.03 angora.n.03 +hack.n.07 ungulate.n.01 +western_pipistrel.n.01 placental.n.01 +arctic_fox.n.01 carnivore.n.01 +caracal.n.01 carnivore.n.01 +cocker_spaniel.n.01 spaniel.n.01 +guano_bat.n.01 bat.n.01 +swamp_rabbit.n.02 leporid.n.01 +european_lemming.n.01 placental.n.01 +dall_sheep.n.01 ruminant.n.01 +leopardess.n.01 mammal.n.01 +abrocome.n.01 abrocome.n.01 +burro.n.01 ungulate.n.01 +colobus.n.01 monkey.n.01 +buckskin.n.01 horse.n.01 +sinanthropus.n.01 mammal.n.01 +bottlenose_dolphin.n.01 cetacean.n.01 +hackney.n.02 equine.n.01 +durham.n.02 mammal.n.01 +eastern_cottontail.n.01 rabbit.n.01 +mountain_paca.n.01 rodent.n.01 +eskimo_dog.n.01 carnivore.n.01 +canada_lynx.n.01 mammal.n.01 +samoyed.n.03 canine.n.02 +arabian.n.02 saddle_horse.n.01 +atlantic_bottlenose_dolphin.n.01 aquatic_mammal.n.01 +bezoar_goat.n.01 bovid.n.01 +tiger_cub.n.01 carnivore.n.01 +fur_seal.n.01 mammal.n.01 +american_bison.n.01 bovid.n.01 +raccoon_dog.n.01 wild_dog.n.01 +mountain_zebra.n.01 mountain_zebra.n.01 +guadalupe_fur_seal.n.01 aquatic_mammal.n.01 +pithecanthropus.n.01 pithecanthropus.n.01 +standard_schnauzer.n.01 placental.n.01 +belgian_sheepdog.n.01 shepherd_dog.n.01 +citation.n.06 horse.n.01 +whale.n.02 whale.n.02 +walrus.n.01 walrus.n.01 +jersey.n.05 ruminant.n.01 +aegyptopithecus.n.01 aegyptopithecus.n.01 +mole_rat.n.01 rodent.n.01 +staffordshire_bullterrier.n.01 canine.n.02 +bullock.n.01 bullock.n.01 +douroucouli.n.01 new_world_monkey.n.01 +durham.n.02 ungulate.n.01 +hack.n.08 horse.n.01 +field_spaniel.n.01 field_spaniel.n.01 +two-year-old_horse.n.01 ungulate.n.01 +european_wildcat.n.01 wildcat.n.03 +musk_ox.n.01 even-toed_ungulate.n.01 +rogue_elephant.n.01 mammal.n.01 +steenbok.n.01 antelope.n.01 +leopard.n.02 feline.n.01 +wombat.n.01 metatherian.n.01 +solo_man.n.01 mammal.n.01 +great_dane.n.01 placental.n.01 +armadillo.n.01 placental.n.01 +gorilla.n.01 mammal.n.01 +vizsla.n.01 canine.n.02 +saiga.n.01 bovid.n.01 +finback.n.01 placental.n.01 +yellow-throated_marten.n.01 marten.n.01 +new_world_porcupine.n.01 placental.n.01 +paranthropus.n.01 primate.n.02 +toy_terrier.n.01 toy_dog.n.01 +harrier.n.02 placental.n.01 +mountain_beaver.n.01 mammal.n.01 +siamese_cat.n.01 mammal.n.01 +tiger_cat.n.01 cat.n.01 +tamarau.n.01 bovid.n.01 +wood_mouse.n.01 mammal.n.01 +canada_porcupine.n.01 canada_porcupine.n.01 +dingo.n.01 placental.n.01 +labrador_retriever.n.01 retriever.n.01 +aardwolf.n.01 canine.n.02 +cro-magnon.n.01 primate.n.02 +hognose_bat.n.01 leafnose_bat.n.01 +rock_wallaby.n.01 rock_wallaby.n.01 +gaur.n.01 placental.n.01 +mapinguari.n.01 placental.n.01 +welsh_terrier.n.01 wirehair.n.01 +bongo.n.02 even-toed_ungulate.n.01 +lion.n.01 big_cat.n.01 +english_foxhound.n.01 hunting_dog.n.01 +rock_hyrax.n.01 hyrax.n.01 +dusky-footed_wood_rat.n.01 rodent.n.01 +dik-dik.n.01 placental.n.01 +siamese_cat.n.01 domestic_cat.n.01 +suslik.n.01 ground_squirrel.n.02 +setter.n.02 carnivore.n.01 +sorrel.n.05 placental.n.01 +rhesus.n.01 old_world_monkey.n.01 +two-toed_sloth.n.01 sloth.n.02 +thylacine.n.01 metatherian.n.01 +guanaco.n.01 guanaco.n.01 +lerot.n.01 rodent.n.01 +corgi.n.01 mammal.n.01 +world.n.08 homo.n.02 +longhorn.n.01 longhorn.n.01 +antelope.n.01 antelope.n.01 +naked_mole_rat.n.01 naked_mole_rat.n.01 +kob.n.01 kob.n.01 +sennenhunde.n.01 dog.n.01 +scotch_terrier.n.01 carnivore.n.01 +canada_lynx.n.01 cat.n.01 +norwich_terrier.n.01 dog.n.01 +loir.n.01 dormouse.n.01 +great_dane.n.01 dog.n.01 +mouse-eared_bat.n.01 carnivorous_bat.n.01 +coydog.n.01 wolf.n.01 +snowshoe_hare.n.01 hare.n.01 +brabancon_griffon.n.01 placental.n.01 +vaquita.n.01 aquatic_mammal.n.01 +pocket_mouse.n.01 rodent.n.01 +tree_wallaby.n.01 metatherian.n.01 +brocket.n.01 ungulate.n.01 +male_horse.n.01 equine.n.01 +american_badger.n.01 american_badger.n.01 +homo_erectus.n.01 placental.n.01 +burro.n.01 ass.n.03 +west_highland_white_terrier.n.01 placental.n.01 +common_lynx.n.01 placental.n.01 +crowbait.n.01 ungulate.n.01 +hack.n.08 mammal.n.01 +bouvier_des_flandres.n.01 carnivore.n.01 +pichiciago.n.01 mammal.n.01 +anteater.n.02 placental.n.01 +angora.n.04 cat.n.01 +black-footed_ferret.n.01 carnivore.n.01 +white-footed_mouse.n.01 mouse.n.01 +cougar.n.01 carnivore.n.01 +polar_hare.n.01 leporid.n.01 +water_vole.n.02 mammal.n.01 +field_spaniel.n.01 carnivore.n.01 +boarhound.n.01 carnivore.n.01 +syrian_bear.n.01 syrian_bear.n.01 +boston_bull.n.01 canine.n.02 +german_shepherd.n.01 working_dog.n.01 +pichiciago.n.01 edentate.n.01 +jennet.n.01 odd-toed_ungulate.n.01 +nonstarter.n.02 racehorse.n.01 +hampshire.n.02 bovid.n.01 +hog.n.03 even-toed_ungulate.n.01 +giant_schnauzer.n.01 canine.n.02 +wire-haired_fox_terrier.n.01 mammal.n.01 +musk_ox.n.01 musk_ox.n.01 +hooded_seal.n.01 earless_seal.n.01 +numbat.n.01 mammal.n.01 +sorrel.n.05 ungulate.n.01 +elk.n.01 elk.n.01 +cow_pony.n.01 horse.n.01 +bullock.n.01 bovid.n.01 +chacma.n.01 placental.n.01 +eastern_lowland_gorilla.n.01 placental.n.01 +goral.n.01 mammal.n.01 +eland.n.01 ruminant.n.01 +algeripithecus_minutus.n.01 mammal.n.01 +babirusa.n.01 placental.n.01 +tiglon.n.01 carnivore.n.01 +glutton.n.02 glutton.n.02 +vespertilian_bat.n.01 placental.n.01 +mule.n.01 odd-toed_ungulate.n.01 +yearling.n.02 ungulate.n.01 +brown_swiss.n.01 cattle.n.01 +appenzeller.n.01 carnivore.n.01 +new_world_porcupine.n.01 new_world_porcupine.n.01 +tarpan.n.01 equine.n.01 +burmese_cat.n.01 placental.n.01 +ibex.n.01 goat.n.01 +kangaroo_rat.n.01 kangaroo_rat.n.01 +pacer.n.01 pacer.n.01 +muntjac.n.01 placental.n.01 +lechwe.n.01 bovid.n.01 +merino.n.01 sheep.n.01 +walker_hound.n.01 canine.n.02 +boston_bull.n.01 terrier.n.01 +dachshund.n.01 dachshund.n.01 +tarpan.n.01 placental.n.01 +cape_buffalo.n.01 old_world_buffalo.n.01 +kangaroo_mouse.n.01 mammal.n.01 +homo_erectus.n.01 mammal.n.01 +pteropus_capestratus.n.01 fruit_bat.n.01 +silky_pocket_mouse.n.01 mammal.n.01 +spitz.n.01 canine.n.02 +reynard.n.01 canine.n.02 +yellowbelly_marmot.n.01 placental.n.01 +hippopotamus.n.01 mammal.n.01 +prairie_dog.n.01 rodent.n.01 +american_staffordshire_terrier.n.01 carnivore.n.01 +brittany_spaniel.n.01 hunting_dog.n.01 +pekinese.n.01 dog.n.01 +abyssinian.n.01 feline.n.01 +guereza.n.01 mammal.n.01 +tusker.n.01 tusker.n.01 +ibex.n.01 wild_goat.n.01 +hound.n.01 hound.n.01 +plantigrade_mammal.n.01 placental.n.01 +bactrian_camel.n.01 mammal.n.01 +hippopotamus.n.01 ungulate.n.01 +vaquita.n.01 cetacean.n.01 +pariah_dog.n.01 canine.n.02 +jaguarundi.n.01 feline.n.01 +ass.n.03 mammal.n.01 +fox_terrier.n.01 canine.n.02 +sewer_rat.n.01 sewer_rat.n.01 +eastern_dasyure.n.01 metatherian.n.01 +terrier.n.01 hunting_dog.n.01 +addax.n.01 antelope.n.01 +sloth_bear.n.01 placental.n.01 +peccary.n.01 even-toed_ungulate.n.01 +domestic_sheep.n.01 ungulate.n.01 +mangabey.n.01 placental.n.01 +weimaraner.n.01 weimaraner.n.01 +new_world_mouse.n.01 new_world_mouse.n.01 +carnivore.n.01 mammal.n.01 +musk_deer.n.01 ungulate.n.01 +spider_monkey.n.01 mammal.n.01 +alpaca.n.03 mammal.n.01 +kelpie.n.02 carnivore.n.01 +giant_schnauzer.n.01 dog.n.01 +old_world_beaver.n.01 old_world_beaver.n.01 +common_wallaby.n.01 wallaby.n.01 +edentate.n.01 edentate.n.01 +lechwe.n.01 even-toed_ungulate.n.01 +river_otter.n.01 musteline_mammal.n.01 +striped_skunk.n.01 carnivore.n.01 +ibizan_hound.n.01 hunting_dog.n.01 +fawn.n.02 ruminant.n.01 +hearing_dog.n.01 placental.n.01 +snake_muishond.n.01 placental.n.01 +irish_water_spaniel.n.01 spaniel.n.01 +toy_terrier.n.01 placental.n.01 +gee-gee.n.01 mammal.n.01 +working_dog.n.01 mammal.n.01 +bucking_bronco.n.01 horse.n.01 +fox.n.01 carnivore.n.01 +rottweiler.n.01 working_dog.n.01 +bandicoot.n.01 metatherian.n.01 +mole_rat.n.02 rodent.n.01 +saluki.n.01 carnivore.n.01 +sei_whale.n.01 aquatic_mammal.n.01 +welsh_pony.n.01 pony.n.05 +gerenuk.n.01 bovid.n.01 +black_rhinoceros.n.01 odd-toed_ungulate.n.01 +hamster.n.01 rodent.n.01 +protohippus.n.01 placental.n.01 +blackbuck.n.01 blackbuck.n.01 +leopardess.n.01 carnivore.n.01 +greater_swiss_mountain_dog.n.01 mammal.n.01 +stirk.n.01 stirk.n.01 +doe.n.02 doe.n.02 +morgan.n.06 equine.n.01 +longtail_weasel.n.01 longtail_weasel.n.01 +striped_hyena.n.01 carnivore.n.01 +brown_hyena.n.01 mammal.n.01 +anteater.n.02 edentate.n.01 +saddle_horse.n.01 placental.n.01 +slow_loris.n.01 primate.n.02 +cotswold.n.01 even-toed_ungulate.n.01 +patas.n.01 primate.n.02 +stoat.n.01 mammal.n.01 +snake_muishond.n.01 carnivore.n.01 +tarsius_glis.n.01 mammal.n.01 +brush-tailed_porcupine.n.01 brush-tailed_porcupine.n.01 +striped_hyena.n.01 mammal.n.01 +tatouay.n.01 mammal.n.01 +grevy's_zebra.n.01 mammal.n.01 +kit_fox.n.01 carnivore.n.01 +fox_terrier.n.01 hunting_dog.n.01 +assault.n.03 horse.n.01 +common_opossum.n.01 opossum.n.02 +bottle-nosed_whale.n.01 bottle-nosed_whale.n.01 +fawn.n.02 deer.n.01 +jackass_bat.n.01 jackass_bat.n.01 +pallid_bat.n.01 vespertilian_bat.n.01 +nail-tailed_wallaby.n.01 nail-tailed_wallaby.n.01 +coach_horse.n.01 coach_horse.n.01 +clydesdale_terrier.n.01 placental.n.01 +japanese_spaniel.n.01 placental.n.01 +jersey.n.05 even-toed_ungulate.n.01 +schnauzer.n.01 schnauzer.n.01 +puppy.n.01 puppy.n.01 +lakeland_terrier.n.01 placental.n.01 +trotting_horse.n.01 racehorse.n.01 +friesian.n.01 dairy_cattle.n.01 +hound.n.01 hunting_dog.n.01 +doberman.n.01 watchdog.n.02 +ibizan_hound.n.01 canine.n.02 +coonhound.n.01 hound.n.01 +french_bulldog.n.01 carnivore.n.01 +seattle_slew.n.01 horse.n.01 +binturong.n.01 civet.n.01 +grade.n.09 even-toed_ungulate.n.01 +draft_horse.n.01 workhorse.n.02 +seeing_eye_dog.n.01 working_dog.n.01 +ox.n.02 ruminant.n.01 +suslik.n.01 mammal.n.01 +jack.n.12 ass.n.03 +pug.n.01 canine.n.02 +lion_cub.n.01 big_cat.n.01 +brood_bitch.n.01 brood_bitch.n.01 +morgan.n.06 ungulate.n.01 +false_vampire.n.01 leafnose_bat.n.01 +giant_panda.n.01 procyonid.n.01 +thylacine.n.01 dasyurid_marsupial.n.01 +ewe.n.03 ewe.n.03 +australian_sea_lion.n.01 sea_lion.n.01 +wisent.n.01 placental.n.01 +guanaco.n.01 ungulate.n.01 +giant_schnauzer.n.01 mammal.n.01 +common_opossum.n.01 metatherian.n.01 +orangutan.n.01 great_ape.n.01 +bobcat.n.01 mammal.n.01 +european_wildcat.n.01 carnivore.n.01 +great_pyrenees.n.01 placental.n.01 +virginia_deer.n.01 ungulate.n.01 +english_foxhound.n.01 mammal.n.01 +mesohippus.n.01 odd-toed_ungulate.n.01 +welsh_terrier.n.01 mammal.n.01 +apar.n.01 armadillo.n.01 +wolf_pup.n.01 wolf_pup.n.01 +giant_armadillo.n.01 placental.n.01 +aegyptopithecus.n.01 mammal.n.01 +new_world_porcupine.n.01 mammal.n.01 +rabbit_ears.n.02 rabbit.n.01 +small_civet.n.01 placental.n.01 +japanese_spaniel.n.01 dog.n.01 +homo_sapiens_sapiens.n.01 mammal.n.01 +pointer.n.04 hunting_dog.n.01 +english_toy_spaniel.n.01 placental.n.01 +ox.n.01 mammal.n.01 +vizsla.n.01 pointer.n.04 +welsh_pony.n.01 odd-toed_ungulate.n.01 +ant_bear.n.01 anteater.n.02 +bulldog.n.01 carnivore.n.01 +spaniel.n.01 spaniel.n.01 +rhodesian_man.n.01 placental.n.01 +steed.n.01 saddle_horse.n.01 +tiger.n.02 placental.n.01 +titi.n.03 placental.n.01 +european_wildcat.n.01 feline.n.01 +saint_bernard.n.01 saint_bernard.n.01 +pied_lemming.n.01 pied_lemming.n.01 +bluetick.n.01 hunting_dog.n.01 +orange_bat.n.01 leafnose_bat.n.01 +charger.n.01 equine.n.01 +vixen.n.02 vixen.n.02 +wildcat.n.03 wildcat.n.03 +common_shrew.n.01 mammal.n.01 +gaur.n.01 asian_wild_ox.n.01 +galloway.n.02 mammal.n.01 +black_squirrel.n.01 squirrel.n.01 +pony.n.01 placental.n.01 +old_world_buffalo.n.01 placental.n.01 +standard_schnauzer.n.01 carnivore.n.01 +hognose_bat.n.01 mammal.n.01 +miniature_schnauzer.n.01 hunting_dog.n.01 +great_pyrenees.n.01 dog.n.01 +bottle-nosed_whale.n.01 cetacean.n.01 +saber-toothed_tiger.n.01 placental.n.01 +raccoon_dog.n.01 canine.n.02 +samoyed.n.03 spitz.n.01 +ibizan_hound.n.01 dog.n.01 +fossorial_mammal.n.01 mammal.n.01 +maltese_dog.n.01 toy_dog.n.01 +norfolk_terrier.n.01 canine.n.02 +prancer.n.01 mammal.n.01 +rice_rat.n.01 rodent.n.01 +hazel_mouse.n.01 placental.n.01 +king_charles_spaniel.n.01 toy_spaniel.n.01 +pony.n.01 ungulate.n.01 +domestic_ass.n.01 domestic_ass.n.01 +water_spaniel.n.01 water_spaniel.n.01 +tree_wallaby.n.01 kangaroo.n.01 +bobcat.n.01 bobcat.n.01 +southern_flying_squirrel.n.01 american_flying_squirrel.n.01 +rhodesian_ridgeback.n.01 rhodesian_ridgeback.n.01 +yak.n.02 bovid.n.01 +snow_leopard.n.01 snow_leopard.n.01 +koala.n.01 phalanger.n.01 +onager.n.02 placental.n.01 +bird_dog.n.01 canine.n.02 +barren_ground_caribou.n.01 even-toed_ungulate.n.01 +white-tailed_jackrabbit.n.01 placental.n.01 +short-tailed_shrew.n.01 insectivore.n.01 +giant_eland.n.01 eland.n.01 +common_dolphin.n.01 cetacean.n.01 +sir_barton.n.01 racehorse.n.01 +spotted_hyena.n.01 spotted_hyena.n.01 +staghound.n.01 mammal.n.01 +cavalry_horse.n.01 warhorse.n.03 +pangolin.n.01 pangolin.n.01 +gayal.n.01 ruminant.n.01 +rottweiler.n.01 canine.n.02 +nonstarter.n.02 odd-toed_ungulate.n.01 +tennessee_walker.n.01 odd-toed_ungulate.n.01 +impala.n.01 ungulate.n.01 +boskop_man.n.01 mammal.n.01 +white_elephant.n.02 elephant.n.01 +zinjanthropus.n.01 primate.n.02 +grampus.n.02 mammal.n.01 +bay.n.07 bay.n.07 +english_toy_spaniel.n.01 english_toy_spaniel.n.01 +coach_horse.n.01 placental.n.01 +aurochs.n.02 bovid.n.01 +right_whale.n.01 right_whale.n.01 +french_bulldog.n.01 canine.n.02 +rock_wallaby.n.01 mammal.n.01 +baleen_whale.n.01 mammal.n.01 +thoroughbred.n.02 thoroughbred.n.02 +frosted_bat.n.01 bat.n.01 +primate.n.02 placental.n.01 +white_whale.n.01 mammal.n.01 +wheel_horse.n.01 horse.n.01 +horseshoe_bat.n.01 horseshoe_bat.n.01 +labrador_retriever.n.01 hunting_dog.n.01 +indian_buffalo.n.01 indian_buffalo.n.01 +springbok.n.01 ruminant.n.01 +tortoiseshell.n.03 feline.n.01 +pinscher.n.01 canine.n.02 +markhor.n.01 ungulate.n.01 +bull_mastiff.n.01 canine.n.02 +rhinoceros.n.01 rhinoceros.n.01 +white-footed_mouse.n.01 placental.n.01 +puku.n.01 ruminant.n.01 +hyena.n.01 carnivore.n.01 +meadow_vole.n.01 vole.n.01 +staffordshire_bullterrier.n.01 staffordshire_bullterrier.n.01 +maltese.n.03 placental.n.01 +collie.n.01 mammal.n.01 +mountain_nyala.n.01 ruminant.n.01 +pony.n.05 placental.n.01 +dasyurid_marsupial.n.01 mammal.n.01 +griffon.n.03 mammal.n.01 +brown_bear.n.01 mammal.n.01 +fox.n.01 fox.n.01 +egyptian_cat.n.01 egyptian_cat.n.01 +long-eared_bat.n.01 mammal.n.01 +silverback.n.01 gorilla.n.01 +indian_mongoose.n.01 placental.n.01 +meerkat.n.01 placental.n.01 +english_setter.n.01 english_setter.n.01 +hispid_pocket_mouse.n.01 pocket_mouse.n.01 +dandie_dinmont.n.01 hunting_dog.n.01 +hare.n.01 lagomorph.n.01 +pooch.n.01 carnivore.n.01 +seizure-alert_dog.n.01 mammal.n.01 +mouse-eared_bat.n.01 placental.n.01 +leveret.n.01 mammal.n.01 +eastern_chimpanzee.n.01 mammal.n.01 +seattle_slew.n.01 racehorse.n.01 +indian_buffalo.n.01 bovid.n.01 +mara.n.02 rodent.n.01 +water_dog.n.02 canine.n.02 +tibetan_mastiff.n.01 carnivore.n.01 +pachyderm.n.01 pachyderm.n.01 +flying_phalanger.n.01 marsupial.n.01 +labrador_retriever.n.01 mammal.n.01 +tom.n.02 mammal.n.01 +trotting_horse.n.01 horse.n.01 +argali.n.01 placental.n.01 +baronduki.n.01 rodent.n.01 +guinea_pig.n.02 placental.n.01 +banded_palm_civet.n.01 viverrine.n.01 +palfrey.n.01 palfrey.n.01 +elephant.n.01 proboscidean.n.01 +norwegian_elkhound.n.01 norwegian_elkhound.n.01 +hearing_dog.n.01 carnivore.n.01 +eohippus.n.01 eohippus.n.01 +bluetick.n.01 placental.n.01 +gaur.n.01 gaur.n.01 +marsupial.n.01 marsupial.n.01 +affenpinscher.n.01 carnivore.n.01 +mantled_ground_squirrel.n.01 mantled_ground_squirrel.n.01 +kangaroo_rat.n.01 pocket_rat.n.01 +chestnut.n.06 equine.n.01 +red_poll.n.01 cattle.n.01 +giraffe.n.01 ungulate.n.01 +mastodon.n.01 proboscidean.n.01 +miniature_pinscher.n.01 dog.n.01 +pointer.n.04 placental.n.01 +bay.n.07 mammal.n.01 +flying_lemur.n.01 flying_lemur.n.01 +dryopithecine.n.01 hominid.n.01 +carnivore.n.01 placental.n.01 +tree_shrew.n.01 tree_shrew.n.01 +black_sheep.n.02 placental.n.01 +ground_sloth.n.01 mammal.n.01 +rudapithecus.n.01 rudapithecus.n.01 +takin.n.01 takin.n.01 +giant_kangaroo.n.01 giant_kangaroo.n.01 +binturong.n.01 binturong.n.01 +mouser.n.01 mouser.n.01 +irish_water_spaniel.n.01 carnivore.n.01 +chestnut.n.06 horse.n.01 +banded_palm_civet.n.01 mammal.n.01 +pronghorn.n.01 ruminant.n.01 +brown_rat.n.01 brown_rat.n.01 +pinche.n.01 pinche.n.01 +water_buffalo.n.01 old_world_buffalo.n.01 +polo_pony.n.01 polo_pony.n.01 +ant_bear.n.01 edentate.n.01 +tayra.n.01 tayra.n.01 +brabancon_griffon.n.01 brabancon_griffon.n.01 +yorkshire_terrier.n.01 canine.n.02 +appaloosa.n.01 equine.n.01 +ayrshire.n.01 dairy_cattle.n.01 +basenji.n.01 canine.n.02 +manul.n.01 carnivore.n.01 +gopher.n.04 pocket_rat.n.01 +whitetail_prairie_dog.n.01 prairie_dog.n.01 +striped_muishond.n.01 mammal.n.01 +bactrian_camel.n.01 placental.n.01 +sewer_rat.n.01 rat.n.01 +buckskin.n.01 saddle_horse.n.01 +pygmy_marmoset.n.01 primate.n.02 +southern_bog_lemming.n.01 placental.n.01 +tiger_cat.n.02 tiger_cat.n.02 +shire.n.02 draft_horse.n.01 +dog.n.01 carnivore.n.01 +whirlaway.n.01 thoroughbred.n.02 +european_wood_mouse.n.01 rodent.n.01 +canada_porcupine.n.01 new_world_porcupine.n.01 +sable_antelope.n.01 ungulate.n.01 +mandrill.n.01 mammal.n.01 +eastern_dasyure.n.01 eastern_dasyure.n.01 +large_civet.n.01 large_civet.n.01 +kangaroo_mouse.n.01 rodent.n.01 +cave_myotis.n.01 mammal.n.01 +coypu.n.01 placental.n.01 +native_cat.n.01 dasyure.n.01 +liver-spotted_dalmatian.n.01 dog.n.01 +kerry_blue_terrier.n.01 mammal.n.01 +miniature_pinscher.n.01 placental.n.01 +fissipedia.n.01 mammal.n.01 +spearnose_bat.n.01 leafnose_bat.n.01 +prancer.n.01 ungulate.n.01 +western_grey_squirrel.n.01 mammal.n.01 +cuscus.n.01 phalanger.n.01 +bedlington_terrier.n.01 mammal.n.01 +nyala.n.02 harnessed_antelope.n.01 +hart.n.03 red_deer.n.01 +pacer.n.01 odd-toed_ungulate.n.01 +standard_schnauzer.n.01 terrier.n.01 +beaked_whale.n.01 mammal.n.01 +american_badger.n.01 placental.n.01 +waterbuck.n.01 mammal.n.01 +pygmy_chimpanzee.n.01 great_ape.n.01 +mouse.n.01 rodent.n.01 +loir.n.01 placental.n.01 +cayuse.n.01 placental.n.01 +beagle.n.01 hound.n.01 +northern_bog_lemming.n.01 placental.n.01 +grey_lemming.n.01 mammal.n.01 +australopithecus_afarensis.n.01 australopithecus_afarensis.n.01 +gerbil.n.01 gerbil.n.01 +blue_point_siamese.n.01 blue_point_siamese.n.01 +eland.n.01 eland.n.01 +hyena.n.01 mammal.n.01 +liver_chestnut.n.01 equine.n.01 +asian_wild_ox.n.01 asian_wild_ox.n.01 +dinocerate.n.01 mammal.n.01 +nonstarter.n.02 equine.n.01 +dinoceras.n.01 mammal.n.01 +caribou.n.01 ruminant.n.01 +exmoor.n.01 sheep.n.01 +eastern_chipmunk.n.01 rodent.n.01 +cinnamon_bear.n.01 placental.n.01 +freetail.n.01 placental.n.01 +quarter_horse.n.01 mammal.n.01 +santa_gertrudis.n.01 bovid.n.01 +boar.n.02 swine.n.01 +brood_bitch.n.01 bitch.n.04 +black-tailed_deer.n.01 mammal.n.01 +long-tailed_porcupine.n.01 placental.n.01 +warthog.n.01 placental.n.01 +greater_kudu.n.01 even-toed_ungulate.n.01 +panther.n.02 panther.n.02 +ichneumon.n.01 mammal.n.01 +homo_sapiens_sapiens.n.01 homo_sapiens_sapiens.n.01 +grizzly.n.01 carnivore.n.01 +saluki.n.01 canine.n.02 +langur.n.01 old_world_monkey.n.01 +potto.n.02 mammal.n.01 +markhor.n.01 ruminant.n.01 +chipmunk.n.01 placental.n.01 +belgian_hare.n.01 mammal.n.01 +peludo.n.01 edentate.n.01 +norwich_terrier.n.01 terrier.n.01 +macaque.n.01 macaque.n.01 +lakeland_terrier.n.01 canine.n.02 +silky_terrier.n.01 mammal.n.01 +meadow_vole.n.01 mammal.n.01 +cashmere_goat.n.01 ungulate.n.01 +exmoor.n.02 placental.n.01 +sporting_dog.n.01 hunting_dog.n.01 +pronghorn.n.01 ungulate.n.01 +galloway.n.02 bovine.n.01 +dolphin.n.02 toothed_whale.n.01 +gayal.n.01 asian_wild_ox.n.01 +harnessed_antelope.n.01 bovid.n.01 +bernese_mountain_dog.n.01 carnivore.n.01 +hack.n.08 saddle_horse.n.01 +woolly_rhinoceros.n.01 woolly_rhinoceros.n.01 +shetland_pony.n.01 shetland_pony.n.01 +brocket.n.02 red_deer.n.01 +hack.n.07 odd-toed_ungulate.n.01 +schipperke.n.01 carnivore.n.01 +old_world_least_weasel.n.01 placental.n.01 +tamarin.n.01 placental.n.01 +entlebucher.n.01 canine.n.02 +southern_flying_squirrel.n.01 mammal.n.01 +hereford.n.01 cattle.n.01 +tiger_cub.n.01 tiger_cub.n.01 +pteropus_hypomelanus.n.01 bat.n.01 +pollard.n.02 even-toed_ungulate.n.01 +barbary_ape.n.01 mammal.n.01 +bedlington_terrier.n.01 placental.n.01 +peludo.n.01 placental.n.01 +proboscidean.n.01 mammal.n.01 +saiga.n.01 ruminant.n.01 +orangutan.n.01 placental.n.01 +australian_sea_lion.n.01 pinniped_mammal.n.01 +mastiff.n.01 carnivore.n.01 +chigetai.n.01 mammal.n.01 +baleen_whale.n.01 cetacean.n.01 +kaffir_cat.n.01 carnivore.n.01 +mesohippus.n.01 equine.n.01 +guenon.n.01 primate.n.02 +australopithecus_robustus.n.01 placental.n.01 +nilgai.n.01 nilgai.n.01 +alaskan_brown_bear.n.01 carnivore.n.01 +red_bat.n.01 bat.n.01 +caribou.n.01 placental.n.01 +cape_buffalo.n.01 mammal.n.01 +blacktail_jackrabbit.n.01 hare.n.01 +hackney.n.02 ungulate.n.01 +canine.n.02 carnivore.n.01 +fallow_deer.n.01 placental.n.01 +sable.n.05 mammal.n.01 +blacktail_prairie_dog.n.01 blacktail_prairie_dog.n.01 +cairn.n.02 canine.n.02 +bellwether.n.02 even-toed_ungulate.n.01 +monkey.n.01 placental.n.01 +ox.n.01 cattle.n.01 +hinny.n.01 mammal.n.01 +stag.n.02 stag.n.02 +brewer's_mole.n.01 brewer's_mole.n.01 +phyllostomus_hastatus.n.01 carnivorous_bat.n.01 +cheviot.n.01 ruminant.n.01 +phyllostomus_hastatus.n.01 leafnose_bat.n.01 +eohippus.n.01 horse.n.01 +mediterranean_water_shrew.n.01 insectivore.n.01 +ruminant.n.01 placental.n.01 +silky_tamarin.n.01 primate.n.02 +steller_sea_lion.n.01 eared_seal.n.01 +snake_muishond.n.01 weasel.n.02 +bull.n.11 bull.n.11 +mustang.n.01 placental.n.01 +flying_lemur.n.01 mammal.n.01 +plains_pocket_gopher.n.01 gopher.n.04 +ibizan_hound.n.01 carnivore.n.01 +mountain_zebra.n.01 ungulate.n.01 +cashmere_goat.n.01 placental.n.01 +flat-coated_retriever.n.01 dog.n.01 +water_rat.n.03 rodent.n.01 +pygmy_sperm_whale.n.01 aquatic_mammal.n.01 +siberian_husky.n.01 mammal.n.01 +river_dolphin.n.01 dolphin.n.02 +black_fox.n.01 black_fox.n.01 +talapoin.n.01 monkey.n.01 +brittany_spaniel.n.01 placental.n.01 +africander.n.01 cattle.n.01 +zoril.n.01 zoril.n.01 +meadow_vole.n.01 placental.n.01 +australian_terrier.n.01 dog.n.01 +rock_hyrax.n.01 placental.n.01 +rambouillet.n.01 ungulate.n.01 +agouti.n.01 mammal.n.01 +pouched_mouse.n.01 dasyurid_marsupial.n.01 +american_black_bear.n.01 carnivore.n.01 +kiang.n.01 ass.n.03 +golden_retriever.n.01 carnivore.n.01 +wolfhound.n.01 placental.n.01 +welsh_terrier.n.01 welsh_terrier.n.01 +hooded_seal.n.01 mammal.n.01 +old_world_buffalo.n.01 ruminant.n.01 +timber_wolf.n.01 canine.n.02 +nilgai.n.01 ungulate.n.01 +dark_horse.n.02 dark_horse.n.02 +atlantic_walrus.n.01 pinniped_mammal.n.01 +fruit_bat.n.01 mammal.n.01 +barbary_ape.n.01 old_world_monkey.n.01 +megatherian.n.01 placental.n.01 +porpoise.n.01 placental.n.01 +guide_dog.n.01 carnivore.n.01 +grade.n.09 ungulate.n.01 +toy_spaniel.n.01 toy_dog.n.01 +coondog.n.01 dog.n.01 +kanchil.n.01 even-toed_ungulate.n.01 +flat-coated_retriever.n.01 hunting_dog.n.01 +eland.n.01 ungulate.n.01 +gibbon.n.02 primate.n.02 +nanny.n.02 ruminant.n.01 +welsh.n.03 bovine.n.01 +siamese_cat.n.01 siamese_cat.n.01 +duplicidentata.n.01 placental.n.01 +dormouse.n.01 mammal.n.01 +peba.n.01 placental.n.01 +puppy.n.01 mammal.n.01 +porker.n.01 hog.n.03 +dik-dik.n.01 dik-dik.n.01 +proconsul.n.03 mammal.n.01 +aegyptopithecus.n.01 primate.n.02 +french_bulldog.n.01 dog.n.01 +irish_setter.n.01 canine.n.02 +flat-coated_retriever.n.01 canine.n.02 +right_whale.n.01 cetacean.n.01 +bearded_seal.n.01 mammal.n.01 +napu.n.01 mammal.n.01 +douroucouli.n.01 douroucouli.n.01 +sealyham_terrier.n.01 sealyham_terrier.n.01 +chacma.n.01 chacma.n.01 +eastern_lowland_gorilla.n.01 eastern_lowland_gorilla.n.01 +brown_rat.n.01 mammal.n.01 +bowhead.n.01 aquatic_mammal.n.01 +little_brown_bat.n.01 vespertilian_bat.n.01 +dalmatian.n.02 carnivore.n.01 +mastiff.n.01 working_dog.n.01 +cob.n.02 cob.n.02 +wharf_rat.n.02 mammal.n.01 +packrat.n.02 mammal.n.01 +norwich_terrier.n.01 carnivore.n.01 +dandie_dinmont.n.01 canine.n.02 +nanny.n.02 ungulate.n.01 +crab-eating_dog.n.01 crab-eating_dog.n.01 +dun.n.01 equine.n.01 +heifer.n.01 even-toed_ungulate.n.01 +chigetai.n.01 placental.n.01 +pooch.n.01 placental.n.01 +housedog.n.01 placental.n.01 +charolais.n.01 bovid.n.01 +dik-dik.n.01 bovid.n.01 +irish_setter.n.01 hunting_dog.n.01 +coypu.n.01 mammal.n.01 +wild_goat.n.01 even-toed_ungulate.n.01 +sand_rat.n.02 sand_rat.n.02 +aperea.n.01 cavy.n.01 +norwegian_elkhound.n.01 carnivore.n.01 +rhinoceros.n.01 ungulate.n.01 +phenacomys.n.01 mammal.n.01 +pinto.n.01 placental.n.01 +sable_antelope.n.01 sable_antelope.n.01 +nail-tailed_wallaby.n.01 marsupial.n.01 +hind.n.02 mammal.n.01 +aoudad.n.01 ungulate.n.01 +manul.n.01 mammal.n.01 +tortoiseshell.n.03 mammal.n.01 +springbok.n.01 bovid.n.01 +southern_bog_lemming.n.01 mammal.n.01 +western_chimpanzee.n.01 mammal.n.01 +prancer.n.01 placental.n.01 +cotton_mouse.n.01 rodent.n.01 +pipistrelle.n.01 carnivorous_bat.n.01 +chow.n.03 canine.n.02 +bonnet_macaque.n.01 monkey.n.01 +dairy_cattle.n.01 ungulate.n.01 +proboscis_monkey.n.01 primate.n.02 +gallant_fox.n.01 equine.n.01 +yak.n.02 mammal.n.01 +pocket_rat.n.01 placental.n.01 +assault.n.03 placental.n.01 +patas.n.01 mammal.n.01 +howler_monkey.n.01 new_world_monkey.n.01 +stallion.n.01 equine.n.01 +saber-toothed_tiger.n.01 big_cat.n.01 +staffordshire_bullterrier.n.01 carnivore.n.01 +domestic_goat.n.01 placental.n.01 +banteng.n.01 bovid.n.01 +atlantic_bottlenose_dolphin.n.01 mammal.n.01 +dachshund.n.01 canine.n.02 +wild_ass.n.01 placental.n.01 +alaska_fur_seal.n.01 aquatic_mammal.n.01 +marmoset.n.01 mammal.n.01 +domestic_goat.n.01 bovid.n.01 +dwarf_sperm_whale.n.01 placental.n.01 +cow.n.01 ruminant.n.01 +steeplechaser.n.01 odd-toed_ungulate.n.01 +sperm_whale.n.01 mammal.n.01 +bellwether.n.02 mammal.n.01 +sir_barton.n.01 equine.n.01 +california_sea_lion.n.01 california_sea_lion.n.01 +santa_gertrudis.n.01 even-toed_ungulate.n.01 +grasshopper_mouse.n.01 rodent.n.01 +bobcat.n.01 wildcat.n.03 +japanese_deer.n.01 even-toed_ungulate.n.01 +english_foxhound.n.01 carnivore.n.01 +sable_antelope.n.01 mammal.n.01 +devon.n.02 placental.n.01 +saluki.n.01 placental.n.01 +cattle.n.01 placental.n.01 +bullock.n.01 ungulate.n.01 +briard.n.01 shepherd_dog.n.01 +leopardess.n.01 placental.n.01 +rock_wallaby.n.01 kangaroo.n.01 +striped_hyena.n.01 placental.n.01 +badger.n.02 carnivore.n.01 +clydesdale.n.01 odd-toed_ungulate.n.01 +cob.n.02 placental.n.01 +pygmy_mouse.n.01 mouse.n.01 +tibetan_mastiff.n.01 canine.n.02 +yellow-throated_marten.n.01 musteline_mammal.n.01 +badger.n.02 musteline_mammal.n.01 +bluetick.n.01 bluetick.n.01 +pygmy_mouse.n.01 mammal.n.01 +marsh_hare.n.01 leporid.n.01 +sivapithecus.n.01 placental.n.01 +groundhog.n.01 mammal.n.01 +greater_swiss_mountain_dog.n.01 greater_swiss_mountain_dog.n.01 +foxhound.n.01 foxhound.n.01 +dhole.n.01 wild_dog.n.01 +angora.n.04 feline.n.01 +fox_terrier.n.01 terrier.n.01 +giraffe.n.01 giraffe.n.01 +palomino.n.01 odd-toed_ungulate.n.01 +ram.n.05 even-toed_ungulate.n.01 +wolverine.n.03 carnivore.n.01 +meerkat.n.01 mammal.n.01 +lesser_rorqual.n.01 mammal.n.01 +lucy.n.01 australopithecus_afarensis.n.01 +wire-haired_fox_terrier.n.01 fox_terrier.n.01 +giant_armadillo.n.01 edentate.n.01 +greater_kudu.n.01 ruminant.n.01 +napu.n.01 ungulate.n.01 +mexican_pocket_mouse.n.01 pocket_mouse.n.01 +prairie_vole.n.01 mammal.n.01 +chamois.n.02 goat_antelope.n.01 +bovine.n.01 mammal.n.01 +bernese_mountain_dog.n.01 placental.n.01 +boarhound.n.01 hound.n.01 +gaur.n.01 ox.n.02 +angora.n.03 mammal.n.01 +tiger_cat.n.01 mammal.n.01 +blackbuck.n.01 bovid.n.01 +maltese.n.03 mammal.n.01 +miniature_schnauzer.n.01 placental.n.01 +otter_shrew.n.01 insectivore.n.01 +phyllostomus_hastatus.n.01 bat.n.01 +silverback.n.01 placental.n.01 +cairn.n.02 mammal.n.01 +banteng.n.01 bovine.n.01 +police_dog.n.01 placental.n.01 +blackbuck.n.01 placental.n.01 +asian_wild_ox.n.01 bovine.n.01 +brown_bat.n.01 brown_bat.n.01 +red_bat.n.01 mammal.n.01 +samoyed.n.03 mammal.n.01 +affenpinscher.n.01 working_dog.n.01 +attack_dog.n.01 watchdog.n.02 +okapi.n.01 giraffe.n.01 +zoril.n.01 musteline_mammal.n.01 +komondor.n.01 mammal.n.01 +american_water_spaniel.n.01 spaniel.n.01 +spider_monkey.n.01 placental.n.01 +wallaby.n.01 metatherian.n.01 +western_chimpanzee.n.01 great_ape.n.01 +flying_fox.n.01 mammal.n.01 +american_red_squirrel.n.01 mammal.n.01 +java_man.n.01 homo_erectus.n.01 +sperm_whale.n.01 placental.n.01 +police_dog.n.01 police_dog.n.01 +fawn.n.02 ungulate.n.01 +hearing_dog.n.01 dog.n.01 +belgian_sheepdog.n.01 mammal.n.01 +tiger_cub.n.01 big_cat.n.01 +snake_muishond.n.01 musteline_mammal.n.01 +clydesdale_terrier.n.01 mammal.n.01 +squirrel.n.01 rodent.n.01 +impala.n.01 placental.n.01 +suslik.n.01 squirrel.n.01 +silver_fox.n.01 red_fox.n.03 +chickeree.n.01 placental.n.01 +polo_pony.n.01 odd-toed_ungulate.n.01 +sorrel.n.05 mammal.n.01 +otterhound.n.01 dog.n.01 +hudson_bay_collared_lemming.n.01 rodent.n.01 +black_sheep.n.02 black_sheep.n.02 +blacktail_prairie_dog.n.01 placental.n.01 +flying_mouse.n.01 mammal.n.01 +lioness.n.01 placental.n.01 +american_bison.n.01 placental.n.01 +hooded_skunk.n.01 musteline_mammal.n.01 +working_dog.n.01 carnivore.n.01 +western_grey_squirrel.n.01 tree_squirrel.n.01 +sir_barton.n.01 ungulate.n.01 +schnauzer.n.01 terrier.n.01 +american_marten.n.01 american_marten.n.01 +mandrill.n.01 mandrill.n.01 +fossa.n.03 viverrine.n.01 +zebra.n.01 odd-toed_ungulate.n.01 +collared_peccary.n.01 ungulate.n.01 +rambouillet.n.01 sheep.n.01 +walrus.n.01 pinniped_mammal.n.01 +rhodesian_man.n.01 rhodesian_man.n.01 +wild_boar.n.01 even-toed_ungulate.n.01 +northern_flying_squirrel.n.01 mammal.n.01 +taguan.n.01 rodent.n.01 +english_toy_spaniel.n.01 mammal.n.01 +sorrel.n.05 equine.n.01 +brewer's_mole.n.01 insectivore.n.01 +chickeree.n.01 tree_squirrel.n.01 +snowshoe_hare.n.01 placental.n.01 +shetland_pony.n.01 odd-toed_ungulate.n.01 +aberdeen_angus.n.01 placental.n.01 +pacer.n.02 pacer.n.02 +masked_shrew.n.01 insectivore.n.01 +new_world_least_weasel.n.01 placental.n.01 +morgan.n.06 odd-toed_ungulate.n.01 +uakari.n.01 monkey.n.01 +saiga.n.01 placental.n.01 +dall_sheep.n.01 dall_sheep.n.01 +kudu.n.01 kudu.n.01 +gorilla.n.01 ape.n.01 +bluetick.n.01 mammal.n.01 +saint_bernard.n.01 placental.n.01 +european_water_shrew.n.01 insectivore.n.01 +opossum_rat.n.01 metatherian.n.01 +new_world_mouse.n.01 mammal.n.01 +silver_fox.n.01 mammal.n.01 +asiatic_flying_squirrel.n.01 placental.n.01 +shepherd_dog.n.01 mammal.n.01 +blenheim_spaniel.n.01 canine.n.02 +serow.n.01 mammal.n.01 +bighorn.n.02 ungulate.n.01 +wolfhound.n.01 canine.n.02 +bassarisk.n.01 procyonid.n.01 +kob.n.01 placental.n.01 +prosimian.n.01 primate.n.02 +ratel.n.01 musteline_mammal.n.01 +manx.n.02 manx.n.02 +hazel_mouse.n.01 hazel_mouse.n.01 +schipperke.n.01 schipperke.n.01 +drill.n.02 placental.n.01 +brown_bat.n.01 mammal.n.01 +beef.n.01 bovid.n.01 +duplicidentata.n.01 mammal.n.01 +domestic_sheep.n.01 domestic_sheep.n.01 +fruit_bat.n.01 fruit_bat.n.01 +ungulate.n.01 placental.n.01 +kaffir_cat.n.01 placental.n.01 +platypus.n.01 platypus.n.01 +pole_horse.n.01 pole_horse.n.01 +antelope.n.01 placental.n.01 +mudder.n.01 mammal.n.01 +sei_whale.n.01 rorqual.n.01 +miniature_schnauzer.n.01 mammal.n.01 +atlantic_bottlenose_dolphin.n.01 atlantic_bottlenose_dolphin.n.01 +eastern_chimpanzee.n.01 eastern_chimpanzee.n.01 +cryptoprocta.n.01 cryptoprocta.n.01 +madagascar_cat.n.01 madagascar_cat.n.01 +coyote.n.01 mammal.n.01 +australopithecus_afarensis.n.01 placental.n.01 +tatouay.n.01 armadillo.n.01 +plains_pocket_gopher.n.01 pocket_rat.n.01 +asiatic_flying_squirrel.n.01 asiatic_flying_squirrel.n.01 +tarsius_glis.n.01 tarsius_glis.n.01 +american_foxhound.n.01 american_foxhound.n.01 +stepper.n.03 mammal.n.01 +otterhound.n.01 canine.n.02 +clumber.n.01 carnivore.n.01 +marten.n.01 musteline_mammal.n.01 +long-tailed_porcupine.n.01 porcupine.n.01 +kaffir_cat.n.01 wildcat.n.03 +musk_ox.n.01 placental.n.01 +water_spaniel.n.01 hunting_dog.n.01 +weasel.n.02 placental.n.01 +groundhog.n.01 placental.n.01 +cactus_mouse.n.01 rodent.n.01 +redbone.n.01 mammal.n.01 +gazelle.n.01 antelope.n.01 +tiger_cat.n.02 domestic_cat.n.01 +heifer.n.01 bovine.n.01 +bucking_bronco.n.01 bronco.n.01 +ayrshire.n.01 ungulate.n.01 +rabbit-eared_bandicoot.n.01 rabbit-eared_bandicoot.n.01 +gib.n.02 gib.n.02 +lion.n.01 placental.n.01 +groenendael.n.01 canine.n.02 +river_dolphin.n.01 placental.n.01 +baleen_whale.n.01 placental.n.01 +rudapithecus.n.01 primate.n.02 +springer.n.02 mammal.n.01 +lesser_ape.n.01 anthropoid_ape.n.01 +titi.n.03 primate.n.02 +dandie_dinmont.n.01 placental.n.01 +stallion.n.01 horse.n.01 +toy_poodle.n.01 toy_poodle.n.01 +pallid_bat.n.01 carnivorous_bat.n.01 +dwarf_sperm_whale.n.01 dwarf_sperm_whale.n.01 +police_dog.n.01 dog.n.01 +marsupial.n.01 metatherian.n.01 +giant_eland.n.01 bovid.n.01 +spotted_skunk.n.01 musteline_mammal.n.01 +common_eland.n.01 mammal.n.01 +finback.n.01 baleen_whale.n.01 +sivapithecus.n.01 primate.n.02 +bird_dog.n.01 placental.n.01 +deer_mouse.n.01 mammal.n.01 +welsh_springer_spaniel.n.01 welsh_springer_spaniel.n.01 +pika.n.01 mammal.n.01 +cotton_mouse.n.01 placental.n.01 +bullock.n.02 mammal.n.01 +edentate.n.01 placental.n.01 +merino.n.01 merino.n.01 +eastern_pipistrel.n.01 placental.n.01 +eastern_cottontail.n.01 leporid.n.01 +dalmatian.n.02 placental.n.01 +fisher.n.02 carnivore.n.01 +otter.n.02 musteline_mammal.n.01 +german_shepherd.n.01 dog.n.01 +africander.n.01 bovid.n.01 +mylodon.n.01 edentate.n.01 +beaked_whale.n.01 cetacean.n.01 +field_spaniel.n.01 canine.n.02 +grey.n.07 placental.n.01 +homo_sapiens.n.01 placental.n.01 +hinny.n.01 odd-toed_ungulate.n.01 +spitz.n.01 placental.n.01 +finback.n.01 mammal.n.01 +urial.n.01 wild_sheep.n.01 +siamang.n.01 lesser_ape.n.01 +viverrine.n.01 mammal.n.01 +megatherian.n.01 edentate.n.01 +norwich_terrier.n.01 canine.n.02 +dandie_dinmont.n.01 carnivore.n.01 +grey_fox.n.01 carnivore.n.01 +little_chief_hare.n.01 little_chief_hare.n.01 +moke.n.01 odd-toed_ungulate.n.01 +rambouillet.n.01 bovid.n.01 +grey_whale.n.01 mammal.n.01 +roe_deer.n.01 deer.n.01 +mastiff.n.01 canine.n.02 +peking_man.n.01 placental.n.01 +ratel.n.01 placental.n.01 +white_whale.n.01 whale.n.02 +grasshopper_mouse.n.01 wood_rat.n.01 +boxer.n.04 boxer.n.04 +tiger_cat.n.02 carnivore.n.01 +ape.n.01 mammal.n.01 +charolais.n.01 ruminant.n.01 +common_wallaby.n.01 marsupial.n.01 +eastern_woodrat.n.01 wood_rat.n.01 +dun.n.01 mammal.n.01 +steenbok.n.01 placental.n.01 +blue_whale.n.01 whale.n.02 +two-toed_sloth.n.01 mammal.n.01 +morgan.n.06 mammal.n.01 +tom.n.02 domestic_cat.n.01 +old_english_sheepdog.n.01 dog.n.01 +housedog.n.01 mammal.n.01 +homo_soloensis.n.01 hominid.n.01 +three-year-old_horse.n.01 odd-toed_ungulate.n.01 +exmoor.n.01 ungulate.n.01 +pony.n.02 racehorse.n.01 +pariah_dog.n.01 placental.n.01 +steller_sea_lion.n.01 sea_lion.n.01 +angora.n.04 mammal.n.01 +gazella_subgutturosa.n.01 bovid.n.01 +central_chimpanzee.n.01 placental.n.01 +sand_rat.n.01 mammal.n.01 +mongoose.n.01 mongoose.n.01 +cetacean.n.01 cetacean.n.01 +african_wild_ass.n.01 mammal.n.01 +flickertail.n.01 rodent.n.01 +cuscus.n.01 cuscus.n.01 +palm_cat.n.01 mammal.n.01 +hominid.n.01 hominid.n.01 +blacktail_prairie_dog.n.01 prairie_dog.n.01 +charolais.n.01 beef.n.01 +charolais.n.01 bovine.n.01 +langur.n.01 primate.n.02 +coydog.n.01 coydog.n.01 +saddle_horse.n.01 ungulate.n.01 +american_black_bear.n.01 american_black_bear.n.01 +native_cat.n.01 dasyurid_marsupial.n.01 +galloway.n.02 galloway.n.02 +bobcat.n.01 carnivore.n.01 +least_shrew.n.01 placental.n.01 +pygmy_chimpanzee.n.01 anthropoid_ape.n.01 +mastiff_bat.n.01 carnivorous_bat.n.01 +brahman.n.04 placental.n.01 +spaniel.n.01 mammal.n.01 +pariah_dog.n.01 cur.n.01 +sorrel.n.05 odd-toed_ungulate.n.01 +tigress.n.01 placental.n.01 +chigetai.n.01 wild_ass.n.01 +phenacomys.n.01 phenacomys.n.01 +california_sea_lion.n.01 eared_seal.n.01 +southeastern_pocket_gopher.n.01 mammal.n.01 +serow.n.01 ungulate.n.01 +pademelon.n.01 pademelon.n.01 +giant_armadillo.n.01 armadillo.n.01 +boston_bull.n.01 boston_bull.n.01 +basenji.n.01 placental.n.01 +cetacean.n.01 placental.n.01 +crab-eating_macaque.n.01 old_world_monkey.n.01 +jersey.n.05 jersey.n.05 +northern_bog_lemming.n.01 rodent.n.01 +ermine.n.02 mammal.n.01 +finback.n.01 aquatic_mammal.n.01 +dhole.n.01 canine.n.02 +tarpan.n.01 tarpan.n.01 +hare.n.01 mammal.n.01 +clydesdale_terrier.n.01 canine.n.02 +irish_setter.n.01 dog.n.01 +miniature_schnauzer.n.01 canine.n.02 +cavalry_horse.n.01 equine.n.01 +weimaraner.n.01 hound.n.01 +standard_schnauzer.n.01 standard_schnauzer.n.01 +jackrabbit.n.01 leporid.n.01 +black-tailed_deer.n.01 deer.n.01 +mountain_zebra.n.01 zebra.n.01 +fallow_deer.n.01 deer.n.01 +woolly_mammoth.n.01 placental.n.01 +hudson_bay_collared_lemming.n.01 hudson_bay_collared_lemming.n.01 +western_pipistrel.n.01 western_pipistrel.n.01 +serow.n.01 serow.n.01 +bobcat.n.01 placental.n.01 +wood_rabbit.n.01 mammal.n.01 +crabeater_seal.n.01 seal.n.09 +bottlenose_dolphin.n.01 placental.n.01 +entlebucher.n.01 dog.n.01 +jaguarundi.n.01 placental.n.01 +bison.n.01 ruminant.n.01 +quarter_horse.n.01 odd-toed_ungulate.n.01 +gayal.n.01 ungulate.n.01 +red-backed_mouse.n.01 wood_rat.n.01 +serval.n.01 cat.n.01 +basset.n.01 placental.n.01 +tigress.n.01 carnivore.n.01 +gallant_fox.n.01 racehorse.n.01 +pembroke.n.01 pembroke.n.01 +sea_lion.n.01 eared_seal.n.01 +whippet.n.01 hound.n.01 +eastern_chipmunk.n.01 eastern_chipmunk.n.01 +grasshopper_mouse.n.01 grasshopper_mouse.n.01 +giant_eland.n.01 mammal.n.01 +sand_cat.n.01 mammal.n.01 +hereford.n.01 even-toed_ungulate.n.01 +brocket.n.01 deer.n.01 +puku.n.01 bovid.n.01 +antelope.n.01 even-toed_ungulate.n.01 +numbat.n.01 metatherian.n.01 +american_harvest_mouse.n.01 mammal.n.01 +simian.n.01 placental.n.01 +gorilla.n.01 gorilla.n.01 +red_poll.n.01 ruminant.n.01 +virginia_deer.n.01 deer.n.01 +tarsius_syrichta.n.01 tarsius_syrichta.n.01 +hack.n.07 hack.n.07 +brittany_spaniel.n.01 mammal.n.01 +hippopotamus.n.01 placental.n.01 +leonberg.n.01 dog.n.01 +pichiciago.n.01 pichiciago.n.01 +wire-haired_fox_terrier.n.01 terrier.n.01 +manx.n.02 mammal.n.01 +secretariat.n.02 placental.n.01 +blue_fox.n.01 canine.n.02 +raccoon.n.02 procyonid.n.01 +bovid.n.01 placental.n.01 +irish_wolfhound.n.01 dog.n.01 +mule.n.01 placental.n.01 +domestic_ass.n.01 odd-toed_ungulate.n.01 +gopher.n.04 gopher.n.04 +groenendael.n.01 carnivore.n.01 +welsh_pony.n.01 horse.n.01 +pipistrelle.n.01 placental.n.01 +keeshond.n.01 carnivore.n.01 +homo_sapiens_sapiens.n.01 hominid.n.01 +border_collie.n.01 carnivore.n.01 +african_wild_ass.n.01 placental.n.01 +pteropus_hypomelanus.n.01 pteropus_hypomelanus.n.01 +striped_muishond.n.01 striped_muishond.n.01 +sand_rat.n.01 placental.n.01 +sir_barton.n.01 sir_barton.n.01 +tarpan.n.01 odd-toed_ungulate.n.01 +pony.n.02 horse.n.01 +langur.n.01 mammal.n.01 +orangutan.n.01 anthropoid_ape.n.01 +percheron.n.01 percheron.n.01 +english_springer.n.01 springer_spaniel.n.01 +domestic_llama.n.01 ungulate.n.01 +fanaloka.n.01 mammal.n.01 +chimpanzee.n.01 primate.n.02 +crowbait.n.01 placental.n.01 +przewalski's_horse.n.01 placental.n.01 +bull.n.01 ungulate.n.01 +yearling.n.02 placental.n.01 +rat_terrier.n.01 mammal.n.01 +black_sheep.n.02 bovid.n.01 +asiatic_flying_squirrel.n.01 mammal.n.01 +cave_myotis.n.01 vespertilian_bat.n.01 +stud.n.04 odd-toed_ungulate.n.01 +koala.n.01 koala.n.01 +lesser_rorqual.n.01 baleen_whale.n.01 +miniature_poodle.n.01 dog.n.01 +gayal.n.01 gayal.n.01 +chigetai.n.01 equine.n.01 +tibetan_mastiff.n.01 dog.n.01 +quarter_horse.n.01 ungulate.n.01 +standard_schnauzer.n.01 canine.n.02 +grey_fox.n.01 canine.n.02 +leafnose_bat.n.01 placental.n.01 +boarhound.n.01 boarhound.n.01 +american_mastodon.n.01 placental.n.01 +toy_spaniel.n.01 mammal.n.01 +macaque.n.01 old_world_monkey.n.01 +gemsbok.n.01 ungulate.n.01 +coondog.n.01 coondog.n.01 +cheviot.n.01 even-toed_ungulate.n.01 +black_rat.n.01 mammal.n.01 +crab-eating_opossum.n.01 metatherian.n.01 +english_springer.n.01 sporting_dog.n.01 +male_horse.n.01 male_horse.n.01 +pole_horse.n.01 placental.n.01 +pocketed_bat.n.01 carnivorous_bat.n.01 +cactus_mouse.n.01 placental.n.01 +steed.n.01 odd-toed_ungulate.n.01 +sausage_dog.n.01 carnivore.n.01 +indian_buffalo.n.01 placental.n.01 +goat.n.01 placental.n.01 +greater_kudu.n.01 antelope.n.01 +staghound.n.01 staghound.n.01 +jersey.n.05 mammal.n.01 +german_short-haired_pointer.n.01 canine.n.02 +bison.n.01 mammal.n.01 +weimaraner.n.01 carnivore.n.01 +palfrey.n.01 odd-toed_ungulate.n.01 +bottle-nosed_whale.n.01 mammal.n.01 +ferret.n.02 carnivore.n.01 +chipmunk.n.01 rodent.n.01 +harness_horse.n.01 mammal.n.01 +harp_seal.n.01 placental.n.01 +slender-tailed_meerkat.n.01 slender-tailed_meerkat.n.01 +douroucouli.n.01 mammal.n.01 +sambar.n.01 ruminant.n.01 +pacific_bottlenose_dolphin.n.01 bottlenose_dolphin.n.01 +shrew.n.02 insectivore.n.01 +yorkshire_terrier.n.01 terrier.n.01 +brush-tailed_porcupine.n.01 old_world_porcupine.n.01 +brown_bear.n.01 carnivore.n.01 +queen.n.09 naked_mole_rat.n.01 +fisher.n.02 marten.n.01 +musk_deer.n.01 deer.n.01 +brood_bitch.n.01 carnivore.n.01 +pinscher.n.01 placental.n.01 +bull_mastiff.n.01 placental.n.01 +kit_fox.n.02 fox.n.01 +arctic_fox.n.01 arctic_fox.n.01 +black_rhinoceros.n.01 placental.n.01 +manx.n.02 placental.n.01 +hare_wallaby.n.01 mammal.n.01 +irish_terrier.n.01 placental.n.01 +belgian_sheepdog.n.01 working_dog.n.01 +carnivorous_bat.n.01 placental.n.01 +water_vole.n.01 vole.n.01 +platypus.n.01 mammal.n.01 +lionet.n.01 lion.n.01 +american_staffordshire_terrier.n.01 terrier.n.01 +world.n.08 hominid.n.01 +lesser_panda.n.01 carnivore.n.01 +angora.n.02 domestic_goat.n.01 +keeshond.n.01 keeshond.n.01 +bowhead.n.01 cetacean.n.01 +kaffir_cat.n.01 kaffir_cat.n.01 +aardvark.n.01 placental.n.01 +guano_bat.n.01 guano_bat.n.01 +polar_hare.n.01 hare.n.01 +sand_cat.n.01 carnivore.n.01 +seal.n.09 aquatic_mammal.n.01 +affenpinscher.n.01 mammal.n.01 +long-eared_bat.n.01 vespertilian_bat.n.01 +leopard_cat.n.01 feline.n.01 +miniature_poodle.n.01 canine.n.02 +brown_bear.n.01 placental.n.01 +cow_pony.n.01 equine.n.01 +standard_poodle.n.01 dog.n.01 +sea_cow.n.01 placental.n.01 +egyptian_cat.n.01 carnivore.n.01 +white_rhinoceros.n.01 white_rhinoceros.n.01 +eastern_dasyure.n.01 marsupial.n.01 +canine.n.02 mammal.n.01 +lioness.n.01 feline.n.01 +rottweiler.n.01 carnivore.n.01 +vespertilian_bat.n.01 mammal.n.01 +grey.n.07 mammal.n.01 +saluki.n.01 hunting_dog.n.01 +cashmere_goat.n.01 mammal.n.01 +orange_bat.n.01 bat.n.01 +moke.n.01 ungulate.n.01 +hackney.n.02 mammal.n.01 +chimpanzee.n.01 ape.n.01 +australopithecus_boisei.n.01 australopithecine.n.01 +angora.n.02 even-toed_ungulate.n.01 +american_marten.n.01 carnivore.n.01 +gaur.n.01 even-toed_ungulate.n.01 +scotch_terrier.n.01 terrier.n.01 +lynx.n.02 mammal.n.01 +coyote.n.01 wolf.n.01 +apar.n.01 mammal.n.01 +three-toed_sloth.n.01 mammal.n.01 +deer.n.01 placental.n.01 +pteropus_hypomelanus.n.01 placental.n.01 +cryptoprocta.n.01 carnivore.n.01 +australian_terrier.n.01 placental.n.01 +whirlaway.n.01 odd-toed_ungulate.n.01 +walker_hound.n.01 foxhound.n.01 +dalmatian.n.02 dalmatian.n.02 +workhorse.n.02 equine.n.01 +springer.n.02 cow.n.01 +cayuse.n.01 mammal.n.01 +king_charles_spaniel.n.01 dog.n.01 +durham.n.02 placental.n.01 +leopardess.n.01 big_cat.n.01 +freetail.n.01 carnivorous_bat.n.01 +rorqual.n.01 placental.n.01 +mexican_hairless.n.01 dog.n.01 +native_cat.n.01 metatherian.n.01 +pere_david's_deer.n.01 ungulate.n.01 +slow_loris.n.01 slow_loris.n.01 +terrier.n.01 carnivore.n.01 +tayra.n.01 mammal.n.01 +siamese_cat.n.01 cat.n.01 +quagga.n.01 placental.n.01 +tamarau.n.01 old_world_buffalo.n.01 +australian_sea_lion.n.01 mammal.n.01 +silky_terrier.n.01 dog.n.01 +black_squirrel.n.01 rodent.n.01 +flying_mouse.n.01 marsupial.n.01 +jungle_cat.n.01 cat.n.01 +brahman.n.04 ungulate.n.01 +retriever.n.01 retriever.n.01 +golden_retriever.n.01 placental.n.01 +kid.n.05 placental.n.01 +packhorse.n.01 odd-toed_ungulate.n.01 +silky_tamarin.n.01 new_world_monkey.n.01 +silky_terrier.n.01 silky_terrier.n.01 +cashmere_goat.n.01 domestic_goat.n.01 +pouched_mole.n.01 pouched_mole.n.01 +ram.n.05 ram.n.05 +vervet.n.01 old_world_monkey.n.01 +curly-coated_retriever.n.01 sporting_dog.n.01 +spotted_lynx.n.01 wildcat.n.03 +affirmed.n.01 odd-toed_ungulate.n.01 +horseshoe_bat.n.01 carnivorous_bat.n.01 +assault.n.03 thoroughbred.n.02 +freetail.n.01 freetail.n.01 +eskimo_dog.n.01 mammal.n.01 +bronco.n.01 pony.n.01 +clydesdale.n.01 mammal.n.01 +pole_horse.n.01 racehorse.n.01 +suricate.n.01 placental.n.01 +white-lipped_peccary.n.01 placental.n.01 +asiatic_shrew_mole.n.01 asiatic_shrew_mole.n.01 +wolf_pup.n.01 mammal.n.01 +blenheim_spaniel.n.01 toy_dog.n.01 +aurochs.n.02 placental.n.01 +impala.n.01 mammal.n.01 +newfoundland.n.01 mammal.n.01 +killer_whale.n.01 cetacean.n.01 +jerboa_kangaroo.n.01 kangaroo.n.01 +ocelot.n.01 cat.n.01 +fisher.n.02 placental.n.01 +margay.n.01 carnivore.n.01 +beaver.n.07 placental.n.01 +charger.n.01 ungulate.n.01 +imperial_mammoth.n.01 imperial_mammoth.n.01 +prosimian.n.01 prosimian.n.01 +bucking_bronco.n.01 equine.n.01 +marco_polo_sheep.n.01 even-toed_ungulate.n.01 +eastern_chimpanzee.n.01 ape.n.01 +bearded_seal.n.01 seal.n.09 +guenon.n.01 old_world_monkey.n.01 +poodle.n.01 canine.n.02 +komondor.n.01 placental.n.01 +kob.n.01 mammal.n.01 +pygmy_marmoset.n.01 placental.n.01 +carthorse.n.01 draft_horse.n.01 +silky_terrier.n.01 placental.n.01 +kanchil.n.01 ruminant.n.01 +basenji.n.01 carnivore.n.01 +papillon.n.01 carnivore.n.01 +palm_cat.n.01 viverrine.n.01 +wharf_rat.n.02 placental.n.01 +seattle_slew.n.01 seattle_slew.n.01 +flat-coated_retriever.n.01 placental.n.01 +rat_kangaroo.n.01 metatherian.n.01 +sea_otter.n.01 mammal.n.01 +taguan.n.01 mammal.n.01 +gorilla.n.01 placental.n.01 +boar.n.02 ungulate.n.01 +briard.n.01 dog.n.01 +bronco.n.01 mustang.n.01 +pinscher.n.01 dog.n.01 +waterbuck.n.01 bovid.n.01 +bull_mastiff.n.01 dog.n.01 +otter.n.02 placental.n.01 +pacer.n.01 horse.n.01 +kerry_blue_terrier.n.01 canine.n.02 +workhorse.n.02 placental.n.01 +norwich_terrier.n.01 placental.n.01 +mountain_sheep.n.01 mammal.n.01 +doberman.n.01 doberman.n.01 +suricate.n.01 suricate.n.01 +mink.n.03 placental.n.01 +stoat.n.01 weasel.n.02 +woodland_caribou.n.01 ruminant.n.01 +spotted_skunk.n.01 placental.n.01 +common_lynx.n.01 wildcat.n.03 +cardigan.n.02 placental.n.01 +sled_dog.n.01 working_dog.n.01 +prairie_vole.n.01 prairie_vole.n.01 +bushbuck.n.01 placental.n.01 +lucy.n.01 placental.n.01 +european_hare.n.01 placental.n.01 +cougar.n.01 placental.n.01 +wild_boar.n.01 wild_boar.n.01 +greyhound.n.01 carnivore.n.01 +trotting_horse.n.01 ungulate.n.01 +hearing_dog.n.01 canine.n.02 +new_world_beaver.n.01 new_world_beaver.n.01 +pony.n.02 ungulate.n.01 +norwegian_elkhound.n.01 placental.n.01 +boarhound.n.01 placental.n.01 +woolly_rhinoceros.n.01 mammal.n.01 +cashmere_goat.n.01 bovid.n.01 +squirrel.n.01 mammal.n.01 +angora.n.02 bovid.n.01 +indian_elephant.n.01 placental.n.01 +liger.n.01 liger.n.01 +american_red_squirrel.n.01 rodent.n.01 +angwantibo.n.01 placental.n.01 +australian_sea_lion.n.01 placental.n.01 +nonstarter.n.02 placental.n.01 +scotch_terrier.n.01 mammal.n.01 +tennessee_walker.n.01 placental.n.01 +giraffe.n.01 mammal.n.01 +malamute.n.01 carnivore.n.01 +african_wild_ass.n.01 wild_ass.n.01 +brocket.n.01 even-toed_ungulate.n.01 +burro.n.01 equine.n.01 +paranthropus.n.01 australopithecine.n.01 +water_dog.n.02 dog.n.01 +welsh_springer_spaniel.n.01 placental.n.01 +keeshond.n.01 mammal.n.01 +griffon.n.02 canine.n.02 +gemsbok.n.01 placental.n.01 +wolfhound.n.01 wolfhound.n.01 +dall_sheep.n.01 even-toed_ungulate.n.01 +briard.n.01 placental.n.01 +setter.n.02 hunting_dog.n.01 +caribou.n.01 even-toed_ungulate.n.01 +lemur.n.01 placental.n.01 +wild_boar.n.01 swine.n.01 +lionet.n.01 lionet.n.01 +camel.n.01 ungulate.n.01 +bullterrier.n.01 carnivore.n.01 +masked_shrew.n.01 placental.n.01 +black_squirrel.n.01 placental.n.01 +mole.n.06 insectivore.n.01 +merino.n.01 domestic_sheep.n.01 +fox_squirrel.n.01 placental.n.01 +california_sea_lion.n.01 mammal.n.01 +bengal_tiger.n.01 big_cat.n.01 +capybara.n.01 mammal.n.01 +bassarisk.n.01 mammal.n.01 +tayra.n.01 carnivore.n.01 +wild_dog.n.01 mammal.n.01 +mole_rat.n.02 placental.n.01 +indian_buffalo.n.01 ruminant.n.01 +german_short-haired_pointer.n.01 pointer.n.04 +hedgehog.n.02 hedgehog.n.02 +bushbuck.n.01 bovid.n.01 +stablemate.n.01 stablemate.n.01 +appenzeller.n.01 appenzeller.n.01 +water_vole.n.02 wood_rat.n.01 +siberian_husky.n.01 siberian_husky.n.01 +plott_hound.n.01 hunting_dog.n.01 +durham.n.02 bovine.n.01 +skye_terrier.n.01 placental.n.01 +bunny.n.02 bunny.n.02 +aye-aye.n.01 aye-aye.n.01 +eurasian_otter.n.01 otter.n.02 +lionet.n.01 mammal.n.01 +zebu.n.01 bovine.n.01 +equine.n.01 placental.n.01 +lapin.n.02 rabbit.n.01 +brown_swiss.n.01 placental.n.01 +bruin.n.01 placental.n.01 +lhasa.n.02 canine.n.02 +papillon.n.01 papillon.n.01 +africander.n.01 ruminant.n.01 +uakari.n.01 mammal.n.01 +italian_greyhound.n.01 canine.n.02 +indian_rhinoceros.n.01 mammal.n.01 +wild_dog.n.01 carnivore.n.01 +staghound.n.01 carnivore.n.01 +western_lowland_gorilla.n.01 anthropoid_ape.n.01 +dolphin.n.02 aquatic_mammal.n.01 +kangaroo_rat.n.01 rodent.n.01 +pacer.n.01 mammal.n.01 +hind.n.02 ruminant.n.01 +bongo.n.02 placental.n.01 +urial.n.01 placental.n.01 +bullock.n.02 bovid.n.01 +carnivorous_bat.n.01 mammal.n.01 +walrus.n.01 placental.n.01 +bullock.n.01 cattle.n.01 +bernese_mountain_dog.n.01 canine.n.02 +dog.n.01 mammal.n.01 +porker.n.01 placental.n.01 +italian_greyhound.n.01 greyhound.n.01 +mongoose.n.01 mammal.n.01 +ground_sloth.n.01 placental.n.01 +gib.n.02 domestic_cat.n.01 +german_shepherd.n.01 mammal.n.01 +manx.n.02 feline.n.01 +aberdeen_angus.n.01 ungulate.n.01 +kinkajou.n.01 carnivore.n.01 +west_highland_white_terrier.n.01 west_highland_white_terrier.n.01 +harbor_seal.n.01 pinniped_mammal.n.01 +south_american_sea_lion.n.01 mammal.n.01 +common_lynx.n.01 feline.n.01 +jerboa_kangaroo.n.01 metatherian.n.01 +spotted_hyena.n.01 carnivore.n.01 +aoudad.n.01 aoudad.n.01 +smooth-haired_fox_terrier.n.01 dog.n.01 +shih-tzu.n.01 dog.n.01 +sable_antelope.n.01 bovid.n.01 +pony.n.01 horse.n.01 +plott_hound.n.01 carnivore.n.01 +sand_cat.n.01 feline.n.01 +shrew_mole.n.01 placental.n.01 +guenon.n.01 guenon.n.01 +unguiculata.n.01 unguiculata.n.01 +flying_fox.n.01 flying_fox.n.01 +chesapeake_bay_retriever.n.01 dog.n.01 +jumping_mouse.n.01 mammal.n.01 +sea_lion.n.01 placental.n.01 +brood_bitch.n.01 placental.n.01 +brush-tailed_porcupine.n.01 porcupine.n.01 +tiger_cub.n.01 tiger.n.02 +jackrabbit.n.01 lagomorph.n.01 +proconsul.n.03 primate.n.02 +baleen_whale.n.01 aquatic_mammal.n.01 +numbat.n.01 numbat.n.01 +abyssinian.n.01 carnivore.n.01 +tom.n.02 placental.n.01 +pole_horse.n.02 workhorse.n.02 +phalanger.n.01 marsupial.n.01 +european_rabbit.n.01 rabbit.n.01 +freetail.n.01 bat.n.01 +sealyham_terrier.n.01 terrier.n.01 +fossa.n.03 carnivore.n.01 +bettong.n.01 kangaroo.n.01 +mediterranean_water_shrew.n.01 mammal.n.01 +guernsey.n.02 bovine.n.01 +brocket.n.02 mammal.n.01 +prancer.n.01 prancer.n.01 +squirrel.n.01 squirrel.n.01 +harp_seal.n.01 earless_seal.n.01 +persian_cat.n.01 carnivore.n.01 +pembroke.n.01 carnivore.n.01 +fawn.n.02 placental.n.01 +peking_man.n.01 mammal.n.01 +wharf_rat.n.02 wharf_rat.n.02 +plott_hound.n.01 placental.n.01 +gnu.n.01 ungulate.n.01 +bullock.n.02 bullock.n.02 +reynard.n.01 reynard.n.01 +paca.n.01 rodent.n.01 +exmoor.n.01 mammal.n.01 +viverrine.n.01 placental.n.01 +giant_armadillo.n.01 mammal.n.01 +pony.n.05 equine.n.01 +toy_poodle.n.01 placental.n.01 +ox.n.01 bovine.n.01 +japanese_spaniel.n.01 carnivore.n.01 +pinniped_mammal.n.01 aquatic_mammal.n.01 +greyhound.n.01 hunting_dog.n.01 +giraffe.n.01 even-toed_ungulate.n.01 +brown_bat.n.01 carnivorous_bat.n.01 +goat_antelope.n.01 placental.n.01 +watchdog.n.02 canine.n.02 +angwantibo.n.01 angwantibo.n.01 +sloth.n.02 sloth.n.02 +marsh_hare.n.01 marsh_hare.n.01 +dolphin.n.02 cetacean.n.01 +napu.n.01 placental.n.01 +nail-tailed_wallaby.n.01 metatherian.n.01 +solo_man.n.01 hominid.n.01 +banded_palm_civet.n.01 banded_palm_civet.n.01 +short-tailed_shrew.n.01 shrew.n.02 +welsh_springer_spaniel.n.01 dog.n.01 +little_brown_bat.n.01 bat.n.01 +lapdog.n.01 mammal.n.01 +pentail.n.01 tree_shrew.n.01 +proboscis_monkey.n.01 proboscis_monkey.n.01 +mouflon.n.01 ruminant.n.01 +chipmunk.n.01 squirrel.n.01 +eastern_lowland_gorilla.n.01 great_ape.n.01 +white-lipped_peccary.n.01 even-toed_ungulate.n.01 +cayuse.n.01 odd-toed_ungulate.n.01 +beaver.n.07 rodent.n.01 +belgian_hare.n.01 leporid.n.01 +mammoth.n.01 proboscidean.n.01 +serval.n.01 mammal.n.01 +llama.n.01 llama.n.01 +meadow_vole.n.01 wood_rat.n.01 +malayan_tapir.n.01 mammal.n.01 +tarsius_syrichta.n.01 placental.n.01 +buck.n.05 buck.n.05 +cheviot.n.01 cheviot.n.01 +ox.n.01 ungulate.n.01 +banteng.n.01 banteng.n.01 +sand_rat.n.01 rodent.n.01 +morgan.n.06 horse.n.01 +longhorn.n.01 mammal.n.01 +marmoset.n.01 monkey.n.01 +rock_squirrel.n.01 placental.n.01 +cattle.n.01 ungulate.n.01 +hack.n.06 equine.n.01 +stirk.n.01 cattle.n.01 +blackbuck.n.01 ruminant.n.01 +warhorse.n.03 ungulate.n.01 +friesian.n.01 ungulate.n.01 +sand_cat.n.01 placental.n.01 +plott_hound.n.01 plott_hound.n.01 +pademelon.n.01 metatherian.n.01 +timber_wolf.n.01 mammal.n.01 +post_horse.n.01 mammal.n.01 +suricate.n.01 carnivore.n.01 +welsh_terrier.n.01 terrier.n.01 +foxhound.n.01 placental.n.01 +baboon.n.01 mammal.n.01 +carabao.n.01 carabao.n.01 +west_highland_white_terrier.n.01 mammal.n.01 +eurasian_hamster.n.01 placental.n.01 +pika.n.01 pika.n.01 +carthorse.n.01 carthorse.n.01 +guereza.n.01 primate.n.02 +dasyurid_marsupial.n.01 dasyurid_marsupial.n.01 +chestnut.n.06 chestnut.n.06 +domestic_goat.n.01 ungulate.n.01 +scottish_deerhound.n.01 hound.n.01 +assault.n.03 ungulate.n.01 +two-toed_sloth.n.02 mammal.n.01 +dinoceras.n.01 dinocerate.n.01 +coonhound.n.01 dog.n.01 +tibetan_terrier.n.01 hunting_dog.n.01 +narwhal.n.01 whale.n.02 +indian_mongoose.n.01 indian_mongoose.n.01 +black-footed_ferret.n.01 mammal.n.01 +white_elephant.n.02 mammal.n.01 +papillon.n.01 placental.n.01 +lesser_ape.n.01 ape.n.01 +wildcat.n.03 placental.n.01 +tennessee_walker.n.01 ungulate.n.01 +ayrshire.n.01 placental.n.01 +bouvier_des_flandres.n.01 bouvier_des_flandres.n.01 +rhodesian_ridgeback.n.01 carnivore.n.01 +exmoor.n.02 odd-toed_ungulate.n.01 +pied_lemming.n.01 lemming.n.01 +spotted_skunk.n.01 mammal.n.01 +hearing_dog.n.01 mammal.n.01 +basset.n.01 basset.n.01 +walker_hound.n.01 hunting_dog.n.01 +musteline_mammal.n.01 placental.n.01 +mustang.n.01 mammal.n.01 +australian_terrier.n.01 canine.n.02 +crab-eating_macaque.n.01 placental.n.01 +otter.n.02 carnivore.n.01 +asian_wild_ox.n.01 ungulate.n.01 +musk_ox.n.01 ungulate.n.01 +cur.n.01 mammal.n.01 +bear_cub.n.01 carnivore.n.01 +algeripithecus_minutus.n.01 primate.n.02 +fur_seal.n.01 aquatic_mammal.n.01 +roebuck.n.01 roebuck.n.01 +steenbok.n.01 steenbok.n.01 +przewalski's_horse.n.01 equine.n.01 +crab-eating_dog.n.01 carnivore.n.01 +cat.n.01 carnivore.n.01 +black_fox.n.01 placental.n.01 +kuvasz.n.01 canine.n.02 +bitch.n.04 canine.n.02 +morgan.n.06 saddle_horse.n.01 +gallant_fox.n.01 gallant_fox.n.01 +silverback.n.01 silverback.n.01 +dasyure.n.01 marsupial.n.01 +gomphothere.n.01 elephant.n.01 +water_chevrotain.n.01 ruminant.n.01 +fallow_deer.n.01 mammal.n.01 +spotted_hyena.n.01 hyena.n.01 +schipperke.n.01 dog.n.01 +domestic_goat.n.01 mammal.n.01 +cactus_mouse.n.01 mammal.n.01 +tortoiseshell.n.03 cat.n.01 +ibex.n.01 placental.n.01 +brabancon_griffon.n.01 carnivore.n.01 +bellwether.n.02 ungulate.n.01 +coyote.n.01 carnivore.n.01 +american_bison.n.01 mammal.n.01 +large_poodle.n.01 mammal.n.01 +dall_sheep.n.01 mammal.n.01 +lesser_ape.n.01 mammal.n.01 +cashmere_goat.n.01 even-toed_ungulate.n.01 +wildcat.n.03 feline.n.01 +new_world_tapir.n.01 tapir.n.01 +silky_tamarin.n.01 silky_tamarin.n.01 +southern_flying_squirrel.n.01 southern_flying_squirrel.n.01 +cryptoprocta.n.01 civet.n.01 +tamarau.n.01 even-toed_ungulate.n.01 +least_shrew.n.01 least_shrew.n.01 +cattle.n.01 cattle.n.01 +crab-eating_dog.n.01 placental.n.01 +dolphin.n.02 dolphin.n.02 +brocket.n.01 mammal.n.01 +warhorse.n.03 mammal.n.01 +grade.n.09 placental.n.01 +rorqual.n.01 whale.n.02 +goat.n.01 even-toed_ungulate.n.01 +percheron.n.01 odd-toed_ungulate.n.01 +ground_squirrel.n.02 squirrel.n.01 +leporid.n.01 placental.n.01 +bactrian_camel.n.01 camel.n.01 +old_world_monkey.n.01 primate.n.02 +bullterrier.n.01 placental.n.01 +australopithecus_boisei.n.01 hominid.n.01 +coonhound.n.01 canine.n.02 +tarpan.n.01 mammal.n.01 +border_collie.n.01 shepherd_dog.n.01 +hooded_skunk.n.01 placental.n.01 +tamandua.n.01 anteater.n.02 +japanese_spaniel.n.01 canine.n.02 +griffon.n.02 placental.n.01 +leopard.n.02 placental.n.01 +cetacean.n.01 aquatic_mammal.n.01 +moke.n.01 moke.n.01 +trotting_horse.n.01 trotting_horse.n.01 +mustang.n.01 odd-toed_ungulate.n.01 +prosimian.n.01 mammal.n.01 +jungle_cat.n.01 feline.n.01 +american_mink.n.01 carnivore.n.01 +new_world_mouse.n.01 rodent.n.01 +plow_horse.n.01 equine.n.01 +mouser.n.01 mammal.n.01 +lechwe.n.01 ruminant.n.01 +wisent.n.01 wisent.n.01 +serotine.n.01 placental.n.01 +maltese.n.03 carnivore.n.01 +pocket_mouse.n.01 pocket_rat.n.01 +weimaraner.n.01 hunting_dog.n.01 +chacma.n.01 baboon.n.01 +canada_porcupine.n.01 mammal.n.01 +pocketed_bat.n.01 bat.n.01 +scotch_terrier.n.01 placental.n.01 +steenbok.n.01 ruminant.n.01 +vizsla.n.01 hunting_dog.n.01 +dairy_cattle.n.01 cattle.n.01 +saluki.n.01 saluki.n.01 +sinanthropus.n.01 sinanthropus.n.01 +exmoor.n.02 equine.n.01 +gopher.n.04 placental.n.01 +phyllostomus_hastatus.n.01 phyllostomus_hastatus.n.01 +chestnut.n.06 odd-toed_ungulate.n.01 +fox_terrier.n.01 dog.n.01 +false_saber-toothed_tiger.n.01 big_cat.n.01 +zebu.n.01 ruminant.n.01 +curly-coated_retriever.n.01 placental.n.01 +rat.n.01 placental.n.01 +galago.n.01 lemur.n.01 +border_terrier.n.01 terrier.n.01 +armadillo.n.01 edentate.n.01 +ibizan_hound.n.01 ibizan_hound.n.01 +dall_sheep.n.01 wild_sheep.n.01 +giant_eland.n.01 placental.n.01 +sled_dog.n.01 sled_dog.n.01 +gorilla.n.01 primate.n.02 +sorrel.n.05 horse.n.01 +liver-spotted_dalmatian.n.01 liver-spotted_dalmatian.n.01 +macrotus.n.01 macrotus.n.01 +solo_man.n.01 primate.n.02 +alaska_fur_seal.n.01 mammal.n.01 +wild_horse.n.01 equine.n.01 +southeastern_pocket_gopher.n.01 pocket_rat.n.01 +field_mouse.n.02 rodent.n.01 +lhasa.n.02 terrier.n.01 +brewer's_mole.n.01 placental.n.01 +potoroo.n.01 mammal.n.01 +american_water_spaniel.n.01 carnivore.n.01 +nanny.n.02 bovid.n.01 +beef.n.01 mammal.n.01 +cocker_spaniel.n.01 cocker_spaniel.n.01 +tabby.n.02 tabby.n.02 +cheviot.n.01 mammal.n.01 +mastiff_bat.n.01 bat.n.01 +oryx.n.01 placental.n.01 +onager.n.02 onager.n.02 +stepper.n.03 horse.n.01 +bellwether.n.02 sheep.n.01 +dusky-footed_wood_rat.n.01 placental.n.01 +warthog.n.01 swine.n.01 +fallow_deer.n.01 ungulate.n.01 +eastern_cottontail.n.01 wood_rabbit.n.01 +goral.n.01 ungulate.n.01 +sow.n.01 swine.n.01 +boskop_man.n.01 primate.n.02 +pole_horse.n.01 horse.n.01 +grivet.n.01 monkey.n.01 +pilot_whale.n.01 aquatic_mammal.n.01 +lynx.n.02 carnivore.n.01 +guanaco.n.01 mammal.n.01 +ichneumon.n.01 viverrine.n.01 +shrew_mole.n.01 insectivore.n.01 +tatouay.n.01 edentate.n.01 +pygmy_marmoset.n.01 mammal.n.01 +vizsla.n.01 vizsla.n.01 +kangaroo_mouse.n.01 rat.n.01 +barbary_ape.n.01 monkey.n.01 +syrian_bear.n.01 carnivore.n.01 +affenpinscher.n.01 pinscher.n.01 +mountain_gorilla.n.01 placental.n.01 +standard_poodle.n.01 canine.n.02 +chamois.n.02 ruminant.n.01 +dog.n.01 canine.n.02 +blue_point_siamese.n.01 cat.n.01 +european_water_shrew.n.01 placental.n.01 +tabby.n.01 carnivore.n.01 +manul.n.01 placental.n.01 +striped_hyena.n.01 striped_hyena.n.01 +whirlaway.n.01 horse.n.01 +new_world_least_weasel.n.01 mammal.n.01 +leveret.n.01 placental.n.01 +bullock.n.01 placental.n.01 +norfolk_terrier.n.01 norfolk_terrier.n.01 +goral.n.01 goral.n.01 +sea_cow.n.01 sea_cow.n.01 +homo_soloensis.n.01 primate.n.02 +moke.n.01 ass.n.03 +elk.n.01 deer.n.01 +plantigrade_mammal.n.01 plantigrade_mammal.n.01 +eastern_woodrat.n.01 eastern_woodrat.n.01 +aye-aye.n.01 primate.n.02 +feist.n.01 mammal.n.01 +pug.n.01 carnivore.n.01 +white_rhinoceros.n.01 ungulate.n.01 +pronghorn.n.01 placental.n.01 +striped_muishond.n.01 placental.n.01 +guadalupe_fur_seal.n.01 placental.n.01 +eland.n.01 mammal.n.01 +bovid.n.01 bovid.n.01 +guernsey.n.02 even-toed_ungulate.n.01 +mountain_paca.n.01 placental.n.01 +moke.n.01 mammal.n.01 +leafnose_bat.n.01 mammal.n.01 +eohippus.n.01 placental.n.01 +marsh_hare.n.01 mammal.n.01 +steeplechaser.n.01 equine.n.01 +prancer.n.01 odd-toed_ungulate.n.01 +northern_bog_lemming.n.01 northern_bog_lemming.n.01 +rat_terrier.n.01 rat_terrier.n.01 +vervet.n.01 primate.n.02 +hunting_dog.n.01 placental.n.01 +siamang.n.01 siamang.n.01 +rat.n.01 mammal.n.01 +common_dolphin.n.01 aquatic_mammal.n.01 +nail-tailed_wallaby.n.01 kangaroo.n.01 +hognose_bat.n.01 hognose_bat.n.01 +homo_habilis.n.01 homo_habilis.n.01 +camel.n.01 even-toed_ungulate.n.01 +ewe.n.03 ungulate.n.01 +rogue_elephant.n.01 elephant.n.01 +retriever.n.01 carnivore.n.01 +pole_horse.n.02 mammal.n.01 +packhorse.n.01 mammal.n.01 +chacma.n.01 mammal.n.01 +eastern_lowland_gorilla.n.01 mammal.n.01 +european_hare.n.01 lagomorph.n.01 +neandertal_man.n.01 hominid.n.01 +llama.n.01 mammal.n.01 +central_chimpanzee.n.01 chimpanzee.n.01 +smooth-haired_fox_terrier.n.01 mammal.n.01 +bovine.n.01 bovid.n.01 +malinois.n.01 carnivore.n.01 +french_bulldog.n.01 placental.n.01 +european_rabbit.n.01 leporid.n.01 +marmoset.n.01 primate.n.02 +silverback.n.01 anthropoid_ape.n.01 +chigetai.n.01 ungulate.n.01 +old_world_least_weasel.n.01 mammal.n.01 +hart.n.03 hart.n.03 +angora.n.02 angora.n.02 +elephant_seal.n.01 elephant_seal.n.01 +macrotus.n.01 bat.n.01 +dog.n.01 dog.n.01 +leopard_cat.n.01 leopard_cat.n.01 +house_mouse.n.01 mouse.n.01 +greyhound.n.01 canine.n.02 +white_wolf.n.01 placental.n.01 +whale.n.02 placental.n.01 +hartebeest.n.01 hartebeest.n.01 +southern_bog_lemming.n.01 rodent.n.01 +springer.n.02 placental.n.01 +sperm_whale.n.01 aquatic_mammal.n.01 +longhorn.n.01 bovine.n.01 +aardvark.n.01 mammal.n.01 +german_short-haired_pointer.n.01 placental.n.01 +plow_horse.n.01 placental.n.01 +grampus.n.02 grampus.n.02 +dingo.n.01 wild_dog.n.01 +arabian.n.02 equine.n.01 +shih-tzu.n.01 mammal.n.01 +western_grey_squirrel.n.01 placental.n.01 +african_wild_ass.n.01 ungulate.n.01 +tiger.n.02 tiger.n.02 +titi.n.03 titi.n.03 +wallaby.n.01 kangaroo.n.01 +gazelle.n.01 mammal.n.01 +cynopterus_sphinx.n.01 bat.n.01 +africander.n.01 mammal.n.01 +ice_bear.n.01 bear.n.01 +cro-magnon.n.01 hominid.n.01 +valley_pocket_gopher.n.01 valley_pocket_gopher.n.01 +eastern_lowland_gorilla.n.01 ape.n.01 +cob.n.02 mammal.n.01 +bezoar_goat.n.01 mammal.n.01 +sporting_dog.n.01 mammal.n.01 +cynocephalus_variegatus.n.01 cynocephalus_variegatus.n.01 +red_fox.n.02 red_fox.n.02 +burmese_cat.n.01 burmese_cat.n.01 +silky_tamarin.n.01 tamarin.n.01 +argali.n.01 bovid.n.01 +crab-eating_raccoon.n.01 mammal.n.01 +tarsier.n.01 placental.n.01 +spearnose_bat.n.01 mammal.n.01 +shetland_sheepdog.n.01 dog.n.01 +american_marten.n.01 marten.n.01 +stablemate.n.01 placental.n.01 +wild_horse.n.01 odd-toed_ungulate.n.01 +eohippus.n.01 ungulate.n.01 +pallid_bat.n.01 placental.n.01 +swamp_rabbit.n.02 mammal.n.01 +irish_wolfhound.n.01 hunting_dog.n.01 +american_bison.n.01 american_bison.n.01 +smooth-haired_fox_terrier.n.01 hunting_dog.n.01 +jersey.n.05 placental.n.01 +mastiff_bat.n.01 placental.n.01 +hare.n.01 placental.n.01 +wether.n.01 wether.n.01 +mouse.n.01 mouse.n.01 +percheron.n.01 mammal.n.01 +irish_water_spaniel.n.01 mammal.n.01 +glutton.n.02 carnivore.n.01 +buckskin.n.01 equine.n.01 +homo_sapiens_sapiens.n.01 homo.n.02 +airedale.n.01 placental.n.01 +asiatic_flying_squirrel.n.01 squirrel.n.01 +feline.n.01 feline.n.01 +mantled_ground_squirrel.n.01 placental.n.01 +elephant.n.01 placental.n.01 +hackney.n.02 horse.n.01 +frosted_bat.n.01 vespertilian_bat.n.01 +santa_gertrudis.n.01 cattle.n.01 +irish_wolfhound.n.01 carnivore.n.01 +pekinese.n.01 placental.n.01 +chesapeake_bay_retriever.n.01 mammal.n.01 +crab-eating_raccoon.n.01 raccoon.n.02 +white_elephant.n.02 pachyderm.n.01 +staghound.n.01 canine.n.02 +bloodhound.n.01 canine.n.02 +central_chimpanzee.n.01 great_ape.n.01 +gazella_subgutturosa.n.01 ruminant.n.01 +dun.n.01 saddle_horse.n.01 +jackrabbit.n.01 hare.n.01 +chevrotain.n.01 ungulate.n.01 +aberdeen_angus.n.01 beef.n.01 +mink.n.03 mink.n.03 +american_foxhound.n.01 mammal.n.01 +bullock.n.02 even-toed_ungulate.n.01 +saiga.n.01 antelope.n.01 +fox_squirrel.n.01 squirrel.n.01 +pinto.n.01 mammal.n.01 +little_chief_hare.n.01 pika.n.01 +miniature_pinscher.n.01 miniature_pinscher.n.01 +round-tailed_muskrat.n.01 round-tailed_muskrat.n.01 +crowbait.n.01 mammal.n.01 +damaraland_mole_rat.n.01 mammal.n.01 +kangaroo_mouse.n.02 jerboa_rat.n.01 +false_saber-toothed_tiger.n.01 mammal.n.01 +black_fox.n.01 fox.n.01 +green_monkey.n.01 old_world_monkey.n.01 +aberdeen_angus.n.01 bovine.n.01 +sled_dog.n.01 mammal.n.01 +little_chief_hare.n.01 placental.n.01 +springer_spaniel.n.01 sporting_dog.n.01 +hereford.n.01 mammal.n.01 +zebu.n.01 zebu.n.01 +schnauzer.n.01 dog.n.01 +samoyed.n.03 carnivore.n.01 +flickertail.n.01 squirrel.n.01 +cynocephalus_variegatus.n.01 mammal.n.01 +harpy.n.03 bat.n.01 +brush-tailed_phalanger.n.01 phalanger.n.01 +coach_horse.n.01 horse.n.01 +liger.n.01 feline.n.01 +margay.n.01 placental.n.01 +mountain_gorilla.n.01 anthropoid_ape.n.01 +longhorn.n.01 beef.n.01 +red_fox.n.02 mammal.n.01 +indian_rhinoceros.n.01 odd-toed_ungulate.n.01 +llama.n.01 even-toed_ungulate.n.01 +asiatic_flying_squirrel.n.01 rodent.n.01 +collie.n.01 working_dog.n.01 +kerry_blue_terrier.n.01 hunting_dog.n.01 +saddle_horse.n.01 saddle_horse.n.01 +new_world_beaver.n.01 beaver.n.07 +mountain_chinchilla.n.01 placental.n.01 +english_foxhound.n.01 english_foxhound.n.01 +leveret.n.01 leporid.n.01 +shetland_sheepdog.n.01 canine.n.02 +beagle.n.01 beagle.n.01 +tibetan_mastiff.n.01 tibetan_mastiff.n.01 +bouvier_des_flandres.n.01 canine.n.02 +wheel_horse.n.01 placental.n.01 +pocket_rat.n.01 rat.n.01 +malinois.n.01 working_dog.n.01 +white_elephant.n.02 white_elephant.n.02 +camel.n.01 camel.n.01 +mexican_pocket_mouse.n.01 rat.n.01 +vaquita.n.01 toothed_whale.n.01 +manchester_terrier.n.01 hunting_dog.n.01 +chacma.n.01 monkey.n.01 +binturong.n.01 viverrine.n.01 +mastiff_bat.n.01 mammal.n.01 +goat.n.01 mammal.n.01 +pembroke.n.01 canine.n.02 +steenbok.n.01 ungulate.n.01 +tarsius_syrichta.n.01 mammal.n.01 +maltese.n.03 domestic_cat.n.01 +pacific_bottlenose_dolphin.n.01 toothed_whale.n.01 +tamandua.n.01 tamandua.n.01 +murine.n.01 rodent.n.01 +coyote.n.01 canine.n.02 +king_charles_spaniel.n.01 placental.n.01 +basset.n.01 canine.n.02 +pygmy_mouse.n.01 pygmy_mouse.n.01 +toy_spaniel.n.01 carnivore.n.01 +cactus_mouse.n.01 mouse.n.01 +hart.n.03 ruminant.n.01 +broodmare.n.01 equine.n.01 +sussex_spaniel.n.01 sporting_dog.n.01 +omaha.n.04 odd-toed_ungulate.n.01 +alaska_fur_seal.n.01 placental.n.01 +cattalo.n.01 bovine.n.01 +soft-coated_wheaten_terrier.n.01 mammal.n.01 +harness_horse.n.01 horse.n.01 +banteng.n.01 even-toed_ungulate.n.01 From 7fa8a9f9ed5fd62e99fb7a176fb299ebfba1d9fc Mon Sep 17 00:00:00 2001 From: Menshikh Ivan Date: Mon, 25 Dec 2017 21:20:28 +0500 Subject: [PATCH 02/14] Fix tox.ini/setup.cfg configuration (#1815) * update according to new pytest_benchmark version * update wheel-storage url * use only twine --- setup.cfg | 2 +- tox.ini | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/setup.cfg b/setup.cfg index 282192a170..f35f138329 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,4 +1,4 @@ [wheelhouse_uploader] artifact_indexes= # all wheels builded in gensim-wheels repo: https://github.com/MacPython/gensim-wheels - http://b153eb958f4da6029aca-3f9dff7fe564350f10153d8c7bfc5ab6.r54.cf2.rackcdn.com/index.html + http://b153eb958f4da6029aca-3f9dff7fe564350f10153d8c7bfc5ab6.r54.cf2.rackcdn.com/ diff --git a/tox.ini b/tox.ini index 229692fbee..d8cf92ed69 100644 --- a/tox.ini +++ b/tox.ini @@ -13,7 +13,7 @@ builtins = get_ipython [pytest] -addopts = -rfxEXs --durations=20 --showlocals --rerun 3 +addopts = -rfxEXs --durations=20 --showlocals --reruns 3 --reruns-delay 1 [testenv] @@ -76,14 +76,13 @@ commands = [testenv:upload-wheels] -deps = wheelhouse_uploader +deps = twine -commands = python setup.py register sdist upload +commands = twine upload dist/* [testenv:test-pypi] -deps = wheelhouse_uploader - twine +deps = twine whitelist_externals = rm commands = From 255ce25903c2521ad6c92c00875a7dc3aa88fe7d Mon Sep 17 00:00:00 2001 From: Kumar Akshay Date: Tue, 26 Dec 2017 20:24:31 +0530 Subject: [PATCH 03/14] Fix docstrings for `gensim.utils` (#1797) * Add docstrings in numpy-style fromat * fix PEP8 * remove outdated "hack" (smart_open is core dependency right now) * fix docstrings[1] * remove unused internal class * fix docstrings[2] * fix docstrings[3] * fix docstrings[4] * fix docstrings[5] * fix docstrings[6] * fix docstrings[7] * fix docstrings[8] * add missing `pattern` to doc dependencies * fix docstrings[9] * fix docstrings[10] --- gensim/utils.py | 1276 ++++++++++++++++++++++++++++++++++------------- setup.py | 2 +- 2 files changed, 941 insertions(+), 337 deletions(-) diff --git a/gensim/utils.py b/gensim/utils.py index 1a499a6d61..3f35824fed 100644 --- a/gensim/utils.py +++ b/gensim/utils.py @@ -4,9 +4,7 @@ # Copyright (C) 2010 Radim Rehurek # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html -""" -This module contains various general utility functions. -""" +"""This module contains various general utility functions.""" from __future__ import with_statement @@ -43,50 +41,44 @@ from six import iterkeys, iteritems, u, string_types, unichr from six.moves import xrange +from smart_open import smart_open + if sys.version_info[0] >= 3: unicode = str logger = logging.getLogger(__name__) -try: - from smart_open import smart_open -except ImportError: - logger.info("smart_open library not found; falling back to local-filesystem-only") - def make_closing(base, **attrs): - """ - Add support for `with Base(attrs) as fout:` to the base class if it's missing. - The base class' `close()` method will be called on context exit, to always close the file properly. +PAT_ALPHABETIC = re.compile(r'(((?![\d])\w)+)', re.UNICODE) +RE_HTML_ENTITY = re.compile(r'&(#?)([xX]?)(\w{1,8});', re.UNICODE) - This is needed for gzip.GzipFile, bz2.BZ2File etc in older Pythons (<=2.6), which otherwise - raise "AttributeError: GzipFile instance has no attribute '__exit__'". - """ - if not hasattr(base, '__enter__'): - attrs['__enter__'] = lambda self: self - if not hasattr(base, '__exit__'): - attrs['__exit__'] = lambda self, type, value, traceback: self.close() - return type('Closing' + base.__name__, (base, object), attrs) - - def smart_open(fname, mode='rb'): - _, ext = os.path.splitext(fname) - if ext == '.bz2': - from bz2 import BZ2File - return make_closing(BZ2File)(fname, mode) - if ext == '.gz': - from gzip import GzipFile - return make_closing(GzipFile)(fname, mode) - return open(fname, mode) +def get_random_state(seed): + """Generate :class:`numpy.random.RandomState` based on input seed. + Parameters + ---------- + seed : {None, int, array_like} + Seed for random state. -PAT_ALPHABETIC = re.compile(r'(((?![\d])\w)+)', re.UNICODE) -RE_HTML_ENTITY = re.compile(r'&(#?)([xX]?)(\w{1,8});', re.UNICODE) + Returns + ------- + :class:`numpy.random.RandomState` + Random state. + Raises + ------ + AttributeError + If seed is not {None, int, array_like}. + + Notes + ----- + Method originally from [1]_ and written by @joshloyal. + + References + ---------- + .. [1] https://github.com/maciejkula/glove-python -def get_random_state(seed): - """ - Turn seed into a np.random.RandomState instance. - Method originally from maciejkula/glove-python, and written by @joshloyal. """ if seed is None or seed is np.random: return np.random.mtrand._rand @@ -98,10 +90,16 @@ def get_random_state(seed): def synchronous(tlockname): - """ - A decorator to place an instance-based lock around a method. + """A decorator to place an instance-based lock around a method. + + Notes + ----- + Adapted from [2]_ + + References + ---------- + .. [2] http://code.activestate.com/recipes/577105-synchronization-decorator-for-class-methods/ - Adapted from http://code.activestate.com/recipes/577105-synchronization-decorator-for-class-methods/ """ def _synched(func): @wraps(func) @@ -118,27 +116,18 @@ def _synchronizer(self, *args, **kwargs): return _synched -class NoCM(object): - def acquire(self): - pass - - def release(self): - pass - - def __enter__(self): - pass - - def __exit__(self, type, value, traceback): - pass - - -nocm = NoCM() +def file_or_filename(input): + """Open file with `smart_open`. + Parameters + ---------- + input : str or file-like + Filename or file-like object. -def file_or_filename(input): - """ - Return a file-like object ready to be read from the beginning. `input` is either - a filename (gz/bz2 also supported) or a file-like object supporting seek. + Returns + ------- + input : file-like object + Opened file OR seek out to 0 byte if `input` is already file-like object. """ if isinstance(input, string_types): @@ -151,11 +140,21 @@ def file_or_filename(input): def deaccent(text): - """ - Remove accentuation from the given string. Input text is either a unicode string or utf8 encoded bytestring. + """Remove accentuation from the given string. - Return input string with accents removed, as unicode. + Parameters + ---------- + text : str + Input string. + Returns + ------- + str + Unicode string without accentuation. + + Examples + -------- + >>> from gensim.utils import deaccent >>> deaccent("Šéf chomutovských komunistů dostal poštou bílý prášek") u'Sef chomutovskych komunistu dostal postou bily prasek' @@ -169,9 +168,19 @@ def deaccent(text): def copytree_hardlink(source, dest): - """ - Recursively copy a directory ala shutils.copytree, but hardlink files - instead of copying. Available on UNIX systems only. + """Recursively copy a directory ala shutils.copytree, but hardlink files instead of copying. + + Parameters + ---------- + source : str + Path to source directory + dest : str + Path to destination directory + + Warnings + -------- + Available on UNIX systems only. + """ copy2 = shutil.copy2 try: @@ -182,17 +191,35 @@ def copytree_hardlink(source, dest): def tokenize(text, lowercase=False, deacc=False, encoding='utf8', errors="strict", to_lower=False, lower=False): - """ - Iteratively yield tokens as unicode strings, removing accent marks - and optionally lowercasing the unidoce string by assigning True - to one of the parameters, lowercase, to_lower, or lower. - - Input text may be either unicode or utf8-encoded byte string. - - The tokens on output are maximal contiguous sequences of alphabetic - characters (no digits!). - - >>> list(tokenize('Nic nemůže letět rychlostí vyšší, než 300 tisíc kilometrů za sekundu!', deacc = True)) + """Iteratively yield tokens as unicode strings, removing accent marks and optionally lowercasing string + if any from `lowercase`, `to_lower`, `lower` set to True. + + Parameters + ---------- + text : str + Input string. + lowercase : bool, optional + If True - lowercase input string. + deacc : bool, optional + If True - remove accentuation from string by :func:`~gensim.utils.deaccent`. + encoding : str, optional + Encoding of input string, used as parameter for :func:`~gensim.utils.to_unicode`. + errors : str, optional + Error handling behaviour, used as parameter for :func:`~gensim.utils.to_unicode`. + to_lower : bool, optional + Same as `lowercase`. + lower : bool, optional + Same as `lowercase`. + + Yields + ------ + str + Contiguous sequences of alphabetic characters (no digits!), using :func:`~gensim.utils.simple_tokenize` + + Examples + -------- + >>> from gensim.utils import tokenize + >>> list(tokenize('Nic nemůže letět rychlostí vyšší, než 300 tisíc kilometrů za sekundu!', deacc=True)) [u'Nic', u'nemuze', u'letet', u'rychlosti', u'vyssi', u'nez', u'tisic', u'kilometru', u'za', u'sekundu'] """ @@ -206,16 +233,42 @@ def tokenize(text, lowercase=False, deacc=False, encoding='utf8', errors="strict def simple_tokenize(text): + """Tokenize input test using :const:`gensim.utils.PAT_ALPHABETIC`. + + Parameters + ---------- + text : str + Input text. + + Yields + ------ + str + Tokens from `text`. + + """ for match in PAT_ALPHABETIC.finditer(text): yield match.group() def simple_preprocess(doc, deacc=False, min_len=2, max_len=15): - """ - Convert a document into a list of tokens. - - This lowercases, tokenizes, de-accents (optional). -- the output are final - tokens = unicode strings, that won't be processed any further. + """Convert a document into a list of tokens (also with lowercase and optional de-accents), + used :func:`~gensim.utils.tokenize`. + + Parameters + ---------- + doc : str + Input document. + deacc : bool, optional + If True - remove accentuation from string by :func:`~gensim.utils.deaccent`. + min_len : int, optional + Minimal length of token in result (inclusive). + max_len : int, optional + Maximal length of token in result (inclusive). + + Returns + ------- + list of str + Tokens extracted from `doc`. """ tokens = [ @@ -226,7 +279,24 @@ def simple_preprocess(doc, deacc=False, min_len=2, max_len=15): def any2utf8(text, errors='strict', encoding='utf8'): - """Convert a string (unicode or bytestring in `encoding`), to bytestring in utf8.""" + """Convert `text` to bytestring in utf8. + + Parameters + ---------- + text : str + Input text. + errors : str, optional + Error handling behaviour, used as parameter for `unicode` function (python2 only). + encoding : str, optional + Encoding of `text` for `unicode` function (python2 only). + + Returns + ------- + str + Bytestring in utf8. + + """ + if isinstance(text, unicode): return text.encode('utf8') # do bytestring -> unicode -> utf8 full circle, to ensure valid utf8 @@ -237,7 +307,23 @@ def any2utf8(text, errors='strict', encoding='utf8'): def any2unicode(text, encoding='utf8', errors='strict'): - """Convert a string (bytestring in `encoding` or unicode), to unicode.""" + """Convert `text` to unicode. + + Parameters + ---------- + text : str + Input text. + errors : str, optional + Error handling behaviour, used as parameter for `unicode` function (python2 only). + encoding : str, optional + Encoding of `text` for `unicode` function (python2 only). + + Returns + ------- + str + Unicode version of `text`. + + """ if isinstance(text, unicode): return text return unicode(text, encoding, errors=errors) @@ -247,31 +333,59 @@ def any2unicode(text, encoding='utf8', errors='strict'): def call_on_class_only(*args, **kwargs): - """Raise exception when load methods are called on instance""" + """Helper for raise `AttributeError` if method should be called from instance. + + Parameters + ---------- + *args + Variable length argument list. + **kwargs + Arbitrary keyword arguments. + + Raises + ------ + AttributeError + If `load` method are called on instance. + + """ raise AttributeError('This method should be called on a class object.') class SaveLoad(object): - """ - Objects which inherit from this class have save/load functions, which un/pickle - them to disk. + """Class which inherit from this class have save/load functions, which un/pickle them to disk. - This uses pickle for de/serializing, so objects must not contain - unpicklable attributes, such as lambda functions etc. + Warnings + -------- + This uses pickle for de/serializing, so objects must not contain unpicklable attributes, + such as lambda functions etc. """ @classmethod def load(cls, fname, mmap=None): - """ - Load a previously saved object from file (also see `save`). - - If the object was saved with large arrays stored separately, you can load - these arrays via mmap (shared memory) using `mmap='r'`. Default: don't use - mmap, load large arrays as normal objects. - - If the file being loaded is compressed (either '.gz' or '.bz2'), then - `mmap=None` must be set. Load will raise an `IOError` if this condition - is encountered. + """Load a previously saved object (using :meth:`~gensim.utils.SaveLoad.save`) from file. + + Parameters + ---------- + fname : str + Path to file that contains needed object. + mmap : str, optional + Memory-map option. If the object was saved with large arrays stored separately, you can load these arrays + via mmap (shared memory) using `mmap='r'. + If the file being loaded is compressed (either '.gz' or '.bz2'), then `mmap=None` **must be** set. + + See Also + -------- + :meth:`~gensim.utils.SaveLoad.save` + + Returns + ------- + object + Object loaded from `fname`. + + Raises + ------ + IOError + When methods are called on instance (should be called from class). """ logger.info("loading %s object from %s", cls.__name__, fname) @@ -284,9 +398,20 @@ def load(cls, fname, mmap=None): return obj def _load_specials(self, fname, mmap, compress, subname): - """ - Loads any attributes that were stored specially, and gives the same - opportunity to recursively included SaveLoad instances. + """Loads any attributes that were stored specially, and gives the same opportunity + to recursively included :class:`~gensim.utils.SaveLoad` instances. + + Parameters + ---------- + fname : str + Path to file that contains needed object. + mmap : str + Memory-map option. + compress : bool + Set to True if file is compressed. + subname : str + ... + """ def mmap_error(obj, filename): @@ -337,14 +462,40 @@ def mmap_error(obj, filename): @staticmethod def _adapt_by_suffix(fname): - """Give appropriate compress setting and filename formula""" + """Give appropriate compress setting and filename formula. + + Parameters + ---------- + fname : str + Input filename. + + Returns + ------- + (bool, function) + First argument will be True if `fname` compressed. + + """ compress, suffix = (True, 'npz') if fname.endswith('.gz') or fname.endswith('.bz2') else (False, 'npy') return compress, lambda *args: '.'.join(args + (suffix,)) def _smart_save(self, fname, separately=None, sep_limit=10 * 1024**2, ignore=frozenset(), pickle_protocol=2): - """ - Save the object to file (also see `load`). - + """Save the object to file. + + Parameters + ---------- + fname : str + Path to file. + separately : list, optional + Iterable of attributes than need to store distinctly. + sep_limit : int, optional + Limit for separation. + ignore : frozenset, optional + Attributes that shouldn't be store. + pickle_protocol : int, optional + Protocol number for pickle. + + Notes + ----- If `separately` is None, automatically detect large numpy/scipy.sparse arrays in the object being stored, and store them into separate files. This avoids pickle memory errors and @@ -354,12 +505,9 @@ def _smart_save(self, fname, separately=None, sep_limit=10 * 1024**2, ignore=fro a list of attribute names to be stored in separate files. The automatic check is not performed in this case. - `ignore` is a set of attribute names to *not* serialize (file - handles, caches etc). On subsequent load() these attributes will - be set to None. - - `pickle_protocol` defaults to 2 so the pickled object can be imported - in both Python 2 and 3. + See Also + -------- + :meth:`~gensim.utils.SaveLoad.load` """ logger.info("saving %s object under %s, separately %s", self.__class__.__name__, fname, separately) @@ -378,13 +526,31 @@ def _smart_save(self, fname, separately=None, sep_limit=10 * 1024**2, ignore=fro logger.info("saved %s", fname) def _save_specials(self, fname, separately, sep_limit, ignore, pickle_protocol, compress, subname): - """ - Save aside any attributes that need to be handled separately, including - by recursion any attributes that are themselves SaveLoad instances. - - Returns a list of (obj, {attrib: value, ...}) settings that the caller - should use to restore each object's attributes that were set aside - during the default pickle(). + """Save aside any attributes that need to be handled separately, including + by recursion any attributes that are themselves :class:`~gensim.utils.SaveLoad` instances. + + Parameters + ---------- + fname : str + Output filename. + separately : list or None + Iterable of attributes than need to store distinctly + sep_limit : int + Limit for separation. + ignore : iterable of str + Attributes that shouldn't be store. + pickle_protocol : int + Protocol number for pickle. + compress : bool + If True - compress output with :func:`numpy.savez_compressed`. + subname : function + Produced by :meth:`~gensim.utils.SaveLoad._adapt_by_suffix` + + Returns + ------- + list of (obj, {attrib: value, ...}) + Settings that the caller should use to restore each object's attributes that were set aside + during the default :func:`~gensim.utils.pickle`. """ asides = {} @@ -463,29 +629,29 @@ def _save_specials(self, fname, separately, sep_limit, ignore, pickle_protocol, return restores + [(self, asides)] def save(self, fname_or_handle, separately=None, sep_limit=10 * 1024**2, ignore=frozenset(), pickle_protocol=2): - """ - Save the object to file (also see `load`). - - `fname_or_handle` is either a string specifying the file name to - save to, or an open file-like object which can be written to. If - the object is a file handle, no special array handling will be - performed; all attributes will be saved to the same file. - - If `separately` is None, automatically detect large - numpy/scipy.sparse arrays in the object being stored, and store - them into separate files. This avoids pickle memory errors and - allows mmap'ing large arrays back on load efficiently. - - You can also set `separately` manually, in which case it must be - a list of attribute names to be stored in separate files. The - automatic check is not performed in this case. - - `ignore` is a set of attribute names to *not* serialize (file - handles, caches etc). On subsequent load() these attributes will - be set to None. - - `pickle_protocol` defaults to 2 so the pickled object can be imported - in both Python 2 and 3. + """Save the object to file. + + Parameters + ---------- + fname_or_handle : str or file-like + Path to output file or already opened file-like object. If the object is a file handle, + no special array handling will be performed, all attributes will be saved to the same file. + separately : list of str or None, optional + If None - automatically detect large numpy/scipy.sparse arrays in the object being stored, and store + them into separate files. This avoids pickle memory errors and allows mmap'ing large arrays + back on load efficiently. + If list of str - this attributes will be stored in separate files, the automatic check + is not performed in this case. + sep_limit : int + Limit for automatic separation. + ignore : frozenset of str + Attributes that shouldn't be serialize/store. + pickle_protocol : int + Protocol number for pickle. + + See Also + -------- + :meth:`~gensim.utils.SaveLoad.load` """ try: @@ -496,15 +662,38 @@ def save(self, fname_or_handle, separately=None, sep_limit=10 * 1024**2, ignore= def identity(p): - """Identity fnc, for flows that don't accept lambda (pickling etc).""" + """Identity fnc, for flows that don't accept lambda (pickling etc). + + Parameters + ---------- + p : object + Input parameter. + + Returns + ------- + object + Same as `p`. + + """ return p def get_max_id(corpus): - """ - Return the highest feature id that appears in the corpus. + """Get the highest feature id that appears in the corpus. - For empty corpora (no features at all), return -1. + Parameters + ---------- + corpus : iterable of iterable of (int, int) + Collection of texts in BoW format. + + Returns + ------ + int + Highest feature id. + + Notes + ----- + For empty `corpus` return -1. """ maxid = -1 @@ -514,16 +703,22 @@ def get_max_id(corpus): class FakeDict(object): - """ - Objects of this class act as dictionaries that map integer->str(integer), for - a specified range of integers <0, num_terms). + """Objects of this class act as dictionaries that map integer->str(integer), for a specified + range of integers <0, num_terms). - This is meant to avoid allocating real dictionaries when `num_terms` is huge, which - is a waste of memory. + This is meant to avoid allocating real dictionaries when `num_terms` is huge, which is a waste of memory. """ def __init__(self, num_terms): + """ + + Parameters + ---------- + num_terms : int + Number of terms. + + """ self.num_terms = num_terms def __str__(self): @@ -532,20 +727,34 @@ def __str__(self): def __getitem__(self, val): if 0 <= val < self.num_terms: return str(val) - raise ValueError("internal id out of bounds (%s, expected <0..%s))" % - (val, self.num_terms)) + raise ValueError("internal id out of bounds (%s, expected <0..%s))" % (val, self.num_terms)) def iteritems(self): + """Iterate over all keys and values. + + + Yields + ------ + (int, str) + Pair of (id, token). + + """ for i in xrange(self.num_terms): yield i, str(i) def keys(self): - """ - Override the dict.keys() function, which is used to determine the maximum - internal id of a corpus = the vocabulary dimensionality. + """Override the `dict.keys()`, which is used to determine the maximum internal id of a corpus, + i.e. the vocabulary dimensionality. - HACK: To avoid materializing the whole `range(0, self.num_terms)`, this returns - the highest id = `[self.num_terms - 1]` only. + Returns + ------- + list of int + Highest id, packed in list. + + Warnings + -------- + To avoid materializing the whole `range(0, self.num_terms)`, + this returns the highest id = `[self.num_terms - 1]` only. """ return [self.num_terms - 1] @@ -560,13 +769,24 @@ def get(self, val, default=None): def dict_from_corpus(corpus): - """ - Scan corpus for all word ids that appear in it, then construct and return a mapping - which maps each `wordId -> str(wordId)`. + """Scan corpus for all word ids that appear in it, then construct a mapping + which maps each `word_id` -> `str(word_id)`. + + Parameters + ---------- + corpus : iterable of iterable of (int, int) + Collection of texts in BoW format. - This function is used whenever *words* need to be displayed (as opposed to just - their ids) but no wordId->word mapping was provided. The resulting mapping - only covers words actually used in the corpus, up to the highest wordId found. + Returns + ------ + id2word : :class:`~gensim.utils.FakeDict` + "Fake" mapping which maps each `word_id` -> `str(word_id)`. + + Warnings + -------- + This function is used whenever *words* need to be displayed (as opposed to just their ids) + but no `word_id` -> `word` mapping was provided. The resulting mapping only covers words actually + used in the corpus, up to the highest `word_id` found. """ num_terms = 1 + get_max_id(corpus) @@ -575,16 +795,22 @@ def dict_from_corpus(corpus): def is_corpus(obj): - """ - Check whether `obj` is a corpus. Return (is_corpus, new) 2-tuple, where - `new is obj` if `obj` was an iterable, or `new` yields the same sequence as - `obj` if it was an iterator. + """Check whether `obj` is a corpus. - `obj` is a corpus if it supports iteration over documents, where a document - is in turn anything that acts as a sequence of 2-tuples (int, float). + Parameters + ---------- + obj : object + Something `iterable of iterable` that contains (int, int). - Note: An "empty" corpus (empty input sequence) is ambiguous, so in this case the - result is forcefully defined as `is_corpus=False`. + Return + ------ + (bool, object) + Pair of (is_corpus, `obj`), is_corpus True if `obj` is corpus. + + Warnings + -------- + An "empty" corpus (empty input sequence) is ambiguous, so in this case + the result is forcefully defined as (False, `obj`). """ try: @@ -613,12 +839,17 @@ def is_corpus(obj): def get_my_ip(): - """ - Try to obtain our external ip (from the pyro nameserver's point of view) + """Try to obtain our external ip (from the Pyro4 nameserver's point of view) - This tries to sidestep the issue of bogus `/etc/hosts` entries and other - local misconfigurations, which often mess up hostname resolution. + Returns + ------- + str + IP address. + Warnings + -------- + This tries to sidestep the issue of bogus `/etc/hosts` entries and other local misconfiguration, + which often mess up hostname resolution. If all else fails, fall back to simple `socket.gethostbyname()` lookup. """ @@ -644,21 +875,29 @@ def get_my_ip(): class RepeatCorpus(SaveLoad): - """ - Used in the tutorial on distributed computing and likely not useful anywhere else. + """Wrap a `corpus` as another corpus of length `reps`. This is achieved by repeating documents from `corpus` + over and over again, until the requested length `len(result) == reps` is reached. + Repetition is done on-the-fly=efficiently, via `itertools`. + + Examples + -------- + >>> from gensim.utils import RepeatCorpus + >>> + >>> corpus = [[(1, 2)], []] # 2 documents + >>> list(RepeatCorpus(corpus, 5)) # repeat 2.5 times to get 5 documents + [[(1, 2)], [], [(1, 2)], [], [(1, 2)]] """ def __init__(self, corpus, reps): """ - Wrap a `corpus` as another corpus of length `reps`. This is achieved by - repeating documents from `corpus` over and over again, until the requested - length `len(result)==reps` is reached. Repetition is done - on-the-fly=efficiently, via `itertools`. - >>> corpus = [[(1, 0.5)], []] # 2 documents - >>> list(RepeatCorpus(corpus, 5)) # repeat 2.5 times to get 5 documents - [[(1, 0.5)], [], [(1, 0.5)], [], [(1, 0.5)]] + Parameters + ---------- + corpus : iterable of iterable of (int, int) + Input corpus. + reps : int + Number of repeats for documents from corpus. """ self.corpus = corpus @@ -669,14 +908,28 @@ def __iter__(self): class RepeatCorpusNTimes(SaveLoad): + """Wrap a `corpus` and repeat it `n` times. + + Examples + -------- + >>> from gensim.utils import RepeatCorpusNTimes + >>> + >>> corpus = [[(1, 0.5)], []] + >>> list(RepeatCorpusNTimes(corpus, 3)) # repeat 3 times + [[(1, 0.5)], [], [(1, 0.5)], [], [(1, 0.5)], []] + + """ def __init__(self, corpus, n): """ - Repeat a `corpus` `n` times. - >>> corpus = [[(1, 0.5)], []] - >>> list(RepeatCorpusNTimes(corpus, 3)) # repeat 3 times - [[(1, 0.5)], [], [(1, 0.5)], [], [(1, 0.5)], []] + Parameters + ---------- + corpus : iterable of iterable of (int, int) + Input corpus. + n : int + Number of repeats for corpus. + """ self.corpus = corpus self.n = n @@ -688,13 +941,22 @@ def __iter__(self): class ClippedCorpus(SaveLoad): + """Wrap a `corpus` and return `max_doc` element from it""" + def __init__(self, corpus, max_docs=None): """ - Return a corpus that is the "head" of input iterable `corpus`. - Any documents after `max_docs` are ignored. This effectively limits the - length of the returned corpus to <= `max_docs`. Set `max_docs=None` for - "no limit", effectively wrapping the entire input corpus. + Parameters + ---------- + corpus : iterable of iterable of (int, int) + Input corpus. + max_docs : int + Maximal number of documents in result corpus. + + Warnings + -------- + Any documents after `max_docs` are ignored. This effectively limits the length of the returned corpus + to <= `max_docs`. Set `max_docs=None` for "no limit", effectively wrapping the entire input corpus. """ self.corpus = corpus @@ -708,19 +970,26 @@ def __len__(self): class SlicedCorpus(SaveLoad): + """Wrap `corpus` and return the slice of it""" + def __init__(self, corpus, slice_): """ - Return a corpus that is the slice of input iterable `corpus`. - Negative slicing can only be used if the corpus is indexable. - Otherwise, the corpus will be iterated over. + Parameters + ---------- + corpus : iterable of iterable of (int, int) + Input corpus. + slice_ : slice or iterable + Slice for `corpus` + Notes + ----- + Negative slicing can only be used if the corpus is indexable, otherwise, the corpus will be iterated over. Slice can also be a np.ndarray to support fancy indexing. - NOTE: calculating the size of a SlicedCorpus is expensive - when using a slice as the corpus has to be iterated over once. - Using a list or np.ndarray does not have this drawback, but - consumes more memory. + Calculating the size of a SlicedCorpus is expensive when using a slice as the corpus has + to be iterated over once. Using a list or np.ndarray does not have this drawback, but consumes more memory. + """ self.corpus = corpus self.slice_ = slice_ @@ -747,6 +1016,19 @@ def __len__(self): def safe_unichr(intval): + """ + + Parameters + ---------- + intval : int + Integer code of character + + Returns + ------- + string + Unicode string of character + + """ try: return unichr(intval) except ValueError: @@ -757,12 +1039,18 @@ def safe_unichr(intval): def decode_htmlentities(text): - """ - Decode HTML entities in text, coded as hex, decimal or named. - - Adapted - from http://github.com/sku/python-twitter-ircbot/blob/321d94e0e40d0acc92f5bf57d126b57369da70de/html_decode.py - + """Decode HTML entities in text, coded as hex, decimal or named. + This function from [3]_. + + Parameters + ---------- + text : str + Input html text. + + Examples + -------- + >>> from gensim.utils import decode_htmlentities + >>> >>> u = u'E tu vivrai nel terrore - L'aldilà (1981)' >>> print(decode_htmlentities(u).encode('UTF-8')) E tu vivrai nel terrore - L'aldilà (1981) @@ -771,6 +1059,10 @@ def decode_htmlentities(text): >>> print(decode_htmlentities("foo < bar")) foo < bar + References + ---------- + .. [3] http://github.com/sku/python-twitter-ircbot/blob/321d94e0e40d0acc92f5bf57d126b57369da70de/html_decode.py + """ def substitute_entity(match): try: @@ -798,10 +1090,25 @@ def substitute_entity(match): def chunkize_serial(iterable, chunksize, as_numpy=False): - """ - Return elements from the iterable in `chunksize`-ed lists. The last returned - element may be smaller (if length of collection is not divisible by `chunksize`). - + """Give elements from the iterable in `chunksize`-ed lists. + The last returned element may be smaller (if length of collection is not divisible by `chunksize`). + + Parameters + ---------- + iterable : iterable of object + Any iterable. + chunksize : int + Size of chunk from result. + as_numpy : bool, optional + If True - yield `np.ndarray`, otherwise - list + + Yields + ------ + list of object OR np.ndarray + Groups based on `iterable` + + Examples + -------- >>> print(list(grouper(range(10), 3))) [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]] @@ -860,29 +1167,58 @@ def run(self): warnings.warn("detected Windows; aliasing chunkize to chunkize_serial") def chunkize(corpus, chunksize, maxsize=0, as_numpy=False): + """Split `corpus` into smaller chunks, used :func:`~gensim.utils.chunkize_serial`. + + Parameters + ---------- + corpus : iterable of object + Any iterable object. + chunksize : int + Size of chunk from result. + maxsize : int, optional + THIS PARAMETER IGNORED. + as_numpy : bool, optional + If True - yield `np.ndarray`, otherwise - list + + Yields + ------ + list of object OR np.ndarray + Groups based on `iterable` + + """ for chunk in chunkize_serial(corpus, chunksize, as_numpy=as_numpy): yield chunk else: def chunkize(corpus, chunksize, maxsize=0, as_numpy=False): - """ - Split a stream of values into smaller chunks. + """Split `corpus` into smaller chunks, used :func:`~gensim.utils.chunkize_serial`. + + Parameters + ---------- + corpus : iterable of object + Any iterable object. + chunksize : int + Size of chunk from result. + maxsize : int, optional + THIS PARAMETER IGNORED. + as_numpy : bool, optional + If True - yield `np.ndarray`, otherwise - list + + Notes + ----- Each chunk is of length `chunksize`, except the last one which may be smaller. - A once-only input stream (`corpus` from a generator) is ok, chunking is done - efficiently via itertools. + A once-only input stream (`corpus` from a generator) is ok, chunking is done efficiently via itertools. - If `maxsize > 1`, don't wait idly in between successive chunk `yields`, but - rather keep filling a short queue (of size at most `maxsize`) with forthcoming - chunks in advance. This is realized by starting a separate process, and is - meant to reduce I/O delays, which can be significant when `corpus` comes - from a slow medium (like harddisk). + If `maxsize > 1`, don't wait idly in between successive chunk `yields`, but rather keep filling a short queue + (of size at most `maxsize`) with forthcoming chunks in advance. This is realized by starting a separate process, + and is meant to reduce I/O delays, which can be significant when `corpus` comes from a slow medium (like HDD). - If `maxsize==0`, don't fool around with parallelism and simply yield the chunksize - via `chunkize_serial()` (no I/O optimizations). + If `maxsize == 0`, don't fool around with parallelism and simply yield the chunksize + via :func:`~gensim.utils.chunkize_serial` (no I/O optimizations). - >>> for chunk in chunkize(range(10), 4): print(chunk) - [0, 1, 2, 3] - [4, 5, 6, 7] - [8, 9] + Yields + ------ + list of object OR np.ndarray + Groups based on `iterable` """ assert chunksize > 0 @@ -903,6 +1239,21 @@ def chunkize(corpus, chunksize, maxsize=0, as_numpy=False): def smart_extension(fname, ext): + """Generate filename with `ext`. + + Parameters + ---------- + fname : str + Path to file. + ext : str + File extension. + + Returns + ------- + str + New path to file with `ext`. + + """ fname, oext = os.path.splitext(fname) if oext.endswith('.bz2'): fname = fname + oext[:-4] + ext + '.bz2' @@ -917,8 +1268,14 @@ def smart_extension(fname, ext): def pickle(obj, fname, protocol=2): """Pickle object `obj` to file `fname`. - `protocol` defaults to 2 so pickled objects are compatible across - Python 2.x and 3.x. + Parameters + ---------- + obj : object + Any python object. + fname : str + Path to pickle file. + protocol : int, optional + Pickle protocol number, default is 2 to support compatible across python 2.x and 3.x. """ with smart_open(fname, 'wb') as fout: # 'b' for binary, needed on Windows @@ -926,7 +1283,19 @@ def pickle(obj, fname, protocol=2): def unpickle(fname): - """Load pickled object from `fname`""" + """Load object from `fname`. + + Parameters + ---------- + fname : str + Path to pickle file. + + Returns + ------- + object + Python object loaded from `fname`. + + """ with smart_open(fname, 'rb') as f: # Because of loading from S3 load can't be used (missing readline in smart_open) if sys.version_info > (3, 0): @@ -936,25 +1305,109 @@ def unpickle(fname): def revdict(d): - """ - Reverse a dictionary mapping. + """Reverse a dictionary mapping, i.e. `{1: 2, 3: 4}` -> `{2: 1, 4: 3}`. + + Parameters + ---------- + d : dict + Input dictionary. + + Returns + ------- + dict + Reversed dictionary mapping. + + Notes + ----- + When two keys map to the same value, only one of them will be kept in the result (which one is kept is arbitrary). - When two keys map to the same value, only one of them will be kept in the - result (which one is kept is arbitrary). + Examples + -------- + >>> from gensim.utils import revdict + >>> d = {1: 2, 3: 4} + >>> revdict(d) + {2: 1, 4: 3} """ return {v: k for (k, v) in iteritems(dict(d))} +def deprecated(reason): + """Decorator which can be used to mark functions as deprecated. + + Parameters + ---------- + reason : str + Reason of deprecation. + + Returns + ------- + function + Decorated function + + Notes + ----- + It will result in a warning being emitted when the function is used, base code from [4]_. + + References + ---------- + .. [4] https://stackoverflow.com/a/40301488/8001386 + + """ + if isinstance(reason, string_types): + def decorator(func): + fmt = "Call to deprecated `{name}` ({reason})." + + @wraps(func) + def new_func1(*args, **kwargs): + warnings.warn( + fmt.format(name=func.__name__, reason=reason), + category=DeprecationWarning, + stacklevel=2 + ) + return func(*args, **kwargs) + + return new_func1 + return decorator + + elif inspect.isclass(reason) or inspect.isfunction(reason): + func = reason + fmt = "Call to deprecated `{name}`." + + @wraps(func) + def new_func2(*args, **kwargs): + warnings.warn( + fmt.format(name=func.__name__), + category=DeprecationWarning, + stacklevel=2 + ) + return func(*args, **kwargs) + return new_func2 + + else: + raise TypeError(repr(type(reason))) + + +@deprecated("Function will be removed in 4.0.0") def toptexts(query, texts, index, n=10): """ Debug fnc to help inspect the top `n` most similar documents (according to a similarity index `index`), to see if they are actually related to the query. - `texts` is any object that can return something insightful for each document - via `texts[docid]`, such as its fulltext or snippet. - - Return a list of 3-tuples (docid, doc's similarity to the query, texts[docid]). + Parameters + ---------- + query : list + vector OR BoW (list of tuples) + texts : str + object that can return something insightful for each document via `texts[docid]`, + such as its fulltext or snippet. + index : any + a class from gensim.similarity.docsim + + Return + ------ + list + a list of 3-tuples (docid, doc's similarity to the query, texts[docid]) """ sims = index[query] # perform a similarity query against the corpus @@ -964,18 +1417,31 @@ def toptexts(query, texts, index, n=10): def randfname(prefix='gensim'): + """Generate path with random filename/ + + Parameters + ---------- + prefix : str + Prefix of filename. + + Returns + ------- + str + Full path with random filename (in temporary folder). + + """ randpart = hex(random.randint(0, 0xffffff))[2:] return os.path.join(tempfile.gettempdir(), prefix + randpart) +@deprecated("Function will be removed in 4.0.0") def upload_chunked(server, docs, chunksize=1000, preprocess=None): - """ - Memory-friendly upload of documents to a SimServer (or Pyro SimServer proxy). - + """Memory-friendly upload of documents to a SimServer (or Pyro SimServer proxy). + Notes + ----- Use this function to train or index large collections -- avoid sending the entire corpus over the wire as a single Pyro in-memory object. The documents will be sent in smaller chunks, of `chunksize` documents each. - """ start = 0 for chunk in grouper(docs, chunksize): @@ -993,8 +1459,29 @@ def upload_chunked(server, docs, chunksize=1000, preprocess=None): def getNS(host=None, port=None, broadcast=True, hmac_key=None): - """ - Return a Pyro name server proxy. + """Get a Pyro4 name server proxy. + + Parameters + ---------- + host : str, optional + Hostname of ns. + port : int, optional + Port of ns. + broadcast : bool, optional + If True - use broadcast mechanism (i.e. all Pyro nodes in local network), not otherwise. + hmac_key : str, optional + Private key. + + Raises + ------ + RuntimeError + when Pyro name server is not found + + Returns + ------- + :class:`Pyro4.core.Proxy` + Proxy from Pyro4. + """ import Pyro4 try: @@ -1004,8 +1491,7 @@ def getNS(host=None, port=None, broadcast=True, hmac_key=None): def pyro_daemon(name, obj, random_suffix=False, ip=None, port=None, ns_conf=None): - """ - Register object with name server (starting the name server if not running + """Register object with name server (starting the name server if not running yet) and block until the daemon is terminated. The object is registered under `name`, or `name`+ some random suffix if `random_suffix` is set. @@ -1027,8 +1513,17 @@ def pyro_daemon(name, obj, random_suffix=False, ip=None, port=None, ns_conf=None def has_pattern(): - """ - Function which returns a flag indicating whether pattern is installed or not + """Check that `pattern` [5]_ package already installed. + + Returns + ------- + bool + True if `pattern` installed, False otherwise. + + References + ---------- + .. [5] https://github.com/clips/pattern + """ try: from pattern.en import parse # noqa:F401 @@ -1039,21 +1534,42 @@ def has_pattern(): def lemmatize(content, allowed_tags=re.compile(r'(NN|VB|JJ|RB)'), light=False, stopwords=frozenset(), min_length=2, max_length=15): - """ - This function is only available when the optional 'pattern' package is installed. - - Use the English lemmatizer from `pattern` to extract UTF8-encoded tokens in + """Use the English lemmatizer from `pattern` [5]_ to extract UTF8-encoded tokens in their base form=lemma, e.g. "are, is, being" -> "be" etc. This is a smarter version of stemming, taking word context into account. - Only considers nouns, verbs, adjectives and adverbs by default (=all other lemmas are discarded). + Parameters + ---------- + content : str + Input string + allowed_tags : :class:`_sre.SRE_Pattern`, optional + Compiled regexp to select POS that will be used. + Only considers nouns, verbs, adjectives and adverbs by default (=all other lemmas are discarded). + light : bool, optional + DEPRECATED FLAG, DOESN'T SUPPORT BY `pattern`. + stopwords : frozenset + Set of words that will be removed from output. + min_length : int + Minimal token length in output (inclusive). + max_length : int + Maximal token length in output (inclusive). + + Returns + ------- + list of str + List with tokens with POS tag. + + Warnings + -------- + This function is only available when the optional 'pattern' package is installed. + Examples + -------- + >>> from gensim.utils import lemmatize >>> lemmatize('Hello World! How is it going?! Nonexistentword, 21') ['world/NN', 'be/VB', 'go/VB', 'nonexistentword/NN'] - >>> lemmatize('The study ranks high.') ['study/NN', 'rank/VB', 'high/JJ'] - >>> lemmatize('The ranks study hard.') ['rank/NN', 'study/VB', 'hard/RB'] @@ -1086,10 +1602,21 @@ def lemmatize(content, allowed_tags=re.compile(r'(NN|VB|JJ|RB)'), light=False, def mock_data_row(dim=1000, prob_nnz=0.5, lam=1.0): - """ - Create a random gensim sparse vector. Each coordinate is nonzero with - probability `prob_nnz`, each non-zero coordinate value is drawn from - a Poisson distribution with parameter lambda equal to `lam`. + """Create a random gensim BoW vector. + + Parameters + ---------- + dim : int, optional + Dimension of vector. + prob_nnz : float, optional + Probability of each coordinate will be nonzero, will be drawn from Poisson distribution. + lam : float, optional + Parameter for Poisson distribution. + + Returns + ------- + list of (int, float) + Vector in BoW format. """ nnz = np.random.uniform(size=(dim,)) @@ -1097,19 +1624,46 @@ def mock_data_row(dim=1000, prob_nnz=0.5, lam=1.0): def mock_data(n_items=1000, dim=1000, prob_nnz=0.5, lam=1.0): - """ - Create a random gensim-style corpus, as a list of lists of (int, float) tuples, - to be used as a mock corpus. + """Create a random gensim-style corpus (BoW), used :func:`~gensim.utils.mock_data_row`. + + Parameters + ---------- + n_items : int + Size of corpus + dim : int + Dimension of vector, used for :func:`~gensim.utils.mock_data_row`. + prob_nnz : float, optional + Probability of each coordinate will be nonzero, will be drawn from Poisson distribution, + used for :func:`~gensim.utils.mock_data_row`. + lam : float, optional + Parameter for Poisson distribution, used for :func:`~gensim.utils.mock_data_row`. + + Returns + ------- + list of list of (int, float) + Gensim-style corpus. """ return [mock_data_row(dim=dim, prob_nnz=prob_nnz, lam=lam) for _ in xrange(n_items)] def prune_vocab(vocab, min_reduce, trim_rule=None): - """ - Remove all entries from the `vocab` dictionary with count smaller than `min_reduce`. + """Remove all entries from the `vocab` dictionary with count smaller than `min_reduce`. Modifies `vocab` in place, returns the sum of all counts that were pruned. + Parameters + ---------- + vocab : dict + Input dictionary. + min_reduce : int + Frequency threshold for tokens in `vocab`. + trim_rule : function, optional + Function for trimming entities from vocab, default behaviour is `vocab[w] <= min_reduce`. + + Returns + ------- + result : int + Sum of all counts that were pruned. """ result = 0 @@ -1126,7 +1680,19 @@ def prune_vocab(vocab, min_reduce, trim_rule=None): def qsize(queue): - """Return the (approximate) queue size where available; -1 where not (OS X).""" + """Get the (approximate) queue size where available. + + Parameters + ---------- + queue : :class:`queue.Queue` + Input queue. + + Returns + ------- + int + Queue size, -1 if `qsize` method isn't implemented (OS X). + + """ try: return queue.qsize() except NotImplementedError: @@ -1140,6 +1706,25 @@ def qsize(queue): def keep_vocab_item(word, count, min_count, trim_rule=None): + """Check that should we keep `word` in vocab or remove. + + Parameters + ---------- + word : str + Input word. + count : int + Number of times that word contains in corpus. + min_count : int + Frequency threshold for `word`. + trim_rule : function, optional + Function for trimming entities from vocab, default behaviour is `vocab[w] <= min_reduce`. + + Returns + ------- + bool + True if `word` should stay, False otherwise. + + """ default_res = count >= min_count if trim_rule is None: @@ -1155,13 +1740,27 @@ def keep_vocab_item(word, count, min_count, trim_rule=None): def check_output(stdout=subprocess.PIPE, *popenargs, **kwargs): - """ - Run command with arguments and return its output as a byte string. - Backported from Python 2.7 as it's implemented as pure python on stdlib. + r"""Run command with arguments and return its output as a byte string. + Backported from Python 2.7 as it's implemented as pure python on stdlib + small modification. + Widely used for :mod:`gensim.models.wrappers`. + + Very similar with [6]_ + + Examples + -------- + >>> from gensim.utils import check_output + >>> check_output(args=['echo', '1']) + '1\n' + + Raises + ------ + KeyboardInterrupt + If Ctrl+C pressed. + + References + ---------- + .. [6] https://docs.python.org/2/library/subprocess.html#subprocess.check_output - >>> check_output(args=['/usr/bin/python', '--version']) - Python 2.6.2 - Added extra KeyboardInterrupt handling """ try: logger.debug("COMMAND: %s %s", popenargs, kwargs) @@ -1182,19 +1781,47 @@ def check_output(stdout=subprocess.PIPE, *popenargs, **kwargs): def sample_dict(d, n=10, use_random=True): - """ - Pick `n` items from dictionary `d` and return them as a list. - The items are picked randomly if `use_random` is True, otherwise picked - according to natural dict iteration. + """Pick `n` items from dictionary `d`. + + Parameters + ---------- + d : dict + Input dictionary. + n : int, optional + Number of items that will be picked. + use_random : bool, optional + If True - pick items randomly, otherwise - according to natural dict iteration. + + Returns + ------- + list of (object, object) + Picked items from dictionary, represented as list. + """ selected_keys = random.sample(list(d), min(len(d), n)) if use_random else itertools.islice(iterkeys(d), n) return [(key, d[key]) for key in selected_keys] def strided_windows(ndarray, window_size): - """ - Produce a numpy.ndarray of windows, as from a sliding window. - + """Produce a numpy.ndarray of windows, as from a sliding window. + + Parameters + ---------- + ndarray : numpy.ndarray + Input array + window_size : int + Sliding window size. + + Returns + ------- + numpy.ndarray + Subsequences produced by sliding a window of the given size over the `ndarray`. + Since this uses striding, the individual arrays are views rather than copies of `ndarray`. + Changes to one view modifies the others and the original. + + Examples + -------- + >>> from gensim.utils import strided_windows >>> strided_windows(np.arange(5), 2) array([[0, 1], [1, 2], @@ -1208,14 +1835,6 @@ def strided_windows(ndarray, window_size): [4, 5, 6, 7, 8], [5, 6, 7, 8, 9]]) - Args: - ndarray: either a numpy.ndarray or something that can be converted into one. - window_size: sliding window size. - - Returns: - numpy.ndarray of the subsequences produced by sliding a window of the given size over - the `ndarray`. Since this uses striding, the individual arrays are views rather than - copies of `ndarray`. Changes to one view modifies the others and the original. """ ndarray = np.asarray(ndarray) if window_size == ndarray.shape[0]: @@ -1231,15 +1850,22 @@ def strided_windows(ndarray, window_size): def iter_windows(texts, window_size, copy=False, ignore_below_size=True, include_doc_num=False): """Produce a generator over the given texts using a sliding window of `window_size`. - The windows produced are views of some subsequence of a text. To use deep copies - instead, pass `copy=True`. - - Args: - texts: List of string sentences. - window_size: Size of sliding window. - copy: False to use views of the texts (default) or True to produce deep copies. - ignore_below_size: ignore documents that are not at least `window_size` in length (default behavior). - If False, the documents below `window_size` will be yielded as the full document. + The windows produced are views of some subsequence of a text. + To use deep copies instead, pass `copy=True`. + + + Parameters + ---------- + texts : list of str + List of string sentences. + window_size : int + Size of sliding window. + copy : bool, optional + If True - produce deep copies. + ignore_below_size : bool, optional + If True - ignore documents that are not at least `window_size` in length. + include_doc_num : bool, optional + If True - will be yield doc_num too. """ for doc_num, document in enumerate(texts): @@ -1263,60 +1889,38 @@ def _iter_windows(document, window_size, copy=False, ignore_below_size=True): def flatten(nested_list): """Recursively flatten out a nested list. - Args: - nested_list (list): possibly nested list. + Parameters + ---------- + nested_list : list + Possibly nested list. + + Returns + ------- + list + Flattened version of input, where any list elements have been unpacked into the top-level list + in a recursive fashion. - Returns: - list: flattened version of input, where any list elements have been unpacked into the - top-level list in a recursive fashion. """ return list(lazy_flatten(nested_list)) def lazy_flatten(nested_list): - """Lazy version of `flatten`.""" + """Lazy version of :func:`~gensim.utils.flatten`. + + Parameters + ---------- + nested_list : list + Possibly nested list. + + Yields + ------ + object + Element of list + + """ for el in nested_list: if isinstance(el, collections.Iterable) and not isinstance(el, string_types): for sub in flatten(el): yield sub else: yield el - - -def deprecated(reason): - """Decorator which can be used to mark functions as deprecated. It will result in a warning being emitted - when the function is used, base code from https://stackoverflow.com/a/40301488/8001386. - - """ - if isinstance(reason, string_types): - def decorator(func): - fmt = "Call to deprecated `{name}` ({reason})." - - @wraps(func) - def new_func1(*args, **kwargs): - warnings.warn( - fmt.format(name=func.__name__, reason=reason), - category=DeprecationWarning, - stacklevel=2 - ) - return func(*args, **kwargs) - - return new_func1 - return decorator - - elif inspect.isclass(reason) or inspect.isfunction(reason): - func = reason - fmt = "Call to deprecated `{name}`." - - @wraps(func) - def new_func2(*args, **kwargs): - warnings.warn( - fmt.format(name=func.__name__), - category=DeprecationWarning, - stacklevel=2 - ) - return func(*args, **kwargs) - return new_func2 - - else: - raise TypeError(repr(type(reason))) diff --git a/setup.py b/setup.py index a5d8fa6bdc..2c16ded0f7 100644 --- a/setup.py +++ b/setup.py @@ -307,7 +307,7 @@ def finalize_options(self): 'distributed': distributed_env, 'test-win': win_testenv, 'test': linux_testenv, - 'docs': linux_testenv + distributed_env + ['sphinx', 'sphinxcontrib-napoleon', 'plotly'], + 'docs': linux_testenv + distributed_env + ['sphinx', 'sphinxcontrib-napoleon', 'plotly', 'pattern'], }, include_package_data=True, From cd776b502e0f10195d6ce29abe9816cf720e1d01 Mon Sep 17 00:00:00 2001 From: jazzmuesli Date: Wed, 27 Dec 2017 07:14:41 +0000 Subject: [PATCH 04/14] Fix docstrings for `gensim.models.rpmodel` (#1802) * first attempt to convert few lines into numpy-style doc * added parameters in documentation * more documentation * few corrections * show inheritance and undoc members * show special members * example is executable now * link to the paper added, named parameters * fixed doc * fixed doc * fixed whitespaces * fix docstrings & PEP8 * fix docstrings * fix typo --- docs/src/models/rpmodel.rst | 4 +- gensim/models/rpmodel.py | 103 ++++++++++++++++++++++++++++-------- 2 files changed, 83 insertions(+), 24 deletions(-) diff --git a/docs/src/models/rpmodel.rst b/docs/src/models/rpmodel.rst index 47eba01262..91ef71872a 100644 --- a/docs/src/models/rpmodel.rst +++ b/docs/src/models/rpmodel.rst @@ -5,4 +5,6 @@ :synopsis: Random Projections :members: :inherited-members: - + :undoc-members: + :show-inheritance: + :special-members: __getitem__ diff --git a/gensim/models/rpmodel.py b/gensim/models/rpmodel.py index 0c8f7c8b26..0826a7c359 100644 --- a/gensim/models/rpmodel.py +++ b/gensim/models/rpmodel.py @@ -5,6 +5,35 @@ # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html +"""Random Projections (also known as Random Indexing). + +For theoretical background on Random Projections, see [1]_. + + +Examples +-------- +>>> from gensim.models import RpModel +>>> from gensim.corpora import Dictionary +>>> from gensim.test.utils import common_texts, temporary_file +>>> +>>> dictionary = Dictionary(common_texts) # fit dictionary +>>> corpus = [dictionary.doc2bow(text) for text in common_texts] # convert texts to BoW format +>>> +>>> model = RpModel(corpus, id2word=dictionary) # fit model +>>> result = model[corpus[3]] # apply model to document, result is vector in BoW format +>>> +>>> with temporary_file("model_file") as fname: +... model.save(fname) # save model to file +... loaded_model = RpModel.load(fname) # load model + + +References +---------- +.. [1] Kanerva et al., 2000, Random indexing of text samples for Latent Semantic Analysis, + https://cloudfront.escholarship.org/dist/prd/content/qt5644k0w6/qt5644k0w6.pdf + +""" + import logging import numpy as np @@ -16,30 +45,21 @@ class RpModel(interfaces.TransformationABC): - """ - Objects of this class allow building and maintaining a model for Random Projections - (also known as Random Indexing). For theoretical background on RP, see: - - Kanerva et al.: "Random indexing of text samples for Latent Semantic Analysis." - The main methods are: + def __init__(self, corpus, id2word=None, num_topics=300): + """ - 1. constructor, which creates the random projection matrix - 2. the [] method, which transforms a simple count representation into the TfIdf - space. + Parameters + ---------- + corpus : iterable of iterable of (int, int) + Input corpus. - >>> rp = RpModel(corpus) - >>> print(rp[some_doc]) - >>> rp.save('/tmp/foo.rp_model') + id2word : {dict of (int, str), :class:`~gensim.corpora.dictionary.Dictionary`}, optional + Mapping `token_id` -> `token`, will be determine from corpus if `id2word == None`. - Model persistency is achieved via its load/save methods. - """ + num_topics : int, optional + Number of topics. - def __init__(self, corpus, id2word=None, num_topics=300): - """ - `id2word` is a mapping from word ids (integers) to words (strings). It is - used to determine the vocabulary size, as well as for debugging and topic - printing. If not set, it will be determined from the corpus. """ self.id2word = id2word self.num_topics = num_topics @@ -50,8 +70,13 @@ def __str__(self): return "RpModel(num_terms=%s, num_topics=%s)" % (self.num_terms, self.num_topics) def initialize(self, corpus): - """ - Initialize the random projection matrix. + """Initialize the random projection matrix. + + Parameters + ---------- + corpus : iterable of iterable of (int, int) + Input corpus. + """ if self.id2word is None: logger.info("no word id mapping provided; initializing from corpus, assuming identity") @@ -73,8 +98,32 @@ def initialize(self, corpus): # are smarter and this is no longer needed? def __getitem__(self, bow): - """ - Return RP representation of the input vector and/or corpus. + """Get random-projection representation of the input vector or corpus. + + Parameters + ---------- + bow : {list of (int, int), iterable of list of (int, int)} + Input document or corpus. + + Returns + ------- + list of (int, float) + if `bow` is document OR + :class:`~gensim.interfaces.TransformedCorpus` + if `bow` is corpus. + + Examples + ---------- + >>> from gensim.models import RpModel + >>> from gensim.corpora import Dictionary + >>> from gensim.test.utils import common_texts + >>> + >>> dictionary = Dictionary(common_texts) # fit dictionary + >>> corpus = [dictionary.doc2bow(text) for text in common_texts] # convert texts to BoW format + >>> + >>> model = RpModel(corpus, id2word=dictionary) # fit model + >>> result = model[corpus[0]] # apply model to document, result is vector in BoW format, i.e. [(1, 0.3), ... ] + """ # if the input vector is in fact a corpus, return a transformed corpus as result is_corpus, bow = utils.is_corpus(bow) @@ -96,5 +145,13 @@ def __getitem__(self, bow): ] def __setstate__(self, state): + """Sets the internal state and updates freshly_loaded to True, called when unpicked. + + Parameters + ---------- + state : dict + State of the class. + + """ self.__dict__ = state self.freshly_loaded = True From 37bc8d45f5b1a5b702e70e3f48d8073508ee22b1 Mon Sep 17 00:00:00 2001 From: KKOKU Date: Wed, 27 Dec 2017 14:47:56 +0000 Subject: [PATCH 05/14] Fix docstrings for `gensim.models.translation_matrix` (#1806) * convert Space class doc to numpy style * fix docstrings[1] * fix docstrings[2] * remove useless load * fix docstrings[3] * add missing import * fix docstrings[4] --- gensim/models/__init__.py | 1 + gensim/models/translation_matrix.py | 362 +++++++++++++++++----------- 2 files changed, 225 insertions(+), 138 deletions(-) diff --git a/gensim/models/__init__.py b/gensim/models/__init__.py index c25e8e7795..88e0abf28d 100644 --- a/gensim/models/__init__.py +++ b/gensim/models/__init__.py @@ -20,6 +20,7 @@ from .atmodel import AuthorTopicModel # noqa:F401 from .ldaseqmodel import LdaSeqModel # noqa:F401 from .fasttext import FastText # noqa:F401 +from .translation_matrix import TranslationMatrix, BackMappingTranslationMatrix # noqa:F401 from . import wrappers # noqa:F401 diff --git a/gensim/models/translation_matrix.py b/gensim/models/translation_matrix.py index 78233136d2..1dd7cd6b25 100644 --- a/gensim/models/translation_matrix.py +++ b/gensim/models/translation_matrix.py @@ -1,60 +1,105 @@ #!/usr/bin/env python # encoding: utf-8 -import warnings -import numpy as np -from collections import OrderedDict -from gensim import utils -from six import string_types - - -""" -Produce translation matrix to translate the word from one language to another language, using either -standard nearest neighbour method or globally corrected neighbour retrieval method [1]. +"""Produce translation matrix to translate the word from one language to another language, using either +standard nearest neighbour method or globally corrected neighbour retrieval method [1]_. This method can be used to augment the existing phrase tables with more candidate translations, or -filter out errors from the translation tables and known dictionaries [2]. What's more, It also work +filter out errors from the translation tables and known dictionaries [2]_. What's more, It also work for any two sets of named-vectors where there are some paired-guideposts to learn the transformation. -Initialize a model with e.g.:: +Examples +-------- +**How to make translation between two set of word-vectors** + +Initialize a word-vector models + +>>> from gensim.models import KeyedVectors +>>> from gensim.test.utils import datapath, temporary_file +>>> from gensim.models import TranslationMatrix +>>> +>>> model_en = KeyedVectors.load_word2vec_format(datapath("EN.1-10.cbow1_wind5_hs0_neg10_size300_smpl1e-05.txt")) +>>> model_it = KeyedVectors.load_word2vec_format(datapath("IT.1-10.cbow1_wind5_hs0_neg10_size300_smpl1e-05.txt")) + +Define word pairs (that will be used for construction of translation matrix + +>>> word_pairs = [ +... ("one", "uno"), ("two", "due"), ("three", "tre"), ("four", "quattro"), ("five", "cinque"), +... ("seven", "sette"), ("eight", "otto"), +... ("dog", "cane"), ("pig", "maiale"), ("fish", "cavallo"), ("birds", "uccelli"), +... ("apple", "mela"), ("orange", "arancione"), ("grape", "acino"), ("banana", "banana") +... ] + +Fit :class:`~gensim.models.translation_matrix.TranslationMatrix` + +>>> trans_model = TranslationMatrix(model_en, model_it, word_pairs=word_pairs) + +Apply model (translate words "dog" and "one") + +>>> trans_model.translate(["dog", "one"], topn=3) +OrderedDict([('dog', [u'cane', u'gatto', u'cavallo']), ('one', [u'uno', u'due', u'tre'])]) + - >>> transmat = TranslationMatrix(word_pair, source_word_vec, target_word_vec) +Save / load model -Train a model with e.g.:: +>>> with temporary_file("model_file") as fname: +... trans_model.save(fname) # save model to file +... loaded_trans_model = TranslationMatrix.load(fname) # load model - >>> transmat.train(word_pair) -Persist a model to disk with:: +**How to make translation between two :class:`~gensim.models.doc2vec.Doc2Vec` models** - >>> transmat.save(fname) - >>> transmat = TranslationMatrix.load(fname) +Prepare data and models -Translate the source words to target words, for example +>>> from gensim.test.utils import datapath +>>> from gensim.test.test_translation_matrix import read_sentiment_docs +>>> from gensim.models import Doc2Vec, BackMappingTranslationMatrix +>>> +>>> data = read_sentiment_docs(datapath("alldata-id-10.txt"))[:5] +>>> src_model = Doc2Vec.load(datapath("small_tag_doc_5_iter50")) +>>> dst_model = Doc2Vec.load(datapath("large_tag_doc_10_iter50")) - >>> transmat.translate(["one", "two", "three"], topn=3) +Train backward translation +>>> model_trans = BackMappingTranslationMatrix(data, src_model, dst_model) +>>> trans_matrix = model_trans.train(data) + + +Apply model + +>>> result = model_trans.infer_vector(dst_model.docvecs[data[3].tags]) + + +References +---------- .. [1] Dinu, Georgiana, Angeliki Lazaridou, and Marco Baroni. "Improving zero-shot learning by mitigating the - hubness problem." arXiv preprint arXiv:1412.6568 (2014). + hubness problem", https://arxiv.org/abs/1412.6568 .. [2] Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, and Jeffrey Dean. - Distributed Representations of Words and Phrases and their Compositionality. - In Proceedings of NIPS, 2013. + "Distributed Representations of Words and Phrases and their Compositionality", https://arxiv.org/abs/1310.4546 + """ +import warnings +import numpy as np + +from collections import OrderedDict +from gensim import utils +from six import string_types + class Space(object): - """ - An auxiliary class for storing the the words space + """An auxiliary class for storing the the words space.""" - Attributes: - `mat` (ndarray): each row is the word vector of the lexicon - `index2word` (list): a list of words in the `Space` object - `word2index` (dict): map the word to index - """ def __init__(self, matrix, index2word): """ - `matrix`: N * length_of_word_vec, which store the word's vector - `index2word`: a list of words in the `Space` object - `word2index`: a dict which for word indexing + + Parameters + ---------- + matrix : iterable of numpy.ndarray + Matrix that contains word-vectors. + index2word : list of str + Words which correspond to the `matrix`. + """ self.mat = matrix self.index2word = index2word @@ -66,14 +111,20 @@ def __init__(self, matrix, index2word): @classmethod def build(cls, lang_vec, lexicon=None): - """ - Construct a space class for the lexicon, if it's provided. - Args: - `lang_vec`: word2vec model that extract word vector for lexicon - `lexicon`: the default is None, if it is not provided, the lexicon is all the lang_vec's word, - i.e. lang_vec.vocab.keys() - Returns: - `Space` object for the lexicon + """Construct a space class for the lexicon, if it's provided. + + Parameters + ---------- + lang_vec : :class:`~gensim.models.keyedvectors.KeyedVectors` + Model from which the vectors will be extracted. + lexicon : list of str, optional + Words which contains in the `lang_vec`, if `lexicon = None`, the lexicon is all the lang_vec's word. + + Returns + ------- + :class:`~gensim.models.translation_matrix.Space` + Object that stored word-vectors + """ # `words` to store all the word that # `mat` to store all the word vector for the word in 'words' list @@ -93,41 +144,58 @@ def build(cls, lang_vec, lexicon=None): return Space(mat, words) def normalize(self): - """ Normalize the word vector's matrix """ + """Normalize the word vector's matrix.""" self.mat = self.mat / np.sqrt(np.sum(np.multiply(self.mat, self.mat), axis=1, keepdims=True)) class TranslationMatrix(utils.SaveLoad): - """ - Objects of this class realize the translation matrix which map the source language - to the target language. + """Objects of this class realize the translation matrix which map the source language to the target language. The main methods are: - 1. constructor, - 2. the `train` method, which initialize everything needed to build a translation matrix - 3. the `translate` method, which given new word and its vector representation. - We map it to the other language space by computing z = Wx, then return the word whose representation is close to z. - The details use seen the notebook (translation_matrix.ipynb) - - >>> transmat = TranslationMatrix(source_lang_vec, target_lang_vec, word_pair) - >>> transmat.train(word_pair) - >>> translated_word = transmat.translate(words, topn=3) + The details use seen the notebook [3]_ + + Examples + -------- + >>> from gensim.models import KeyedVectors + >>> from gensim.test.utils import datapath, temporary_file + >>> + >>> model_en = KeyedVectors.load_word2vec_format(datapath("EN.1-10.cbow1_wind5_hs0_neg10_size300_smpl1e-05.txt")) + >>> model_it = KeyedVectors.load_word2vec_format(datapath("IT.1-10.cbow1_wind5_hs0_neg10_size300_smpl1e-05.txt")) + >>> + >>> word_pairs = [ + ... ("one", "uno"), ("two", "due"), ("three", "tre"), ("four", "quattro"), ("five", "cinque"), + ... ("seven", "sette"), ("eight", "otto"), + ... ("dog", "cane"), ("pig", "maiale"), ("fish", "cavallo"), ("birds", "uccelli"), + ... ("apple", "mela"), ("orange", "arancione"), ("grape", "acino"), ("banana", "banana") + ... ] + >>> + >>> trans_model = TranslationMatrix(model_en, model_it) + >>> trans_model.train(word_pairs) + >>> trans_model.translate(["dog", "one"], topn=3) + OrderedDict([('dog', [u'cane', u'gatto', u'cavallo']), ('one', [u'uno', u'due', u'tre'])]) + + + References + ---------- + .. [3] https://github.com/RaRe-Technologies/gensim/blob/3.2.0/docs/notebooks/translation_matrix.ipynb """ def __init__(self, source_lang_vec, target_lang_vec, word_pairs=None, random_state=None): """ - Initialize the model from a list pair of `word_pair`. Each word_pair is tupe - with source language word and target language word. + Parameters + ---------- + source_lang_vec : :class:`~gensim.models.keyedvectors.KeyedVectors` + Word vectors for source language. + target_lang_vec : :class:`~gensim.models.keyedvectors.KeyedVectors` + Word vectors for target language. + word_pairs : list of (str, str), optional + Pairs of words that will be used for training. + random_state : {None, int, array_like}, optional + Seed for random state. - Examples: [("one", "uno"), ("two", "due")] - - Args: - `word_pair` (list): a list pair of words - `source_lang_vec` (KeyedVectors): a set of word vector of source language - `target_lang_vec` (KeyedVectors): a set of word vector of target language """ self.source_word = None @@ -146,14 +214,13 @@ def __init__(self, source_lang_vec, target_lang_vec, word_pairs=None, random_sta self.train(word_pairs) def train(self, word_pairs): - """ - Build the translation matrix that mapping from source space to target space. + """Build the translation matrix that mapping from source space to target space. - Args: - `word_pairs` (list): a list pair of words + Parameters + ---------- + word_pairs : list of (str, str), optional + Pairs of words that will be used for training. - Returns: - `translation matrix` that mapping from the source language to target language """ self.source_word, self.target_word = zip(*word_pairs) @@ -169,50 +236,50 @@ def train(self, word_pairs): self.translation_matrix = np.linalg.lstsq(m1, m2, -1)[0] def save(self, *args, **kwargs): - """ - Save the model to file but ignoring the souce_space and target_space - """ + """Save the model to file but ignoring the `source_space` and `target_space`""" kwargs['ignore'] = kwargs.get('ignore', ['source_space', 'target_space']) - super(TranslationMatrix, self).save(*args, **kwargs) - @classmethod - def load(cls, *args, **kwargs): - """ Load the pre-trained translation matrix model""" - model = super(TranslationMatrix, cls).load(*args, **kwargs) - return model - def apply_transmat(self, words_space): - """ - Map the source word vector to the target word vector using translation matrix - Args: - `words_space`: the `Space` object that constructed for those words to be translate + """Map the source word vector to the target word vector using translation matrix. + + Parameters + ---------- + words_space : :class:`~gensim.models.translation_matrix.Space` + Object that constructed for those words to be translate. + + Returns + ------- + :class:`~gensim.models.translation_matrix.Space` + Object that constructed for those mapped words. - Returns: - A `Space` object that constructed for those mapped words """ return Space(np.dot(words_space.mat, self.translation_matrix), words_space.index2word) def translate(self, source_words, topn=5, gc=0, sample_num=None, source_lang_vec=None, target_lang_vec=None): - """ - Translate the word from the source language to the target language, and return the topn - most similar words. - Args: - `source_words`(str/list): single word or a list of words to be translated - `topn`: return the top N similar words. By default (`topn=5`) - `gc`: defines the training algorithm. By default (`gc=0`), use standard NN retrieval. - Otherwise use globally corrected neighbour retrieval method(as described in[1]). - `sample_num`: an int parameter that specify the number of word to sample from the source lexicon. - if `gc=1`, then `sample_num` must be provided. - `source_lang_vec`: you can specify the source language vector for translation, the default is to use - the model's source language vector. - `target_lang_vec`: you can specify the target language vector for retrieving the most similar word, - the default is to use the model's target language vector. - Returns: - A OrderedDict object, each item is (word : `topn` translated words) - - [1] Dinu, Georgiana, Angeliki Lazaridou, and Marco Baroni. "Improving zero-shot learning by mitigating the - hubness problem." arXiv preprint arXiv:1412.6568 (2014). + """Translate the word from the source language to the target language. + + Parameters + ---------- + source_words : {str, list of str} + Single word or a list of words to be translated + topn : int, optional + Number of words than will be returned as translation for each `source_words` + gc : int, optional + Define translation algorithm, if `gc == 0` - use standard NN retrieval, + otherwise, use globally corrected neighbour retrieval method (as described in [1]_). + sample_num : int, optional + Number of word to sample from the source lexicon, if `gc == 1`, then `sample_num` **must** be provided. + source_lang_vec : :class:`~gensim.models.keyedvectors.KeyedVectors`, optional + New source language vectors for translation, by default, used the model's source language vector. + target_lang_vec : :class:`~gensim.models.keyedvectors.KeyedVectors`, optional + New target language vectors for translation, by default, used the model's target language vector. + + Returns + ------- + :class:`collections.OrderedDict` + Ordered dict where each item is `word`: [`translated_word_1`, `translated_word_2`, ...] + """ if isinstance(source_words, string_types): @@ -280,38 +347,45 @@ def translate(self, source_words, topn=5, gc=0, sample_num=None, source_lang_vec class BackMappingTranslationMatrix(utils.SaveLoad): - """ - Objects of this class realize the BackMapping translation matrix which map the - source model's document vector to the target model's document vector(old model). - The main methods are: - - 1. constructor, initializing - 2. the `train` method, which build a translation matrix - 3. the `infer_vector` method, which given the target model's document vector - - We map it to the other language space by computing z = Wx, then return the - word whose representation is close to z. + """Realize the BackMapping translation matrix which map the source model's document vector + to the target model's document vector(old model). - the details use seen the notebook (translation matrix revist.ipynb) + We map it to the other language space by computing z = Wx, then return the + word whose representation is close to z. - >>> transmat = BackMappingTranslationMatrix(tagged, source_lang_vec, target_lang_vec) - >>> transmat.train(word_pair) - >>> infered_vec = transmat.infer_vector(tagged_doc) + the details use seen the notebook [3]_. + + Examples + -------- + >>> from gensim.test.utils import datapath + >>> from gensim.test.test_translation_matrix import read_sentiment_docs + >>> from gensim.models import Doc2Vec, BackMappingTranslationMatrix + >>> + >>> data = read_sentiment_docs(datapath("alldata-id-10.txt"))[:5] + >>> src_model = Doc2Vec.load(datapath("small_tag_doc_5_iter50")) + >>> dst_model = Doc2Vec.load(datapath("large_tag_doc_10_iter50")) + >>> + >>> model_trans = BackMappingTranslationMatrix(data, src_model, dst_model) + >>> trans_matrix = model_trans.train(data) + >>> + >>> result = model_trans.infer_vector(dst_model.docvecs[data[3].tags]) - """ + """ def __init__(self, tagged_docs, source_lang_vec, target_lang_vec, random_state=None): """ - Initialize the model from a list of `tagged_docs`. Each word_pair is tupe - with source language word and target language word. - Examples: [("one", "uno"), ("two", "due")] + Parameters + ---------- + tagged_docs : list of :class:`~gensim.models.doc2vec.TaggedDocument`, optional + Documents that will be used for training + source_lang_vec : :class:`~gensim.models.doc2vec.Doc2Vec` + Source Doc2Vec model. + target_lang_vec : :class:`~gensim.models.doc2vec.Doc2Vec` + Target Doc2Vec model. + random_state : {None, int, array_like}, optional + Seed for random state. - Args: - `tagged_docs` (list): a list of tagged document - `source_lang_vec` (Doc2vec): provide the document vector - `target_lang_vec` (Doc2vec): provide the document vector """ - self.tagged_docs = tagged_docs self.source_lang_vec = source_lang_vec self.target_lang_vec = target_lang_vec @@ -320,13 +394,19 @@ def __init__(self, tagged_docs, source_lang_vec, target_lang_vec, random_state=N self.translation_matrix = None def train(self, tagged_docs): - """ - Build the translation matrix that mapping from the source model's vector to target model's vector + """Build the translation matrix that mapping from the source model's vector to target model's vector - Returns: - `translation matrix` that mapping from the source model's vector to target model's vector - """ + Parameters + ---------- + tagged_docs : list of :class:`~gensim.models.doc2vec.TaggedDocument`, optional + THIS ARGUMENT WILL BE IGNORED. + + Returns + ------- + numpy.ndarray + Translation matrix that mapping from the source model's vector to target model's vector. + """ m1 = [self.source_lang_vec.docvecs[item.tags].flatten() for item in self.tagged_docs] m2 = [self.target_lang_vec.docvecs[item.tags].flatten() for item in self.tagged_docs] @@ -334,11 +414,17 @@ def train(self, tagged_docs): return self.translation_matrix def infer_vector(self, target_doc_vec): - """ - Translate the target model's document vector to the source model's document vector + """Translate the target model's document vector to the source model's document vector + + Parameters + ---------- + target_doc_vec : numpy.ndarray + Document vector + + Returns + ------- + numpy.ndarray + Vector `target_doc_vec` in the source model. - Returns: - `infered_vec` the tagged_doc's document vector in the source model """ - infered_vec = np.dot(target_doc_vec, self.translation_matrix) - return infered_vec + return np.dot(target_doc_vec, self.translation_matrix) From 4644606524b42044db4444877440269cccd9aed5 Mon Sep 17 00:00:00 2001 From: Menshikh Ivan Date: Mon, 8 Jan 2018 19:58:04 +0500 Subject: [PATCH 06/14] Add CircleCI for build documentation. Fix #1807 (#1822) * init config for circle * change * rm cache, install tox distinctly * fix indentation & command * update venv * add pip-cache * add apt packages for latex * rename * enable latex rendering * remove doc building from Travis * store new doc version --- .circleci/config.yml | 44 +++++++++++++++++++ .gitignore | 3 +- .travis.yml | 2 +- docs/src/conf.py | 2 +- .../direct_confirmation_measure.py | 2 +- 5 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000000..d2125123c3 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,44 @@ +version: 2 +jobs: + build: + docker: + - image: circleci/python:2.7 + + working_directory: ~/gensim + + steps: + - checkout + + - restore_cache: + key: pip-cache + + - run: + name: Apt install (for latex render) + command: | + sudo apt-get -yq update + sudo apt-get -yq remove texlive-binaries --purge + sudo apt-get -yq --no-install-suggests --no-install-recommends --force-yes install dvipng texlive-latex-base texlive-latex-extra texlive-latex-recommended texlive-latex-extra texlive-fonts-recommended latexmk + + - run: + name: Basic installation (tox) + command: | + python -m virtualenv venv + source venv/bin/activate + pip install tox + + - run: + name: Build documentation + command: | + source venv/bin/activate + tox -e docs -vv + + - store_artifacts: + path: docs/src/_build + destination: documentation + + - save_cache: + key: pip-cache + paths: + - "~/.cache/pip" + - "~/.ccache" + - "~/.pip-cache" diff --git a/.gitignore b/.gitignore index 6939309d25..aef8db9736 100644 --- a/.gitignore +++ b/.gitignore @@ -72,4 +72,5 @@ data *_out.txt *.html *.inv -*.js \ No newline at end of file +*.js +docs/_images/ diff --git a/.travis.yml b/.travis.yml index f97bac263f..3cbccc0b0a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ language: python matrix: include: - python: '2.7' - env: TOXENV="flake8, docs" + env: TOXENV="flake8" - python: '2.7' env: TOXENV="py27-linux" diff --git a/docs/src/conf.py b/docs/src/conf.py index 7f2c19236b..d9b2935295 100644 --- a/docs/src/conf.py +++ b/docs/src/conf.py @@ -25,7 +25,7 @@ # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinxcontrib.napoleon'] +extensions = ['sphinx.ext.autodoc', 'sphinxcontrib.napoleon', 'sphinx.ext.imgmath'] autoclass_content = "both" # Add any paths that contain templates here, relative to this directory. diff --git a/gensim/topic_coherence/direct_confirmation_measure.py b/gensim/topic_coherence/direct_confirmation_measure.py index 0dc9dc30e8..dfda360447 100644 --- a/gensim/topic_coherence/direct_confirmation_measure.py +++ b/gensim/topic_coherence/direct_confirmation_measure.py @@ -21,7 +21,7 @@ def log_conditional_probability(segmented_topics, accumulator, with_std=False, w """ This function calculates the log-conditional-probability measure which is used by coherence measures such as U_mass. - This is defined as: m_lc(S_i) = log[(P(W', W*) + e) / P(W*)] + This is defined as :math:`m_{lc}(S_i) = log \\frac{P(W', W^{*}) + \epsilon}{P(W^{*})}`. Args: segmented_topics (list): Output from the segmentation module of the segmented From 0a4419fadf4f27c1c397aedf6f1bd11bf4075d53 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 10 Jan 2018 21:40:09 +0500 Subject: [PATCH 07/14] Refactor API reference `gensim.topic_coherence`. Fix #1669 (#1714) * Refactored aggregation * Micro-Fix for aggregation.py, partially refactored direct_confirmation.py * Partially refactored indirect_confirmation_measure * Some additions * Math attempts * add math extension for sphinx * Minor refactoring * Some refactoring for probability_estimation * Beta-strings * Different additions * Minor changes * text_analysis left * Added example for ContextVectorComputer class * probability_estimation 0.9 * beta_version * Added some examples for text_analysis * text_analysis: corrected example for class UsesDictionary * Final additions for text_analysis.py * fix cross-reference problem * fix pep8 * fix aggregation * fix direct_confirmation_measure * fix types in direct_confirmation_measure * partial fix indirect_confirmation_measure * HotFix for probability_estimation and segmentation * Refactoring for probability_estimation * Changes for indirect_confirmation_measure * Fixed segmentation, partly fixed text_analysis * Add Notes for text_analysis * fix di/ind * fix doc examples in probability_estimation * fix probability_estimation * fix segmentation * fix docstring in probability_estimation * partial fix test_analysis * add latex stuff for docs build * doc fix[1] * doc fix[2] * remove apt install from travis (now doc build in circle) --- docs/src/topic_coherence/text_analysis.rst | 1 + gensim/models/atmodel.py | 4 +- gensim/topic_coherence/aggregation.py | 26 +- .../direct_confirmation_measure.py | 179 ++++++++---- .../indirect_confirmation_measure.py | 263 +++++++++++++----- .../topic_coherence/probability_estimation.py | 203 +++++++++++--- gensim/topic_coherence/segmentation.py | 118 ++++---- gensim/topic_coherence/text_analysis.py | 215 +++++++++++--- 8 files changed, 748 insertions(+), 261 deletions(-) diff --git a/docs/src/topic_coherence/text_analysis.rst b/docs/src/topic_coherence/text_analysis.rst index f4e3f7254e..ec9e14a795 100644 --- a/docs/src/topic_coherence/text_analysis.rst +++ b/docs/src/topic_coherence/text_analysis.rst @@ -7,3 +7,4 @@ :inherited-members: :undoc-members: :show-inheritance: + :special-members: __getitem__ diff --git a/gensim/models/atmodel.py b/gensim/models/atmodel.py index 02b18984ac..5463e8a025 100755 --- a/gensim/models/atmodel.py +++ b/gensim/models/atmodel.py @@ -560,10 +560,10 @@ def update(self, corpus=None, author2doc=None, doc2author=None, chunksize=None, Args: corpus (gensim corpus): The corpus with which the author-topic model should be updated. - author2doc (dictionary): author to document mapping corresponding to indexes in input + author2doc (dict): author to document mapping corresponding to indexes in input corpus. - doc2author (dictionary): document to author mapping corresponding to indexes in input + doc2author (dict): document to author mapping corresponding to indexes in input corpus. chunks_as_numpy (bool): Whether each chunk passed to `.inference` should be a np diff --git a/gensim/topic_coherence/aggregation.py b/gensim/topic_coherence/aggregation.py index 065943a28f..aa27c833f7 100644 --- a/gensim/topic_coherence/aggregation.py +++ b/gensim/topic_coherence/aggregation.py @@ -4,10 +4,7 @@ # Copyright (C) 2013 Radim Rehurek # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html -""" -This module contains functions to perform aggregation on a list of values -obtained from the confirmation measure. -""" +"""This module contains functions to perform aggregation on a list of values obtained from the confirmation measure.""" import logging import numpy as np @@ -17,13 +14,24 @@ def arithmetic_mean(confirmed_measures): """ - This functoin performs the arithmetic mean aggregation on the output obtained from + Perform the arithmetic mean aggregation on the output obtained from the confirmation measure module. - Args: - confirmed_measures : list of calculated confirmation measure on each set in the segmented topics. + Parameters + ---------- + confirmed_measures : list of float + List of calculated confirmation measure on each set in the segmented topics. + + Returns + ------- + `numpy.float` + Arithmetic mean of all the values contained in confirmation measures. + + Examples + -------- + >>> from gensim.topic_coherence.aggregation import arithmetic_mean + >>> arithmetic_mean([1.1, 2.2, 3.3, 4.4]) + 2.75 - Returns: - mean : Arithmetic mean of all the values contained in confirmation measures. """ return np.mean(confirmed_measures) diff --git a/gensim/topic_coherence/direct_confirmation_measure.py b/gensim/topic_coherence/direct_confirmation_measure.py index dfda360447..6482191d9c 100644 --- a/gensim/topic_coherence/direct_confirmation_measure.py +++ b/gensim/topic_coherence/direct_confirmation_measure.py @@ -4,9 +4,7 @@ # Copyright (C) 2013 Radim Rehurek # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html -""" -This module contains functions to compute direct confirmation on a pair of words or word subsets. -""" +"""This module contains functions to compute direct confirmation on a pair of words or word subsets.""" import logging @@ -14,27 +12,53 @@ logger = logging.getLogger(__name__) -EPSILON = 1e-12 # Should be small. Value as suggested in paper. +# Should be small. Value as suggested in paper http://svn.aksw.org/papers/2015/WSDM_Topic_Evaluation/public.pdf +EPSILON = 1e-12 def log_conditional_probability(segmented_topics, accumulator, with_std=False, with_support=False): - """ - This function calculates the log-conditional-probability measure - which is used by coherence measures such as U_mass. + """Calculate the log-conditional-probability measure which is used by coherence measures such as `U_mass`. This is defined as :math:`m_{lc}(S_i) = log \\frac{P(W', W^{*}) + \epsilon}{P(W^{*})}`. - Args: - segmented_topics (list): Output from the segmentation module of the segmented - topics. Is a list of list of tuples. - accumulator: word occurrence accumulator from probability_estimation. - with_std (bool): True to also include standard deviation across topic segment - sets in addition to the mean coherence for each topic; default is False. - with_support (bool): True to also include support across topic segments. The - support is defined as the number of pairwise similarity comparisons were - used to compute the overall topic coherence. - - Returns: - list : of log conditional probability measure for each topic. + Parameters + ---------- + segmented_topics : list of lists of (int, int) + Output from the :func:`~gensim.topic_coherence.segmentation.s_one_pre`, + :func:`~gensim.topic_coherence.segmentation.s_one_one`. + accumulator : :class:`~gensim.topic_coherence.text_analysis.InvertedIndexAccumulator` + Word occurrence accumulator from :mod:`gensim.topic_coherence.probability_estimation`. + with_std : bool, optional + True to also include standard deviation across topic segment sets in addition to the mean coherence + for each topic. + with_support : bool, optional + True to also include support across topic segments. The support is defined as the number of pairwise + similarity comparisons were used to compute the overall topic coherence. + + Returns + ------- + list of float + Log conditional probabilities measurement for each topic. + + Examples + -------- + >>> from gensim.topic_coherence import direct_confirmation_measure, text_analysis + >>> from collections import namedtuple + >>> + >>> # Create dictionary + >>> id2token = {1: 'test', 2: 'doc'} + >>> token2id = {v: k for k, v in id2token.items()} + >>> dictionary = namedtuple('Dictionary', 'token2id, id2token')(token2id, id2token) + >>> + >>> # Initialize segmented topics and accumulator + >>> segmentation = [[(1, 2)]] + >>> + >>> accumulator = text_analysis.InvertedIndexAccumulator({1, 2}, dictionary) + >>> accumulator._inverted_index = {0: {2, 3, 4}, 1: {3, 5}} + >>> accumulator._num_docs = 5 + >>> + >>> # result should be ~ ln(1 / 2) = -0.693147181 + >>> result = direct_confirmation_measure.log_conditional_probability(segmentation, accumulator)[0] + """ topic_coherences = [] num_docs = float(accumulator.num_docs) @@ -56,17 +80,33 @@ def log_conditional_probability(segmented_topics, accumulator, with_std=False, w def aggregate_segment_sims(segment_sims, with_std, with_support): - """Compute various statistics from the segment similarities generated via - set pairwise comparisons of top-N word lists for a single topic. - - Args: - segment_sims (iterable): floating point similarity values to aggregate. - with_std (bool): Set to True to include standard deviation. - with_support (bool): Set to True to include number of elements in `segment_sims` - as a statistic in the results returned. + """Compute various statistics from the segment similarities generated via set pairwise comparisons + of top-N word lists for a single topic. + + Parameters + ---------- + segment_sims : iterable of float + Similarity values to aggregate. + with_std : bool + Set to True to include standard deviation. + with_support : bool + Set to True to include number of elements in `segment_sims` as a statistic in the results returned. + + Returns + ------- + (float[, float[, int]]) + Tuple with (mean[, std[, support]]). + + Examples + --------- + >>> from gensim.topic_coherence import direct_confirmation_measure + >>> + >>> segment_sims = [0.2, 0.5, 1., 0.05] + >>> direct_confirmation_measure.aggregate_segment_sims(segment_sims, True, True) + (0.4375, 0.36293077852394939, 4) + >>> direct_confirmation_measure.aggregate_segment_sims(segment_sims, False, False) + 0.4375 - Returns: - tuple: with (mean[, std[, support]]) """ mean = np.mean(segment_sims) stats = [mean] @@ -78,32 +118,61 @@ def aggregate_segment_sims(segment_sims, with_std, with_support): return stats[0] if len(stats) == 1 else tuple(stats) -def log_ratio_measure( - segmented_topics, accumulator, normalize=False, with_std=False, with_support=False): - """ - If normalize=False: - Popularly known as PMI. - This function calculates the log-ratio-measure which is used by - coherence measures such as c_v. - This is defined as: m_lr(S_i) = log[(P(W', W*) + e) / (P(W') * P(W*))] - - If normalize=True: - This function calculates the normalized-log-ratio-measure, popularly knowns as - NPMI which is used by coherence measures such as c_v. - This is defined as: m_nlr(S_i) = m_lr(S_i) / -log[P(W', W*) + e] - - Args: - segmented_topics (list): Output from the segmentation module of the segmented - topics. Is a list of list of tuples. - accumulator: word occurrence accumulator from probability_estimation. - with_std (bool): True to also include standard deviation across topic segment - sets in addition to the mean coherence for each topic; default is False. - with_support (bool): True to also include support across topic segments. The - support is defined as the number of pairwise similarity comparisons were - used to compute the overall topic coherence. - - Returns: - list : of log ratio measure for each topic. +def log_ratio_measure(segmented_topics, accumulator, normalize=False, with_std=False, with_support=False): + """Compute log ratio measure for `segment_topics`. + + Parameters + ---------- + segmented_topics : list of lists of (int, int) + Output from the :func:`~gensim.topic_coherence.segmentation.s_one_pre`, + :func:`~gensim.topic_coherence.segmentation.s_one_one`. + accumulator : :class:`~gensim.topic_coherence.text_analysis.InvertedIndexAccumulator` + Word occurrence accumulator from :mod:`gensim.topic_coherence.probability_estimation`. + normalize : bool, optional + Details in the "Notes" section. + with_std : bool, optional + True to also include standard deviation across topic segment sets in addition to the mean coherence + for each topic. + with_support : bool, optional + True to also include support across topic segments. The support is defined as the number of pairwise + similarity comparisons were used to compute the overall topic coherence. + + Notes + ----- + If `normalize=False`: + Calculate the log-ratio-measure, popularly known as **PMI** which is used by coherence measures such as `c_v`. + This is defined as :math:`m_{lr}(S_i) = log \\frac{P(W', W^{*}) + \epsilon}{P(W') * P(W^{*})}` + + If `normalize=True`: + Calculate the normalized-log-ratio-measure, popularly knowns as **NPMI** + which is used by coherence measures such as `c_v`. + This is defined as :math:`m_{nlr}(S_i) = \\frac{m_{lr}(S_i)}{-log(P(W', W^{*}) + \epsilon)}` + + Returns + ------- + list of float + Log ratio measurements for each topic. + + Examples + -------- + >>> from gensim.topic_coherence import direct_confirmation_measure, text_analysis + >>> from collections import namedtuple + >>> + >>> # Create dictionary + >>> id2token = {1: 'test', 2: 'doc'} + >>> token2id = {v: k for k, v in id2token.items()} + >>> dictionary = namedtuple('Dictionary', 'token2id, id2token')(token2id, id2token) + >>> + >>> # Initialize segmented topics and accumulator + >>> segmentation = [[(1, 2)]] + >>> + >>> accumulator = text_analysis.InvertedIndexAccumulator({1, 2}, dictionary) + >>> accumulator._inverted_index = {0: {2, 3, 4}, 1: {3, 5}} + >>> accumulator._num_docs = 5 + >>> + >>> # result should be ~ ln{(1 / 5) / [(3 / 5) * (2 / 5)]} = -0.182321557 + >>> result = direct_confirmation_measure.log_ratio_measure(segmentation, accumulator)[0] + """ topic_coherences = [] num_docs = float(accumulator.num_docs) diff --git a/gensim/topic_coherence/indirect_confirmation_measure.py b/gensim/topic_coherence/indirect_confirmation_measure.py index 33b42223bb..fdcbd1565f 100644 --- a/gensim/topic_coherence/indirect_confirmation_measure.py +++ b/gensim/topic_coherence/indirect_confirmation_measure.py @@ -4,11 +4,12 @@ # Copyright (C) 2013 Radim Rehurek # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html -r""" -This module contains functions to compute confirmation on a pair of words or word subsets. +r"""This module contains functions to compute confirmation on a pair of words or word subsets. -The advantage of indirect confirmation measure is that it computes similarity of words in W' and -W* with respect to direct confirmations to all words. Eg. Suppose x and z are both competing +Notes +----- +The advantage of indirect confirmation measure is that it computes similarity of words in :math:`W'` and +:math:`W^{*}` with respect to direct confirmations to all words. Eg. Suppose `x` and `z` are both competing brands of cars, which semantically support each other. However, both brands are seldom mentioned together in documents in the reference corpus. But their confirmations to other words like “road” or “speed” do strongly correlate. This would be reflected by an indirect confirmation measure. @@ -16,15 +17,17 @@ The formula used to compute indirect confirmation measure is - m_{sim}_{(m, \gamma)}(W', W*) = - s_{sim}(\vec{V}^{\,}_{m,\gamma}(W'), \vec{V}^{\,}_{m,\gamma}(W*)) +.. math:: -where s_sim can be cosine, dice or jaccard similarity and + \widetilde{m}_{sim(m, \gamma)}(W', W^{*}) = s_{sim}(\vec{v}^{\,}_{m,\gamma}(W'), \vec{v}^{\,}_{m,\gamma}(W^{*})) - \vec{V}^{\,}_{m,\gamma}(W') = - \Bigg \{{\sum_{w_{i} \in W'}^{ } m(w_{i}, w_{j})^{\gamma}}\Bigg \}_{j = 1,...,|W|} -Here 'm' is the direct confirmation measure used. +where :math:`s_{sim}` can be cosine, dice or jaccard similarity and + +.. math:: + + \vec{v}^{\,}_{m,\gamma}(W') = \Bigg \{{\sum_{w_{i} \in W'}^{ } m(w_{i}, w_{j})^{\gamma}}\Bigg \}_{j = 1,...,|W|} + """ import itertools @@ -33,28 +36,53 @@ import numpy as np import scipy.sparse as sps -from gensim.topic_coherence.direct_confirmation_measure import ( - aggregate_segment_sims, log_ratio_measure) +from gensim.topic_coherence.direct_confirmation_measure import aggregate_segment_sims, log_ratio_measure logger = logging.getLogger(__name__) def word2vec_similarity(segmented_topics, accumulator, with_std=False, with_support=False): """For each topic segmentation, compute average cosine similarity using a - WordVectorsAccumulator. - - Args: - segmented_topics (list): Output from the segmentation module of the segmented - topics. Is a list of list of tuples. - accumulator: word occurrence accumulator from probability_estimation. - with_std (bool): True to also include standard deviation across topic segment - sets in addition to the mean coherence for each topic; default is False. - with_support (bool): True to also include support across topic segments. The - support is defined as the number of pairwise similarity comparisons were - used to compute the overall topic coherence. - - Returns: - list : of word2vec cosine similarities per topic. + :class:`~gensim.topic_coherence.text_analysis.WordVectorsAccumulator`. + + Parameters + ---------- + segmented_topics : list of lists of (int, `numpy.ndarray`) + Output from the :func:`~gensim.topic_coherence.segmentation.s_one_set`. + accumulator : :class:`~gensim.topic_coherence.text_analysis.WordVectorsAccumulator` or + :class:`~gensim.topic_coherence.text_analysis.InvertedIndexAccumulator` + Word occurrence accumulator. + with_std : bool, optional + True to also include standard deviation across topic segment sets + in addition to the mean coherence for each topic. + with_support : bool, optional + True to also include support across topic segments. The support is defined as + the number of pairwise similarity comparisons were used to compute the overall topic coherence. + + Returns + ------- + list of (float[, float[, int]]) + Сosine word2vec similarities per topic (with std/support if `with_std`, `with_support`). + + Examples + -------- + >>> import numpy as np + >>> from gensim.corpora.dictionary import Dictionary + >>> from gensim.topic_coherence import indirect_confirmation_measure + >>> from gensim.topic_coherence import text_analysis + >>> + >>> # create segmentation + >>> segmentation = [[(1, np.array([1, 2])), (2, np.array([1, 2]))]] + >>> + >>> # create accumulator + >>> dictionary = Dictionary() + >>> dictionary.id2token = {1: 'fake', 2: 'tokens'} + >>> accumulator = text_analysis.WordVectorsAccumulator({1, 2}, dictionary) + >>> _ = accumulator.accumulate([['fake', 'tokens'],['tokens', 'fake']], 5) + >>> + >>> # should be (0.726752426218 0.00695475919227) + >>> mean, std = indirect_confirmation_measure.word2vec_similarity(segmentation, accumulator, with_std=True)[0] + """ topic_coherences = [] total_oov = 0 @@ -85,44 +113,54 @@ def word2vec_similarity(segmented_topics, accumulator, with_std=False, with_supp return topic_coherences -def cosine_similarity( - segmented_topics, accumulator, topics, measure='nlr', gamma=1, - with_std=False, with_support=False): - r""" - This function calculates the indirect cosine measure. - - Given context vectors u = V(W') and w = V(W*) for the - word sets of a pair S_i = (W', W*) indirect cosine measure - is computed as the cosine similarity between u and w. - - The formula used is - - m_{sim}_{(m, \gamma)}(W', W*) = - s_{sim}(\vec{V}^{\,}_{m,\gamma}(W'), \vec{V}^{\,}_{m,\gamma}(W*)) - - where each vector - - \vec{V}^{\,}_{m,\gamma}(W') = - \Bigg \{{\sum_{w_{i} \in W'}^{ } m(w_{i}, w_{j})^{\gamma}}\Bigg \}_{j = 1,...,|W|} - - Args: - segmented_topics: Output from the segmentation module of the - segmented topics. Is a list of list of tuples. - accumulator: Output from the probability_estimation module. Is an - accumulator of word occurrences (see text_analysis module). - topics: Topics obtained from the trained topic model. - measure (str): Direct confirmation measure to be used. Supported - values are "nlr" (normalized log ratio). - gamma: Gamma value for computing W', W* vectors; default is 1. - with_std (bool): True to also include standard deviation across topic - segment sets in addition to the mean coherence for each topic; - default is False. - with_support (bool): True to also include support across topic segments. - The support is defined as the number of pairwise similarity - comparisons were used to compute the overall topic coherence. - - Returns: - list: of indirect cosine similarity measure for each topic. +def cosine_similarity(segmented_topics, accumulator, topics, measure='nlr', + gamma=1, with_std=False, with_support=False): + """Calculate the indirect cosine measure. + + Parameters + ---------- + segmented_topics: list of lists of (int, `numpy.ndarray`) + Output from the segmentation module of the segmented topics. + accumulator: :class:`~gensim.topic_coherence.text_analysis.InvertedIndexAccumulator` + Output from the probability_estimation module. Is an topics: Topics obtained from the trained topic model. + measure : str, optional + Direct confirmation measure to be used. Supported values are "nlr" (normalized log ratio). + gamma: float, optional + Gamma value for computing :math:`W'` and :math:`W^{*}` vectors. + with_std : bool + True to also include standard deviation across topic segment sets in addition to the mean coherence + for each topic; default is False. + with_support : bool + True to also include support across topic segments. The support is defined as the number of pairwise similarity + comparisons were used to compute the overall topic coherence. + + Returns + ------- + list + List of indirect cosine similarity measure for each topic. + + Examples + -------- + >>> from gensim.corpora.dictionary import Dictionary + >>> from gensim.topic_coherence import indirect_confirmation_measure, text_analysis + >>> import numpy as np + >>> + >>> # create accumulator + >>> dictionary = Dictionary() + >>> dictionary.id2token = {1: 'fake', 2: 'tokens'} + >>> accumulator = text_analysis.InvertedIndexAccumulator({1, 2}, dictionary) + >>> accumulator._inverted_index = {0: {2, 3, 4}, 1: {3, 5}} + >>> accumulator._num_docs = 5 + >>> + >>> # create topics + >>> topics = [np.array([1, 2])] + >>> + >>> # create segmentation + >>> segmentation = [[(1, np.array([1, 2])), (2, np.array([1, 2]))]] + >>> obtained = indirect_confirmation_measure.cosine_similarity(segmentation, accumulator, topics, 'nlr', 1) + >>> print obtained[0] + 0.623018926945 + """ context_vectors = ContextVectorComputer(measure, topics, accumulator, gamma) @@ -141,9 +179,52 @@ def cosine_similarity( class ContextVectorComputer(object): - """Lazily compute context vectors for topic segments.""" + """Lazily compute context vectors for topic segments. + + Parameters + ---------- + measure: str + Confirmation measure. + topics: list of numpy.array + Topics. + accumulator : :class:`~gensim.topic_coherence.text_analysis.WordVectorsAccumulator` or + :class:`~gensim.topic_coherence.text_analysis.InvertedIndexAccumulator` + Word occurrence accumulator from probability_estimation. + gamma: float + Value for computing vectors. + + Attributes + ---------- + sim_cache: dict + Cache similarities between tokens (pairs of word ids), e.g. (1, 2). + context_vector_cache: dict + Mapping from (segment, topic_words) --> context_vector. + + Example + ------- + >>> from gensim.corpora.dictionary import Dictionary + >>> from gensim.topic_coherence import indirect_confirmation_measure, text_analysis + >>> import numpy as np + >>> + >>> # create measure, topics + >>> measure = 'nlr' + >>> topics = [np.array([1, 2])] + >>> + >>> # create accumulator + >>> dictionary = Dictionary() + >>> dictionary.id2token = {1: 'fake', 2: 'tokens'} + >>> accumulator = text_analysis.WordVectorsAccumulator({1, 2}, dictionary) + >>> _ = accumulator.accumulate([['fake', 'tokens'],['tokens', 'fake']], 5) + >>> cont_vect_comp = indirect_confirmation_measure.ContextVectorComputer(measure, topics, accumulator, 1) + >>> cont_vect_comp.mapping + {1: 0, 2: 1} + >>> cont_vect_comp.vocab_size + 2 + + """ def __init__(self, measure, topics, accumulator, gamma): + if measure == 'nlr': self.similarity = _pair_npmi else: @@ -154,16 +235,27 @@ def __init__(self, measure, topics, accumulator, gamma): self.vocab_size = len(self.mapping) self.accumulator = accumulator self.gamma = gamma - self.sim_cache = {} # Cache similarities between tokens (pairs of word ids), e.g. (1, 2) - self.context_vector_cache = {} # mapping from (segment, topic_words) --> context_vector + self.sim_cache = {} + self.context_vector_cache = {} def __getitem__(self, idx): return self.compute_context_vector(*idx) def compute_context_vector(self, segment_word_ids, topic_word_ids): - """ - Step 1. Check if (segment_word_ids, topic_word_ids) context vector has been cached. - Step 2. If yes, return corresponding context vector, else compute, cache, and return. + """Check if (segment_word_ids, topic_word_ids) context vector has been cached. + + Parameters + ---------- + segment_word_ids: list + Ids of words in segment. + topic_word_ids: list + Ids of words in topic. + Returns + ------- + csr_matrix :class:`~scipy.sparse.csr` + If context vector has been cached, then return corresponding context vector, + else compute, cache, and return. + """ key = _key_for_segment(segment_word_ids, topic_word_ids) context_vector = self.context_vector_cache.get(key, None) @@ -173,7 +265,20 @@ def compute_context_vector(self, segment_word_ids, topic_word_ids): return context_vector def _make_seg(self, segment_word_ids, topic_word_ids): - """Internal helper function to return context vectors for segmentations.""" + """Return context vectors for segmentation (Internal helper function). + + Parameters + ---------- + segment_word_ids : iterable or int + Ids of words in segment. + topic_word_ids : list + Ids of words in topic. + Returns + ------- + csr_matrix :class:`~scipy.sparse.csr` + Matrix in Compressed Sparse Row format + + """ context_vector = sps.lil_matrix((self.vocab_size, 1)) if not hasattr(segment_word_ids, '__iter__'): segment_word_ids = (segment_word_ids,) @@ -190,8 +295,20 @@ def _make_seg(self, segment_word_ids, topic_word_ids): def _pair_npmi(pair, accumulator): - """Compute normalized pairwise mutual information (NPMI) between a pair of words. - The pair is an iterable of (word_id1, word_id2). + """Compute normalized pairwise mutual information (**NPMI**) between a pair of words. + + Parameters + ---------- + pair : (int, int) + The pair of words (word_id1, word_id2). + accumulator : :class:`~gensim.topic_coherence.text_analysis.InvertedIndexAccumulator` + Word occurrence accumulator from probability_estimation. + + Return + ------ + float + NPMI between a pair of words. + """ return log_ratio_measure([[pair]], accumulator, True)[0] diff --git a/gensim/topic_coherence/probability_estimation.py b/gensim/topic_coherence/probability_estimation.py index f59692bdcc..404310a36c 100644 --- a/gensim/topic_coherence/probability_estimation.py +++ b/gensim/topic_coherence/probability_estimation.py @@ -4,9 +4,7 @@ # Copyright (C) 2013 Radim Rehurek # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html -""" -This module contains functions to perform segmentation on a list of topics. -""" +"""This module contains functions to perform segmentation on a list of topics.""" import itertools import logging @@ -19,38 +17,119 @@ def p_boolean_document(corpus, segmented_topics): - """This function performs the boolean document probability estimation. - Boolean document estimates the probability of a single word as the number - of documents in which the word occurs divided by the total number of documents. + """Perform the boolean document probability estimation. Boolean document estimates the probability of a single word + as the number of documents in which the word occurs divided by the total number of documents. + + Parameters + ---------- + corpus : iterable of list of (int, int) + The corpus of documents. + segmented_topics: list of (int, int). + Each tuple (word_id_set1, word_id_set2) is either a single integer, or a `numpy.ndarray` of integers. + + Returns + ------- + :class:`~gensim.topic_coherence.text_analysis.CorpusAccumulator` + Word occurrence accumulator instance that can be used to lookup token frequencies and co-occurrence frequencies. + + Examples + --------- + >>> from gensim.topic_coherence import probability_estimation + >>> from gensim.corpora.hashdictionary import HashDictionary + >>> + >>> + >>> texts = [ + ... ['human', 'interface', 'computer'], + ... ['eps', 'user', 'interface', 'system'], + ... ['system', 'human', 'system', 'eps'], + ... ['user', 'response', 'time'], + ... ['trees'], + ... ['graph', 'trees'] + ... ] + >>> dictionary = HashDictionary(texts) + >>> w2id = dictionary.token2id + >>> + >>> # create segmented_topics + >>> segmented_topics = [ + ... [(w2id['system'], w2id['graph']),(w2id['computer'], w2id['graph']),(w2id['computer'], w2id['system'])], + ... [(w2id['computer'], w2id['graph']),(w2id['user'], w2id['graph']),(w2id['user'], w2id['computer'])] + ... ] + >>> + >>> # create corpus + >>> corpus = [dictionary.doc2bow(text) for text in texts] + >>> + >>> result = probability_estimation.p_boolean_document(corpus, segmented_topics) + >>> result.index_to_dict() + {10608: set([0]), 12736: set([1, 3]), 18451: set([5]), 5798: set([1, 2])} - Args: - corpus : The corpus of documents. - segmented_topics : Output from the segmentation of topics. Could be simply topics too. - - Returns: - accumulator : word occurrence accumulator instance that can be used to lookup token - frequencies and co-occurrence frequencies. """ top_ids = unique_ids_from_segments(segmented_topics) return CorpusAccumulator(top_ids).accumulate(corpus) def p_boolean_sliding_window(texts, segmented_topics, dictionary, window_size, processes=1): - """This function performs the boolean sliding window probability estimation. + """Perform the boolean sliding window probability estimation. + + Parameters + ---------- + texts : iterable of iterable of str + Input text + segmented_topics: list of (int, int) + Each tuple (word_id_set1, word_id_set2) is either a single integer, or a `numpy.ndarray` of integers. + dictionary : :class:`~gensim.corpora.dictionary.Dictionary` + Gensim dictionary mapping of the tokens and ids. + window_size : int + Size of the sliding window, 110 found out to be the ideal size for large corpora. + processes : int, optional + Number of process that will be used for + :class:`~gensim.topic_coherence.text_analysis.ParallelWordOccurrenceAccumulator` + + Notes + ----- Boolean sliding window determines word counts using a sliding window. The window moves over the documents one word token per step. Each step defines a new virtual document by copying the window content. Boolean document is applied to these virtual documents to compute word probabilities. - Args: - texts : List of string sentences. - segmented_topics : Output from the segmentation of topics. Could be simply topics too. - dictionary : Gensim dictionary mapping of the tokens and ids. - window_size : Size of the sliding window. 110 found out to be the ideal size for large corpora. + Returns + ------- + :class:`~gensim.topic_coherence.text_analysis.WordOccurrenceAccumulator` + if `processes` = 1 OR + :class:`~gensim.topic_coherence.text_analysis.ParallelWordOccurrenceAccumulator` + otherwise. This is word occurrence accumulator instance that can be used to lookup + token frequencies and co-occurrence frequencies. + + Examples + --------- + >>> from gensim.topic_coherence import probability_estimation + >>> from gensim.corpora.hashdictionary import HashDictionary + >>> + >>> + >>> texts = [ + ... ['human', 'interface', 'computer'], + ... ['eps', 'user', 'interface', 'system'], + ... ['system', 'human', 'system', 'eps'], + ... ['user', 'response', 'time'], + ... ['trees'], + ... ['graph', 'trees'] + ... ] + >>> dictionary = HashDictionary(texts) + >>> w2id = dictionary.token2id + + >>> + >>> # create segmented_topics + >>> segmented_topics = [ + ... [(w2id['system'], w2id['graph']),(w2id['computer'], w2id['graph']),(w2id['computer'], w2id['system'])], + ... [(w2id['computer'], w2id['graph']),(w2id['user'], w2id['graph']),(w2id['user'], w2id['computer'])] + ... ] + >>> + >>> # create corpus + >>> corpus = [dictionary.doc2bow(text) for text in texts] + >>> accumulator = probability_estimation.p_boolean_sliding_window(texts, segmented_topics, dictionary, 2) + >>> + >>> (accumulator[w2id['computer']], accumulator[w2id['user']], accumulator[w2id['system']]) + (1, 3, 4) - Returns: - accumulator : word occurrence accumulator instance that can be used to lookup token - frequencies and co-occurrence frequencies. """ top_ids = unique_ids_from_segments(segmented_topics) if processes <= 1: @@ -62,10 +141,59 @@ def p_boolean_sliding_window(texts, segmented_topics, dictionary, window_size, p def p_word2vec(texts, segmented_topics, dictionary, window_size=None, processes=1, model=None): - """Train word2vec model on `texts` if model is not None. - Returns: - ---- - accumulator: text accumulator with trained context vectors. + """Train word2vec model on `texts` if `model` is not None. + + Parameters + ---------- + texts : iterable of iterable of str + Input text + segmented_topics : iterable of iterable of str + Output from the segmentation of topics. Could be simply topics too. + dictionary : :class:`~gensim.corpora.dictionary` + Gensim dictionary mapping of the tokens and ids. + window_size : int, optional + Size of the sliding window. + processes : int, optional + Number of processes to use. + model : :class:`~gensim.models.word2vec.Word2Vec` or :class:`~gensim.models.keyedvectors.KeyedVectors`, optional + If None, a new Word2Vec model is trained on the given text corpus. Otherwise, + it should be a pre-trained Word2Vec context vectors. + + Returns + ------- + :class:`~gensim.topic_coherence.text_analysis.WordVectorsAccumulator` + Text accumulator with trained context vectors. + + Examples + -------- + >>> from gensim.topic_coherence import probability_estimation + >>> from gensim.corpora.hashdictionary import HashDictionary + >>> from gensim.models import word2vec + >>> + >>> texts = [ + ... ['human', 'interface', 'computer'], + ... ['eps', 'user', 'interface', 'system'], + ... ['system', 'human', 'system', 'eps'], + ... ['user', 'response', 'time'], + ... ['trees'], + ... ['graph', 'trees'] + ... ] + >>> dictionary = HashDictionary(texts) + >>> w2id = dictionary.token2id + + >>> + >>> # create segmented_topics + >>> segmented_topics = [ + ... [(w2id['system'], w2id['graph']),(w2id['computer'], w2id['graph']),(w2id['computer'], w2id['system'])], + ... [(w2id['computer'], w2id['graph']),(w2id['user'], w2id['graph']),(w2id['user'], w2id['computer'])] + ... ] + >>> + >>> # create corpus + >>> corpus = [dictionary.doc2bow(text) for text in texts] + >>> sentences = [['human', 'interface', 'computer'],['survey', 'user', 'computer', 'system', 'response', 'time']] + >>> model = word2vec.Word2Vec(sentences, size=100,min_count=1) + >>> accumulator = probability_estimation.p_word2vec(texts, segmented_topics, dictionary, 2, 1, model) + """ top_ids = unique_ids_from_segments(segmented_topics) accumulator = WordVectorsAccumulator( @@ -76,11 +204,24 @@ def p_word2vec(texts, segmented_topics, dictionary, window_size=None, processes= def unique_ids_from_segments(segmented_topics): """Return the set of all unique ids in a list of segmented topics. - Args: - segmented_topics: list of tuples of (word_id_set1, word_id_set2). Each word_id_set - is either a single integer, or a `numpy.ndarray` of integers. - Returns: - unique_ids : set of unique ids across all topic segments. + Parameters + ---------- + segmented_topics: list of (int, int). + Each tuple (word_id_set1, word_id_set2) is either a single integer, or a `numpy.ndarray` of integers. + + Returns + ------- + set + Set of unique ids across all topic segments. + + Example + ------- + >>> from gensim.topic_coherence import probability_estimation + >>> + >>> segmentation = [[(1, 2)]] + >>> probability_estimation.unique_ids_from_segments(segmentation) + set([1, 2]) + """ unique_ids = set() # is a set of all the unique ids contained in topics. for s_i in segmented_topics: diff --git a/gensim/topic_coherence/segmentation.py b/gensim/topic_coherence/segmentation.py index 8d3185dbbb..9629369b42 100644 --- a/gensim/topic_coherence/segmentation.py +++ b/gensim/topic_coherence/segmentation.py @@ -4,9 +4,7 @@ # Copyright (C) 2013 Radim Rehurek # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html -""" -This module contains functions to perform segmentation on a list of topics. -""" +"""This module contains functions to perform segmentation on a list of topics.""" import logging @@ -14,21 +12,32 @@ def s_one_pre(topics): - """ - This function performs s_one_pre segmentation on a list of topics. - s_one_pre segmentation is defined as: s_one_pre = {(W', W*) | W' = {w_i}; W* = {w_j}; w_i, w_j belongs to W; i > j} - Example: - - >>> topics = [np.array([1, 2, 3]), np.array([4, 5, 6])] - >>> s_one_pre(topics) - [[(2, 1), (3, 1), (3, 2)], [(5, 4), (6, 4), (6, 5)]] + """Performs segmentation on a list of topics. + + Notes + ----- + Segmentation is defined as + :math:`s_{pre} = {(W', W^{*}) | W' = w_{i}; W^{*} = {w_j}; w_{i}, w_{j} \in W; i > j}`. + + Parameters + ---------- + topics : list of np.array + list of topics obtained from an algorithm such as LDA. + + Returns + ------- + list of list of (int, int) + :math:`(W', W^{*})` for all unique topic ids. + + Examples + -------- + >>> import numpy as np + >>> from gensim.topic_coherence import segmentation + >>> + >>> topics = [np.array([1, 2, 3]), np.array([4, 5, 6])] + >>> segmentation.s_one_pre(topics) + [[(2, 1), (3, 1), (3, 2)], [(5, 4), (6, 4), (6, 5)]] - Args: - topics : list of topics obtained from an algorithm such as LDA. - Is a list such as [array([ 9, 10, 11]), array([ 9, 10, 7]), ...] - - Returns: - s_one_pre_res : list of list of (W', W*) tuples for all unique topic ids """ s_one_pre_res = [] @@ -43,21 +52,29 @@ def s_one_pre(topics): def s_one_one(topics): - """ - This function performs s_one_one segmentation on a list of topics. - s_one_one segmentation is defined as: s_one_one = {(W', W*) | W' = {w_i}; W* = {w_j}; w_i, w_j belongs to W; i != j} - Example: + """Perform segmentation on a list of topics. + Segmentation is defined as + :math:`s_{one} = {(W', W^{*}) | W' = {w_i}; W^{*} = {w_j}; w_{i}, w_{j} \in W; i \\neq j}`. + + Parameters + ---------- + topics : list of `numpy.ndarray` + List of topics obtained from an algorithm such as LDA. + + Returns + ------- + list of list of (int, int). + :math:`(W', W^{*})` for all unique topic ids. + + Examples + ------- + >>> import numpy as np + >>> from gensim.topic_coherence import segmentation + >>> + >>> topics = [np.array([1, 2, 3]), np.array([4, 5, 6])] + >>> segmentation.s_one_one(topics) + [[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)], [(4, 5), (4, 6), (5, 4), (5, 6), (6, 4), (6, 5)]] - >>> topics = [np.array([1, 2, 3]), np.array([4, 5, 6])] - >>> s_one_pre(topics) - [[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)], [(4, 5), (4, 6), (5, 4), (5, 6), (6, 4), (6, 5)]] - - Args: - topics : list of topics obtained from an algorithm such as LDA. - Is a list such as [array([ 9, 10, 11]), array([ 9, 10, 7]), ...] - - Returns: - s_one_one_res : list of list of (W', W*) tuples for all unique topic ids """ s_one_one_res = [] @@ -75,22 +92,29 @@ def s_one_one(topics): def s_one_set(topics): - """ - This function performs s_one_set segmentation on a list of topics. - s_one_set segmentation is defined as: s_one_set = {(W', W*) | W' = {w_i}; w_i belongs to W; W* = W} - Example: - >>> topics = [np.array([9, 10, 7]) - >>> s_one_set(topics) - [[(9, array([ 9, 10, 7])), - (10, array([ 9, 10, 7])), - (7, array([ 9, 10, 7]))]] - - Args: - topics : list of topics obtained from an algorithm such as LDA. - Is a list such as [array([ 9, 10, 11]), array([ 9, 10, 7]), ...] - - Returns: - s_one_set_res : list of list of (W', W*) tuples for all unique topic ids. + """Perform s_one_set segmentation on a list of topics. + Segmentation is defined as + :math:`s_{set} = {(W', W^{*}) | W' = {w_i}; w_{i} \in W; W^{*} = W}` + + Parameters + ---------- + topics : list of `numpy.ndarray` + List of topics obtained from an algorithm such as LDA. + + Returns + ------- + list of list of (int, int). + :math:`(W', W^{*})` for all unique topic ids. + + Examples + -------- + >>> import numpy as np + >>> from gensim.topic_coherence import segmentation + >>> + >>> topics = [np.array([9, 10, 7])] + >>> segmentation.s_one_set(topics) + [[(9, array([ 9, 10, 7])), (10, array([ 9, 10, 7])), (7, array([ 9, 10, 7]))]] + """ s_one_set_res = [] diff --git a/gensim/topic_coherence/text_analysis.py b/gensim/topic_coherence/text_analysis.py index 340286c8d1..b759e0a13a 100644 --- a/gensim/topic_coherence/text_analysis.py +++ b/gensim/topic_coherence/text_analysis.py @@ -4,10 +4,8 @@ # Copyright (C) 2013 Radim Rehurek # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html -""" -This module contains classes for analyzing the texts of a corpus to accumulate -statistical information about word occurrences. -""" +"""This module contains classes for analyzing the texts of a corpus to accumulate +statistical information about word occurrences.""" import itertools import logging @@ -27,11 +25,32 @@ def _ids_to_words(ids, dictionary): """Convert an iterable of ids to their corresponding words using a dictionary. - This function abstracts away the differences between the HashDictionary and the standard one. + Abstract away the differences between the HashDictionary and the standard one. + + Parameters + ---------- + ids: dict + Dictionary of ids and their words. + dictionary: :class:`~gensim.corpora.dictionary.Dictionary` + Input gensim dictionary + + Returns + ------- + set + Corresponding words. + + Examples + -------- + >>> from gensim.corpora.dictionary import Dictionary + >>> from gensim.topic_coherence import text_analysis + >>> + >>> dictionary = Dictionary() + >>> ids = {1: 'fake', 4: 'cats'} + >>> dictionary.id2token = {1: 'fake', 2: 'tokens', 3: 'rabbids', 4: 'cats'} + >>> + >>> text_analysis._ids_to_words(ids, dictionary) + set(['cats', 'fake']) - Args: - ids: list of list of tuples, where each tuple contains (token_id, iterable of token_ids). - This is the format returned by the topic_coherence.segmentation functions. """ if not dictionary.id2token: # may not be initialized in the standard gensim.corpora.Dictionary setattr(dictionary, 'id2token', {v: k for k, v in dictionary.token2id.items()}) @@ -48,9 +67,40 @@ def _ids_to_words(ids, dictionary): class BaseAnalyzer(object): - """Base class for corpus and text analyzers.""" + """Base class for corpus and text analyzers. + + Attributes + ---------- + relevant_ids : dict + Mapping + _vocab_size : int + Size of vocabulary. + id2contiguous : dict + Mapping word_id -> number. + log_every : int + Interval for logging. + _num_docs : int + Number of documents. + """ def __init__(self, relevant_ids): + """ + + Parameters + ---------- + relevant_ids : dict + Mapping + + Examples + -------- + >>> from gensim.topic_coherence import text_analysis + >>> ids = {1: 'fake', 4: 'cats'} + >>> base = text_analysis.BaseAnalyzer(ids) + >>> # should return {1: 'fake', 4: 'cats'} 2 {1: 0, 4: 1} 1000 0 + >>> print base.relevant_ids, base._vocab_size, base.id2contiguous, base.log_every, base._num_docs + {1: 'fake', 4: 'cats'} 2 {1: 0, 4: 1} 1000 0 + + """ self.relevant_ids = relevant_ids self._vocab_size = len(self.relevant_ids) self.id2contiguous = {word_id: n for n, word_id in enumerate(self.relevant_ids)} @@ -97,9 +147,40 @@ class UsesDictionary(BaseAnalyzer): """A BaseAnalyzer that uses a Dictionary, hence can translate tokens to counts. The standard BaseAnalyzer can only deal with token ids since it doesn't have the token2id mapping. - """ + Attributes + ---------- + relevant_words : set + Set of words that occurrences should be accumulated for. + dictionary : :class:`~gensim.corpora.dictionary.Dictionary` + Dictionary based on text + token2id : dict + Mapping from :class:`~gensim.corpora.dictionary.Dictionary` + + """ def __init__(self, relevant_ids, dictionary): + """ + + Parameters + ---------- + relevant_ids : dict + Mapping + dictionary : :class:`~gensim.corpora.dictionary.Dictionary` + Dictionary based on text + + Examples + -------- + >>> from gensim.topic_coherence import text_analysis + >>> from gensim.corpora.dictionary import Dictionary + >>> + >>> ids = {1: 'foo', 2: 'bar'} + >>> dictionary = Dictionary([['foo','bar','baz'], ['foo','bar','bar','baz']]) + >>> udict = text_analysis.UsesDictionary(ids, dictionary) + >>> + >>> print udict.relevant_words + set([u'foo', u'baz']) + + """ super(UsesDictionary, self).__init__(relevant_ids) self.relevant_words = _ids_to_words(self.relevant_ids, dictionary) self.dictionary = dictionary @@ -131,6 +212,24 @@ class InvertedIndexBased(BaseAnalyzer): """Analyzer that builds up an inverted index to accumulate stats.""" def __init__(self, *args): + """ + + Parameters + ---------- + args : dict + Look at :class:`~gensim.topic_coherence.text_analysis.BaseAnalyzer` + + Examples + -------- + >>> from gensim.topic_coherence import text_analysis + >>> + >>> ids = {1: 'fake', 4: 'cats'} + >>> ininb = text_analysis.InvertedIndexBased(ids) + >>> + >>> print ininb._inverted_index + [set([]) set([])] + + """ super(InvertedIndexBased, self).__init__(*args) self._inverted_index = np.array([set() for _ in range(self._vocab_size)]) @@ -151,6 +250,7 @@ class CorpusAccumulator(InvertedIndexBased): """Gather word occurrence stats from a corpus by iterating over its BoW representation.""" def analyze_text(self, text, doc_num=None): + """Build an inverted index from a sequence of corpus texts.""" doc_words = frozenset(x[0] for x in text) top_ids_in_doc = self.relevant_ids.intersection(doc_words) for word_id in top_ids_in_doc: @@ -168,9 +268,14 @@ class WindowedTextsAnalyzer(UsesDictionary): def __init__(self, relevant_ids, dictionary): """ - Args: - relevant_ids: the set of words that occurrences should be accumulated for. - dictionary: Dictionary instance with mappings for the relevant_ids. + + Parameters + ---------- + relevant_ids : set of int + Relevant id + dictionary : :class:`~gensim.corpora.dictionary.Dictionary` + Dictionary instance with mappings for the relevant_ids. + """ super(WindowedTextsAnalyzer, self).__init__(relevant_ids, dictionary) self._none_token = self._vocab_size # see _iter_texts for use of none token @@ -195,7 +300,7 @@ def _iter_texts(self, texts): for w in text], dtype=dtype) def text_is_relevant(self, text): - """Return True if the text has any relevant words, else False.""" + """Check if the text has any relevant words.""" for word in text: if word in self.relevant_words: return True @@ -232,10 +337,14 @@ def accumulate(self, texts, window_size): return self def partial_accumulate(self, texts, window_size): - """Meant to be called several times to accumulate partial results. The final - accumulation should be performed with the `accumulate` method as opposed to this one. + """Meant to be called several times to accumulate partial results. + + Notes + ----- + The final accumulation should be performed with the `accumulate` method as opposed to this one. This method does not ensure the co-occurrence matrix is in lil format and does not symmetrize it after accumulation. + """ self._current_doc_num = -1 self._token_at_edge = None @@ -267,8 +376,12 @@ def _slide_window(self, window, doc_num): def _symmetrize(self): """Word pairs may have been encountered in (i, j) and (j, i) order. + + Notes + ----- Rather than enforcing a particular ordering during the update process, we choose to symmetrize the co-occurrence matrix after accumulation has completed. + """ co_occ = self._co_occurrences co_occ.setdiag(self._occurrences) # diagonal should be equal to occurrence counts @@ -288,24 +401,26 @@ def merge(self, other): class PatchedWordOccurrenceAccumulator(WordOccurrenceAccumulator): - """Monkey patched for multiprocessing worker usage, - to move some of the logic to the master process. - """ + """Monkey patched for multiprocessing worker usage, to move some of the logic to the master process.""" def _iter_texts(self, texts): return texts # master process will handle this class ParallelWordOccurrenceAccumulator(WindowedTextsAnalyzer): - """Accumulate word occurrences in parallel.""" + """Accumulate word occurrences in parallel. + + Attributes + ---------- + processes : int + Number of processes to use; must be at least two. + args : + Should include `relevant_ids` and `dictionary` (see :class:`~UsesDictionary.__init__`). + kwargs : + Can include `batch_size`, which is the number of docs to send to a worker at a time. + If not included, it defaults to 64. + """ def __init__(self, processes, *args, **kwargs): - """ - Args: - processes : number of processes to use; must be at least two. - args : should include `relevant_ids` and `dictionary` (see `UsesDictionary.__init__`). - kwargs : can include `batch_size`, which is the number of docs to send to a worker at a - time. If not included, it defaults to 64. - """ super(ParallelWordOccurrenceAccumulator, self).__init__(*args) if processes < 2: raise ValueError( @@ -332,9 +447,19 @@ def accumulate(self, texts, window_size): def start_workers(self, window_size): """Set up an input and output queue and start processes for each worker. + Notes + ----- The input queue is used to transmit batches of documents to the workers. The output queue is used by workers to transmit the WordOccurrenceAccumulator instances. - Returns: tuple of (list of workers, input queue, output queue). + + Parameters + ---------- + window_size : int + + Returns + ------- + (list of lists) + Tuple of (list of workers, input queue, output queue). """ input_q = mp.Queue(maxsize=self.processes) output_q = mp.Queue() @@ -348,9 +473,7 @@ def start_workers(self, window_size): return workers, input_q, output_q def yield_batches(self, texts): - """Return a generator over the given texts that yields batches of - `batch_size` texts at a time. - """ + """Return a generator over the given texts that yields batches of `batch_size` texts at a time.""" batch = [] for text in self._iter_texts(texts): batch.append(text) @@ -375,17 +498,19 @@ def queue_all_texts(self, q, texts, window_size): (batch_num + 1), (batch_num + 1) * self.batch_size, self._num_docs) def terminate_workers(self, input_q, output_q, workers, interrupted=False): - """Wait until all workers have transmitted their WordOccurrenceAccumulator instances, - then terminate each. We do not use join here because it has been shown to have some issues - in Python 2.7 (and even in later versions). This method also closes both the input and output - queue. + """Wait until all workers have transmitted their WordOccurrenceAccumulator instances, then terminate each. + Warnings + -------- + We do not use join here because it has been shown to have some issues + in Python 2.7 (and even in later versions). This method also closes both the input and output queue. If `interrupted` is False (normal execution), a None value is placed on the input queue for each worker. The workers are looking for this sentinel value and interpret it as a signal to terminate themselves. If `interrupted` is True, a KeyboardInterrupt occurred. The workers are programmed to recover from this and continue on to transmit their results before terminating. So in this instance, the sentinel values are not queued, but the rest of the execution continues as usual. + """ if not interrupted: for _ in workers: @@ -408,6 +533,7 @@ def merge_accumulators(self, accumulators): """Merge the list of accumulators into a single `WordOccurrenceAccumulator` with all occurrence and co-occurrence counts, and a `num_docs` that reflects the total observed by all the individual accumulators. + """ accumulator = WordOccurrenceAccumulator(self.relevant_ids, self.dictionary) for other_accumulator in accumulators: @@ -469,17 +595,18 @@ def reply_to_master(self): class WordVectorsAccumulator(UsesDictionary): - """Accumulate context vectors for words using word vector embeddings.""" + """Accumulate context vectors for words using word vector embeddings. + + Attributes + ---------- + model: Word2Vec (:class:`~gensim.models.keyedvectors.KeyedVectors`) + If None, a new Word2Vec model is trained on the given text corpus. Otherwise, + it should be a pre-trained Word2Vec context vectors. + model_kwargs: + if model is None, these keyword arguments will be passed through to the Word2Vec constructor. + """ def __init__(self, relevant_ids, dictionary, model=None, **model_kwargs): - """ - Args: - model: if None, a new Word2Vec model is trained on the given text corpus. - If not None, it should be a pre-trained Word2Vec context vectors - (gensim.models.keyedvectors.KeyedVectors instance). - model_kwargs: if model is None, these keyword arguments will be passed - through to the Word2Vec constructor. - """ super(WordVectorsAccumulator, self).__init__(relevant_ids, dictionary) self.model = model self.model_kwargs = model_kwargs From fad00c6ab73dec586cc43264012670ec0a829ae1 Mon Sep 17 00:00:00 2001 From: Austen Lamacraft Date: Thu, 11 Jan 2018 08:33:04 +0000 Subject: [PATCH 08/14] Fix docstrings for `gensim.models.normmodel` (#1805) * First edits * changed bow * Added examples * Final commit of the night * Still struggling with docs * Removed examples but still struggling with documentation * fix docstring * fix docstring[2] --- docs/src/models/normmodel.rst | 1 + gensim/models/normmodel.py | 70 +++++++++++++++++++++++------------ 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/docs/src/models/normmodel.rst b/docs/src/models/normmodel.rst index d1a12e2af4..9131a5751d 100644 --- a/docs/src/models/normmodel.rst +++ b/docs/src/models/normmodel.rst @@ -7,3 +7,4 @@ :inherited-members: :undoc-members: :show-inheritance: + :special-members: __getitem__ diff --git a/gensim/models/normmodel.py b/gensim/models/normmodel.py index 31e843beb3..23853cdafd 100644 --- a/gensim/models/normmodel.py +++ b/gensim/models/normmodel.py @@ -12,35 +12,27 @@ class NormModel(interfaces.TransformationABC): - """ - Objects of this class realize the explicit normalization of - vectors. Supported norms are l1' and 'l2' with 'l2' being - default. + """Objects of this class realize the explicit normalization of vectors (l1 and l2).""" - The main methods are: + def __init__(self, corpus=None, norm='l2'): + """Compute the l1 or l2 normalization by normalizing separately for each document in a corpus. - 1. Constructor which normalizes the terms in the given corpus document-wise. - 2. The normalize() method which normalizes a simple count representation. - 3. The [] transformation which internally calls the self.normalize() method. + If :math:`v_{i,j}` is the 'i'th component of the vector representing document 'j', the l1 normalization is - >>> norm_l2 = NormModel(corpus) - >>> print(norm_l2[some_doc]) - >>> norm_l2.save('/tmp/foo.tfidf_model') + .. math:: l1_{i, j} = \\frac{v_{i,j}}{\sum_k |v_{k,j}|} - Model persistency is achieved via its load/save methods - """ + the l2 normalization is - def __init__(self, corpus=None, norm='l2'): - """ - Compute the 'l1' or 'l2' normalization by normalizing separately - for each doc in a corpus. - Formula for 'l1' norm for term 'i' in document 'j' in a corpus of 'D' documents is:: + .. math:: l2_{i, j} = \\frac{v_{i,j}}{\sqrt{\sum_k v_{k,j}^2}} - norml1_{i, j} = (i / sum(absolute(values in j))) - Formula for 'l2' norm for term 'i' in document 'j' in a corpus of 'D' documents is:: + Parameters + ---------- + corpus : iterable of iterable of (int, number), optional + Input corpus. + norm : {'l1', 'l2'}, optional + Norm used to normalize. - norml2_{i, j} = (i / sqrt(sum(square(values in j)))) """ self.norm = norm if corpus is not None: @@ -52,8 +44,13 @@ def __str__(self): return "NormModel(num_docs=%s, num_nnz=%s, norm=%s)" % (self.num_docs, self.num_nnz, self.norm) def calc_norm(self, corpus): - """ - Calculates the norm by calling matutils.unitvec with the norm parameter. + """Calculate the norm by calling :func:`~gensim.matutils.unitvec` with the norm parameter. + + Parameters + ---------- + corpus : iterable of iterable of (int, number) + Input corpus. + """ logger.info("Performing %s normalization...", self.norm) norms = [] @@ -68,8 +65,35 @@ def calc_norm(self, corpus): self.norms = norms def normalize(self, bow): + """Normalize a simple count representation. + + Parameters + ---------- + bow : list of (int, number) + Document in BoW format. + + Returns + ------- + list of (int, number) + Normalized document. + + + """ vector = matutils.unitvec(bow, self.norm) return vector def __getitem__(self, bow): + """Call the :func:`~gensim.models.normmodel.NormModel.normalize`. + + Parameters + ---------- + bow : list of (int, number) + Document in BoW format. + + Returns + ------- + list of (int, number) + Normalized document. + + """ return self.normalize(bow) From a1fd854cc5839561b28a3bda69164543f59d7bd1 Mon Sep 17 00:00:00 2001 From: Ming Li <14131823+minggli@users.noreply.github.com> Date: Thu, 11 Jan 2018 09:50:41 +0000 Subject: [PATCH 09/14] Fix docstrings for `gensim.models.logentropy_model` (#1803) * improve and correct documentation of models/logentropy_model * include fixes according to comments * implement fixes suggested * associate methods with examples. * fix minor typos * doc fix --- gensim/models/logentropy_model.py | 95 ++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 32 deletions(-) diff --git a/gensim/models/logentropy_model.py b/gensim/models/logentropy_model.py index 05f79ae3c2..9421c57546 100644 --- a/gensim/models/logentropy_model.py +++ b/gensim/models/logentropy_model.py @@ -3,52 +3,68 @@ # # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html +"""This module allows simple Bag of Words (BoW) represented corpus to be transformed into log entropy space. +It implements Log Entropy Model that produces entropy-weighted logarithmic term frequency representation. + +Empirical study by Lee et al. 2015 [1]_ suggests log entropy-weighted model yields better results among other forms of +representation. + +References +---------- +.. [1] Lee et al. 2005. An Empirical Evaluation of Models of Text Document Similarity. + https://escholarship.org/uc/item/48g155nq + +""" + import logging import math -from gensim import interfaces, matutils, utils +from gensim import interfaces, matutils, utils -logger = logging.getLogger('gensim.models.logentropy_model') +logger = logging.getLogger(__name__) class LogEntropyModel(interfaces.TransformationABC): - """ - Objects of this class realize the transformation between word-document - co-occurence matrix (integers) into a locally/globally weighted matrix - (positive floats). + """Objects of this class realize the transformation between word-document co-occurrence matrix (int) + into a locally/globally weighted matrix (positive floats). - This is done by a log entropy normalization, optionally normalizing the - resulting documents to unit length. The following formulas explain how - to compute the log entropy weight for term `i` in document `j`:: + This is done by a log entropy normalization, optionally normalizing the resulting documents to unit length. + The following formulas explain how o compute the log entropy weight for term :math:`i` in document :math:`j`: - local_weight_{i,j} = log(frequency_{i,j} + 1) + .. math:: - P_{i,j} = frequency_{i,j} / sum_j frequency_{i,j} + local\_weight_{i,j} = log(frequency_{i,j} + 1) - sum_j P_{i,j} * log(P_{i,j}) - global_weight_i = 1 + ---------------------------- - log(number_of_documents + 1) + P_{i,j} = \\frac{frequency_{i,j}}{\sum_j frequency_{i,j}} - final_weight_{i,j} = local_weight_{i,j} * global_weight_i + global\_weight_i = 1 + \\frac{\sum_j P_{i,j} * log(P_{i,j})}{log(number\_of\_documents + 1)} - The main methods are: + final\_weight_{i,j} = local\_weight_{i,j} * global\_weight_i - 1. constructor, which calculates the global weighting for all terms in - a corpus. - 2. the [] method, which transforms a simple count representation into the - log entropy normalized space. + Examples + -------- + >>> from gensim.models import LogEntropyModel + >>> from gensim.test.utils import common_texts + >>> from gensim.corpora import Dictionary + >>> + >>> dct = Dictionary(common_texts) # fit dictionary + >>> corpus = [dct.doc2bow(row) for row in common_texts] # convert to BoW format + >>> model = LogEntropyModel(corpus) # fit model + >>> vector = model[corpus[1]] # apply model to document - >>> log_ent = LogEntropyModel(corpus) - >>> print(log_ent[some_doc]) - >>> log_ent.save('/tmp/foo.log_ent_model') - - Model persistency is achieved via its load/save methods. """ def __init__(self, corpus, normalize=True): """ - `normalize` dictates whether the resulting vectors will be - set to unit length. + + Parameters + ---------- + corpus : iterable of iterable of (int, int) + Input corpus in BoW format. + normalize : bool, optional + If True, the resulted log entropy weighted vector will be normalized to length of 1, + If False - do nothing. + """ self.normalize = normalize self.n_docs = 0 @@ -61,9 +77,14 @@ def __str__(self): return "LogEntropyModel(n_docs=%s, n_words=%s)" % (self.n_docs, self.n_words) def initialize(self, corpus): - """ - Initialize internal statistics based on a training corpus. Called - automatically from the constructor. + """Calculates the global weighting for all terms in a given corpus and transforms the simple + count representation into the log entropy normalized space. + + Parameters + ---------- + corpus : iterable of iterable of (int, int) + Corpus is BoW format + """ logger.info("calculating counts") glob_freq = {} @@ -97,8 +118,18 @@ def initialize(self, corpus): self.entr[key] = 1 + self.entr[key] / math.log(self.n_docs + 1) def __getitem__(self, bow): - """ - Return log entropy representation of the input vector and/or corpus. + """Get log entropy representation of the input vector and/or corpus. + + Parameters + ---------- + bow : list of (int, int) + Document in BoW format. + + Returns + ------- + list of (int, float) + Log-entropy vector for passed `bow`. + """ # if the input vector is in fact a corpus, return a transformed corpus is_corpus, bow = utils.is_corpus(bow) From 4b8aebca6a302429a90e5713afc635b1bc35edb1 Mon Sep 17 00:00:00 2001 From: Cheuk Ting Ho Date: Thu, 11 Jan 2018 15:08:17 +0000 Subject: [PATCH 10/14] Fix docstrings for `gensim.matutils` (#1804) * numpy style documentation on matutils.py * doc fix[1] * doc fix[2] * doc fix[3] * doc fix[4] * doc fix[5] * doc fix[6] --- gensim/matutils.py | 760 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 624 insertions(+), 136 deletions(-) diff --git a/gensim/matutils.py b/gensim/matutils.py index b7ade1be9f..3b4dce9c4a 100644 --- a/gensim/matutils.py +++ b/gensim/matutils.py @@ -4,9 +4,7 @@ # Copyright (C) 2011 Radim Rehurek # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html -""" -This module contains math helper functions. -""" +"""This module contains math helper functions.""" from __future__ import with_statement @@ -28,18 +26,45 @@ from six.moves import xrange, zip as izip -def blas(name, ndarray): - return scipy.linalg.get_blas_funcs((name,), (ndarray,))[0] +logger = logging.getLogger(__name__) -logger = logging.getLogger(__name__) +def blas(name, ndarray): + """Helper for getting BLAS function, used :func:`scipy.linalg.get_blas_funcs`. + Parameters + ---------- + name : str + Name(s) of BLAS functions without type prefix. + ndarray : numpy.ndarray + Arrays can be given to determine optimal prefix of BLAS routines. + + Returns + ------- + fortran object + Fortran function for needed operation. -def argsort(x, topn=None, reverse=False): """ - Return indices of the `topn` smallest elements in array `x`, in ascending order. + return scipy.linalg.get_blas_funcs((name,), (ndarray,))[0] + - If reverse is True, return the greatest elements instead, in descending order. +def argsort(x, topn=None, reverse=False): + """Get indices of the `topn` smallest elements in array `x`. + + Parameters + ---------- + x : array_like + Array to sort. + topn : int, optional + Number of indices of the smallest(greatest) elements to be returned if given, + otherwise - indices of all elements will be returned in ascending(descending) order. + reverse : bool, optional + If True - return the `topn` greatest elements, in descending order. + + Returns + ------- + numpy.ndarray + Array of `topn` indices that.sort the array in the required order. """ x = np.asarray(x) # unify code path for when `x` is not a np array (list, tuple...) @@ -57,16 +82,38 @@ def argsort(x, topn=None, reverse=False): def corpus2csc(corpus, num_terms=None, dtype=np.float64, num_docs=None, num_nnz=None, printprogress=0): - """ - Convert a streamed corpus into a sparse matrix, in scipy.sparse.csc_matrix format, + """Convert a streamed corpus in BoW format into a sparse matrix `scipy.sparse.csc_matrix`, with documents as columns. + Notes + ----- If the number of terms, documents and non-zero elements is known, you can pass them here as parameters and a more memory efficient code path will be taken. - The input corpus may be a non-repeatable stream (generator). - - This is the mirror function to `Sparse2Corpus`. + Parameters + ---------- + corpus : iterable of iterable of (int, number) + Input corpus in BoW format + num_terms : int, optional + If provided, the `num_terms` attributes in the corpus will be ignored. + dtype : data-type, optional + Data type of output matrix. + num_docs : int, optional + If provided, the `num_docs` attributes in the corpus will be ignored. + num_nnz : int, optional + If provided, the `num_nnz` attributes in the corpus will be ignored. + printprogress : int, optional + Print progress for every `printprogress` number of documents, + If 0 - nothing will be printed. + + Returns + ------- + scipy.sparse.csc_matrix + Sparse matrix inferred based on `corpus`. + + See Also + -------- + :class:`~gensim.matutils.Sparse2Corpus` """ try: @@ -118,9 +165,22 @@ def corpus2csc(corpus, num_terms=None, dtype=np.float64, num_docs=None, num_nnz= def pad(mat, padrow, padcol): - """ - Add additional rows/columns to a np.matrix `mat`. The new rows/columns - will be initialized with zeros. + """Add additional rows/columns to `mat`. The new rows/columns will be initialized with zeros. + + Parameters + ---------- + mat : numpy.ndarray + Input 2D matrix + padrow : int + Number of additional rows + padcol : int + Number of additional columns + + Returns + ------- + numpy.matrixlib.defmatrix.matrix + Matrix with needed padding. + """ if padrow < 0: padrow = 0 @@ -134,7 +194,25 @@ def pad(mat, padrow, padcol): def zeros_aligned(shape, dtype, order='C', align=128): - """Like `np.zeros()`, but the array will be aligned at `align` byte boundary.""" + """Get array aligned at `align` byte boundary. + + Parameters + ---------- + shape : int or (int, int) + Shape of array. + dtype : data-type + Data type of array. + order : {'C', 'F'}, optional + Whether to store multidimensional data in C- or Fortran-contiguous (row- or column-wise) order in memory. + align : int, optional + Boundary for alignment in bytes. + + Returns + ------- + numpy.ndarray + Aligned array. + + """ nbytes = np.prod(shape, dtype=np.int64) * np.dtype(dtype).itemsize buffer = np.zeros(nbytes + align, dtype=np.uint8) # problematic on win64 ("maximum allowed dimension exceeded") start_index = -buffer.ctypes.data % align @@ -142,11 +220,38 @@ def zeros_aligned(shape, dtype, order='C', align=128): def ismatrix(m): + """Check does `m` numpy.ndarray or `scipy.sparse` matrix. + + Parameters + ---------- + m : object + Candidate for matrix + + Returns + ------- + bool + True if `m` is matrix, False otherwise. + + """ return isinstance(m, np.ndarray) and m.ndim == 2 or scipy.sparse.issparse(m) def any2sparse(vec, eps=1e-9): - """Convert a np/scipy vector into gensim document format (=list of 2-tuples).""" + """Convert a numpy.ndarray or `scipy.sparse` vector into gensim BoW format. + + Parameters + ---------- + vec : {`numpy.ndarray`, `scipy.sparse`} + Input vector + eps : float, optional + Value used for threshold, all coordinates less than `eps` will not be presented in result. + + Returns + ------- + list of (int, float) + Vector in BoW format. + + """ if isinstance(vec, np.ndarray): return dense2vec(vec, eps) if scipy.sparse.issparse(vec): @@ -155,8 +260,22 @@ def any2sparse(vec, eps=1e-9): def scipy2scipy_clipped(matrix, topn, eps=1e-9): - """ - Return a scipy.sparse vector/matrix consisting of 'topn' elements of the greatest magnitude (absolute value). + """Get a `scipy.sparse` vector / matrix consisting of 'topn' elements of the greatest magnitude (absolute value). + + Parameters + ---------- + matrix : `scipy.sparse` + Input vector / matrix. + topn : int + Number of greatest (by module) elements, that will be in result. + eps : float + PARAMETER IGNORED. + + Returns + ------- + `scipy.sparse.csr.csr_matrix` + Clipped matrix. + """ if not scipy.sparse.issparse(matrix): raise ValueError("'%s' is not a scipy sparse vector." % matrix) @@ -195,24 +314,43 @@ def scipy2scipy_clipped(matrix, topn, eps=1e-9): def scipy2sparse(vec, eps=1e-9): - """Convert a scipy.sparse vector into gensim document format (=list of 2-tuples).""" + """Convert a scipy.sparse vector BoW format. + + Parameters + ---------- + vec : `scipy.sparse` + Sparse vector + + eps : float, optional + Value used for threshold, all coordinates less than `eps` will not be presented in result. + + Returns + ------- + list of (int, float) + Vector in BoW format. + + """ vec = vec.tocsr() assert vec.shape[0] == 1 return [(int(pos), float(val)) for pos, val in zip(vec.indices, vec.data) if np.abs(val) > eps] class Scipy2Corpus(object): - """ - Convert a sequence of dense/sparse vectors into a streamed gensim corpus object. + """Convert a sequence of dense/sparse vectors into a streamed gensim corpus object. - This is the mirror function to `corpus2csc`. + See Also + -------- + :func:`~gensim.matutils.corpus2csc` """ def __init__(self, vecs): """ - `vecs` is a sequence of dense and/or sparse vectors, such as a 2d np array, - or a scipy.sparse.csc_matrix, or any sequence containing a mix of 1d np/scipy vectors. + + Parameters + ---------- + vecs : iterable of {`numpy.ndarray`, `scipy.sparse`} + Input vectors. """ self.vecs = vecs @@ -229,11 +367,23 @@ def __len__(self): def sparse2full(doc, length): - """ - Convert a document in sparse document format (=sequence of 2-tuples) into a dense - np array (of size `length`). + """Convert a document in BoW format into dense numpy array. + + Parameters + ---------- + doc : list of (int, number) + Document in BoW format + length : int + Length of result vector - This is the mirror function to `full2sparse`. + Returns + ------- + numpy.ndarray + Dense variant of `doc` vector. + + See Also + -------- + :func:`~gensim.matutils.full2sparse` """ result = np.zeros(length, dtype=np.float32) # fill with zeroes (default value) @@ -247,12 +397,23 @@ def sparse2full(doc, length): def full2sparse(vec, eps=1e-9): - """ - Convert a dense np array into the sparse document format (sequence of 2-tuples). + """Convert a dense array into the BoW format. + + Parameters + ---------- + vec : numpy.ndarray + Input dense vector + eps : float + Threshold value, if coordinate in `vec` < eps, this will not be presented in result. - Values of magnitude < `eps` are treated as zero (ignored). + Returns + ------- + list of (int, float) + BoW format of `vec`. - This is the mirror function to `sparse2full`. + See Also + -------- + :func:`~gensim.matutils.sparse2full` """ vec = np.asarray(vec, dtype=float) @@ -264,8 +425,25 @@ def full2sparse(vec, eps=1e-9): def full2sparse_clipped(vec, topn, eps=1e-9): - """ - Like `full2sparse`, but only return the `topn` elements of the greatest magnitude (abs). + """Like :func:`~gensim.matutils.full2sparse`, but only return the `topn` elements of the greatest magnitude (abs). + + Parameters + ---------- + vec : numpy.ndarray + Input dense vector + topn : int + Number of greatest (abs) elements that will be presented in result. + eps : float + Threshold value, if coordinate in `vec` < eps, this will not be presented in result. + + Returns + ------- + list of (int, float) + Clipped vector in BoW format. + + See Also + -------- + :func:`~gensim.matutils.full2sparse` """ # use np.argpartition/argsort and only form tuples that are actually returned. @@ -279,15 +457,27 @@ def full2sparse_clipped(vec, topn, eps=1e-9): def corpus2dense(corpus, num_terms, num_docs=None, dtype=np.float32): - """ - Convert corpus into a dense np array (documents will be columns). You - must supply the number of features `num_terms`, because dimensionality - cannot be deduced from the sparse vectors alone. - - You can optionally supply `num_docs` (=the corpus length) as well, so that - a more memory-efficient code path is taken. - - This is the mirror function to `Dense2Corpus`. + """Convert corpus into a dense numpy array (documents will be columns). + + Parameters + ---------- + corpus : iterable of iterable of (int, number) + Input corpus in BoW format. + num_terms : int + Number of terms in dictionary (will be used as size of output vector. + num_docs : int, optional + Number of documents in corpus. + dtype : data-type, optional + Data type of output matrix + + Returns + ------- + numpy.ndarray + Dense array that present `corpus`. + + See Also + -------- + :class:`~gensim.matutils.Dense2Corpus` """ if num_docs is not None: @@ -302,23 +492,43 @@ def corpus2dense(corpus, num_terms, num_docs=None, dtype=np.float32): class Dense2Corpus(object): - """ - Treat dense np array as a sparse, streamed gensim corpus. + """Treat dense numpy array as a streamed gensim corpus in BoW format. - No data copy is made (changes to the underlying matrix imply changes in the - corpus). + Notes + ----- + No data copy is made (changes to the underlying matrix imply changes in the corpus). - This is the mirror function to `corpus2dense`. + See Also + -------- + :func:`~gensim.matutils.corpus2dense` + :class:`~gensim.matutils.Sparse2Corpus` """ - def __init__(self, dense, documents_columns=True): + """ + + Parameters + ---------- + dense : numpy.ndarray + Corpus in dense format. + documents_columns : bool, optional + If True - documents will be column, rows otherwise. + + """ if documents_columns: self.dense = dense.T else: self.dense = dense def __iter__(self): + """Iterate over corpus + + Yields + ------ + list of (int, float) + Document in BoW format. + + """ for doc in self.dense: yield full2sparse(doc.flat) @@ -327,20 +537,39 @@ def __len__(self): class Sparse2Corpus(object): - """ - Convert a matrix in scipy.sparse format into a streaming gensim corpus. + """Convert a matrix in scipy.sparse format into a streaming gensim corpus. - This is the mirror function to `corpus2csc`. + See Also + -------- + :func:`~gensim.matutils.corpus2csc` + :class:`~gensim.matutils.Dense2Corpus` """ - def __init__(self, sparse, documents_columns=True): + """ + + Parameters + ---------- + sparse : `scipy.sparse` + Corpus scipy sparse format + documents_columns : bool, optional + If True - documents will be column, rows otherwise. + + """ if documents_columns: self.sparse = sparse.tocsc() else: self.sparse = sparse.tocsr().T # make sure shape[1]=number of docs (needed in len()) def __iter__(self): + """ + + Yields + ------ + list of (int, float) + Document in BoW format. + + """ for indprev, indnow in izip(self.sparse.indptr, self.sparse.indptr[1:]): yield list(zip(self.sparse.indices[indprev:indnow], self.sparse.data[indprev:indnow])) @@ -348,8 +577,18 @@ def __len__(self): return self.sparse.shape[1] def __getitem__(self, document_index): - """ - Return a single document in the corpus by its index (between 0 and `len(self)-1`). + """Get a single document in the corpus by its index. + + Parameters + ---------- + document_index : int + Index of document + + Returns + ------- + list of (int, number) + Document in BoW format. + """ indprev = self.sparse.indptr[document_index] indnow = self.sparse.indptr[document_index + 1] @@ -357,6 +596,19 @@ def __getitem__(self, document_index): def veclen(vec): + """Calculate length of vector + + Parameters + ---------- + vec : list of (int, number) + Input vector in BoW format. + + Returns + ------- + float + Length of `vec`. + + """ if len(vec) == 0: return 0.0 length = 1.0 * math.sqrt(sum(val**2 for _, val in vec)) @@ -365,6 +617,21 @@ def veclen(vec): def ret_normalized_vec(vec, length): + """Normalize vector. + + Parameters + ---------- + vec : list of (int, number) + Input vector in BoW format. + length : float + Length of vector + + Returns + ------- + list of (int, number) + Normalized vector in BoW format. + + """ if length != 1.0: return [(termid, val / length) for termid, val in vec] else: @@ -399,12 +666,24 @@ def ret_log_normalize_vec(vec, axis=1): def unitvec(vec, norm='l2'): - """ - Scale a vector to unit length. The only exception is the zero vector, which - is returned back unchanged. + """Scale a vector to unit length. + + Parameters + ---------- + vec : {numpy.ndarray, scipy.sparse, list of (int, float)} + Input vector in any format + norm : {'l1', 'l2'}, optional + Normalization that will be used. + + Returns + ------- + {numpy.ndarray, scipy.sparse, list of (int, float)} + Normalized vector in same format as `vec`. + + Notes + ----- + Zero-vector will be unchanged. - Output will be in the same format as input (i.e., gensim vector=>gensim vector, - or np array=>np array, scipy.sparse=>scipy.sparse). """ if norm not in ('l1', 'l2'): raise ValueError("'%s' is not a supported norm. Currently supported norms are 'l1' and 'l2'." % norm) @@ -447,9 +726,21 @@ def unitvec(vec, norm='l2'): def cossim(vec1, vec2): - """ - Return cosine similarity between two sparse vectors. + """Get cosine similarity between two sparse vectors. The similarity is a number between <-1.0, 1.0>, higher is more similar. + + Parameters + ---------- + vec1 : list of (int, float) + Vector in BoW format + vec2 : list of (int, float) + Vector in BoW format + + Returns + ------- + float + Cosine similarity between `vec1` and `vec2`. + """ vec1, vec2 = dict(vec1), dict(vec2) if not vec1 or not vec2: @@ -465,9 +756,18 @@ def cossim(vec1, vec2): def isbow(vec): - """ - Checks if vector passed is in bag of words representation or not. - Vec is considered to be in bag of words format if it is 2-tuple format. + """Checks if vector passed is in BoW format. + + Parameters + ---------- + vec : object + Input vector in any format + + Returns + ------- + bool + True if vector in BoW format, False otherwise. + """ if scipy.sparse.issparse(vec): vec = vec.todense().tolist() @@ -482,9 +782,22 @@ def isbow(vec): def convert_vec(vec1, vec2, num_features=None): - """ - Convert vectors to appropriate forms required by entropy input. - Checks for sparsity and bag of word format. + """Convert vectors to dense format + + Parameters + ---------- + vec1 : {scipy.sparse, list of (int, float)} + Input vector. + vec2 : {scipy.sparse, list of (int, float)} + Input vector. + num_features : int, optional + Number of features in vector. + + Returns + ------- + (numpy.ndarray, numpy.ndarray) + (`vec1`, `vec2`) in dense format. + """ if scipy.sparse.issparse(vec1): vec1 = vec1.toarray() @@ -511,20 +824,49 @@ def convert_vec(vec1, vec2, num_features=None): def kullback_leibler(vec1, vec2, num_features=None): - """ - A distance metric between two probability distributions. - Returns a distance value in range <0, +∞> where values closer to 0 mean less distance (and a higher similarity) - Uses the scipy.stats.entropy method to identify kullback_leibler convergence value. - If the distribution draws from a certain number of docs, that value must be passed. + """Calculate Kullback-Leibler distance between two probability distributions using `scipy.stats.entropy`. + + Parameters + ---------- + vec1 : {scipy.sparse, numpy.ndarray, list of (int, float)} + Distribution vector. + vec2 : {scipy.sparse, numpy.ndarray, list of (int, float)} + Distribution vector. + num_features : int, optional + Number of features in vector. + + Returns + ------- + float + Kullback-Leibler distance between `vec1` and `vec2`. + Value in range [0, +∞) where values closer to 0 mean less distance (and a higher similarity). + """ vec1, vec2 = convert_vec(vec1, vec2, num_features=num_features) return entropy(vec1, vec2) def jensen_shannon(vec1, vec2, num_features=None): - """ - A method of measuring the similarity between two probability distributions. - It is a symmetrized and finite version of the Kullback–Leibler divergence. + """Calculate Jensen-Shannon distance between two probability distributions using `scipy.stats.entropy`. + + Parameters + ---------- + vec1 : {scipy.sparse, numpy.ndarray, list of (int, float)} + Distribution vector. + vec2 : {scipy.sparse, numpy.ndarray, list of (int, float)} + Distribution vector. + num_features : int, optional + Number of features in vector. + + Returns + ------- + float + Jensen-Shannon distance between `vec1` and `vec2`. + + Notes + ----- + This is symmetric and finite "version" of :func:`gensim.matutils.kullback_leibler`. + """ vec1, vec2 = convert_vec(vec1, vec2, num_features=num_features) avg_vec = 0.5 * (vec1 + vec2) @@ -532,10 +874,21 @@ def jensen_shannon(vec1, vec2, num_features=None): def hellinger(vec1, vec2): - """ - Hellinger distance is a distance metric to quantify the similarity between two probability distributions. - Distance between distributions will be a number between <0,1>, where 0 is minimum distance (maximum similarity) - and 1 is maximum distance (minimum similarity). + """Calculate Hellinger distance between two probability distributions. + + Parameters + ---------- + vec1 : {scipy.sparse, numpy.ndarray, list of (int, float)} + Distribution vector. + vec2 : {scipy.sparse, numpy.ndarray, list of (int, float)} + Distribution vector. + + Returns + ------- + float + Hellinger distance between `vec1` and `vec2`. + Value in range [0, 1], where 0 is min distance (max similarity) and 1 is max distance (min similarity). + """ if scipy.sparse.issparse(vec1): vec1 = vec1.toarray() @@ -556,11 +909,20 @@ def hellinger(vec1, vec2): def jaccard(vec1, vec2): - """ - A distance metric between bags of words representation. - Returns 1 minus the intersection divided by union, where union is the sum of the size of the two bags. - If it is not a bag of words representation, the union and intersection is calculated in the traditional manner. - Returns a value in range <0,1> where values closer to 0 mean less distance and thus higher similarity. + """Calculate Jaccard distance between vectors. + + Parameters + ---------- + vec1 : {scipy.sparse, numpy.ndarray, list of (int, float)} + Distribution vector. + vec2 : {scipy.sparse, numpy.ndarray, list of (int, float)} + Distribution vector. + + Returns + ------- + float + Jaccard distance between `vec1` and `vec2`. + Value in range [0, 1], where 0 is min distance (max similarity) and 1 is max distance (min similarity). """ @@ -593,9 +955,20 @@ def jaccard(vec1, vec2): def jaccard_distance(set1, set2): - """ - Calculate a distance between set representation (1 minus the intersection divided by union). - Return a value in range <0, 1> where values closer to 0 mean smaller distance and thus higher similarity. + """Calculate Jaccard distance between two sets + + Parameters + ---------- + set1 : set + Input set. + set2 : set + Input set. + + Returns + ------- + float + Jaccard distance between `set1` and `set2`. + Value in range [0, 1], where 0 is min distance (max similarity) and 1 is max distance (min similarity). """ union_cardinality = len(set1 | set2) @@ -606,8 +979,18 @@ def jaccard_distance(set1, set2): def dirichlet_expectation(alpha): - """ - For a vector `theta~Dir(alpha)`, compute `E[log(theta)]`. + """For a vector :math:`\\theta \sim Dir(\\alpha)`, compute :math:`E[log \\theta]`. + + Parameters + ---------- + alpha : numpy.ndarray + Input vector or matrix. + + Returns + ------- + numpy.ndarray: + :math:`E[log \\theta]` + """ if len(alpha.shape) == 1: result = psi(alpha) - psi(np.sum(alpha)) @@ -617,11 +1000,23 @@ def dirichlet_expectation(alpha): def qr_destroy(la): - """ - Return QR decomposition of `la[0]`. Content of `la` gets destroyed in the process. + """Get QR decomposition of `la[0]`. + Notes + ----- Using this function should be less memory intense than calling `scipy.linalg.qr(la[0])`, because the memory used in `la[0]` is reclaimed earlier. + + + Returns + ------- + (numpy.ndarray, numpy.ndarray) + Matrices :math:`Q` and :math:`R`. + + Warnings + -------- + Content of `la` gets destroyed in the process. + """ a = np.asfortranarray(la[0]) del la[0], la # now `a` is the only reference to the input matrix @@ -645,24 +1040,31 @@ def qr_destroy(la): class MmWriter(object): - """ - Store a corpus in Matrix Market format. + """Store a corpus in Matrix Market format. - Note that the output is written one document at a time, not the whole - matrix at once (unlike scipy.io.mmread). This allows us to process corpora - which are larger than the available RAM. + Notes + ----- + Output is written one document at a time, not the whole matrix at once (unlike `scipy.io.mmread`). + This allows us to process corpora which are larger than the available RAM. - NOTE: the output file is created in a single pass through the input corpus, so - that the input can be a once-only stream (iterator). - To achieve this, a fake MM header is written first, statistics are collected - during the pass (shape of the matrix, number of non-zeroes), followed by a seek - back to the beginning of the file, rewriting the fake header with proper values. + The output file is created in a single pass through the input corpus, so that the input can be + a once-only stream (iterator). To achieve this, a fake MM header is written first, statistics are collected + during the pass (shape of the matrix, number of non-zeroes), followed by a seek back to the beginning of the file, + rewriting the fake header with proper values. """ HEADER_LINE = b'%%MatrixMarket matrix coordinate real general\n' # the only supported MM format def __init__(self, fname): + """ + + Parameters + ---------- + fname : str + Path to output file + + """ self.fname = fname if fname.endswith(".gz") or fname.endswith('.bz2'): raise NotImplementedError("compressed output not supported with MmWriter") @@ -670,6 +1072,18 @@ def __init__(self, fname): self.headers_written = False def write_headers(self, num_docs, num_terms, num_nnz): + """Write headers to file + + Parameters + ---------- + num_docs : int + Number of documents in corpus + num_terms : int + Number of term in corpus + num_nnz : int + Number of non-zero elements in corpus + + """ self.fout.write(MmWriter.HEADER_LINE) if num_nnz < 0: @@ -686,6 +1100,18 @@ def write_headers(self, num_docs, num_terms, num_nnz): self.headers_written = True def fake_headers(self, num_docs, num_terms, num_nnz): + """Write "fake" headers to file. + + Parameters + ---------- + num_docs : int + Number of documents in corpus + num_terms : int + Number of term in corpus + num_nnz : int + Number of non-zero elements in corpus + + """ stats = '%i %i %i' % (num_docs, num_terms, num_nnz) if len(stats) > 50: raise ValueError('Invalid stats: matrix too large!') @@ -693,10 +1119,20 @@ def fake_headers(self, num_docs, num_terms, num_nnz): self.fout.write(utils.to_utf8(stats)) def write_vector(self, docno, vector): - """ - Write a single sparse vector to the file. + """Write a single sparse vector to the file. + + Parameters + ---------- + docno : int + Number of document. + vector : list of (int, float) + Vector in BoW format. + + Returns + ------- + (int, int) + Max word index in vector and len of vector. If vector is empty, return (-1, 0). - Sparse vector is any iterable yielding (field id, field value) pairs. """ assert self.headers_written, "must write Matrix Market file headers before writing data!" assert self.last_docno < docno, "documents %i and %i not in sequential order!" % (self.last_docno, docno) @@ -709,11 +1145,36 @@ def write_vector(self, docno, vector): @staticmethod def write_corpus(fname, corpus, progress_cnt=1000, index=False, num_terms=None, metadata=False): - """ - Save the vector space representation of an entire corpus to disk. + """Save the corpus to disk in Matrix Market format. + + Parameters + ---------- + fname : str + Filename of the resulting file. + corpus : iterable of iterable of (int, float) + Corpus in Bow format + progress_cnt : int, optional + Print progress for every `progress_cnt` number of documents. + index : bool, optional + If True, the offsets will be return, otherwise return None. + num_terms : int, optional + If provided, the `num_terms` attributes in the corpus will be ignored. + metadata : bool, optional + If True, a metadata file will be generated. + + Returns + ------- + offsets : {list of int, None} + List of offsets or nothing. + + Notes + ----- + Documents are processed one at a time, so the whole corpus is allowed to be larger than the available RAM. + + See Also + -------- + :func:`~gensim.corpora.mmcorpus.MmCorpus.save_corpus` - Note that the documents are processed one at a time, so the whole corpus - is allowed to be larger than the available RAM. """ mw = MmWriter(fname) @@ -769,41 +1230,45 @@ def write_corpus(fname, corpus, progress_cnt=1000, index=False, num_terms=None, return offsets def __del__(self): - """ - Automatic destructor which closes the underlying file. + """Automatic destructor which closes the underlying file. + + Notes + ----- + There must be no circular references contained in the object for __del__ to work! + Closing the file explicitly via the close() method is preferred and safer. - There must be no circular references contained in the object for __del__ - to work! Closing the file explicitly via the close() method is preferred - and safer. """ self.close() # does nothing if called twice (on an already closed file), so no worries def close(self): + """Close file.""" logger.debug("closing %s", self.fname) if hasattr(self, 'fout'): self.fout.close() class MmReader(object): - """ - Wrap a term-document matrix on disk (in matrix-market format), and present it - as an object which supports iteration over the rows (~documents). + """Wrap a term-document matrix on disk (in matrix-market format), + and present it as an object which supports iteration over the rows (~documents). + + Notes + ------ + File is read into memory one document at a time, not the whole matrix at once (unlike `scipy.io.mmread`). + This allows us to process corpora which are larger than the available RAM. - Note that the file is read into memory one document at a time, not the whole - matrix at once (unlike scipy.io.mmread). This allows us to process corpora - which are larger than the available RAM. """ def __init__(self, input, transposed=True): """ - Initialize the matrix reader. - The `input` refers to a file on local filesystem, which is expected to - be in the sparse (coordinate) Matrix Market format. Documents are assumed - to be rows of the matrix (and document features are columns). + Parameters + ---------- + input : {str, file-like object} + Path to input file or file-like object (in Matrix Market format). + transposed : bool, optional + "Orientation" of document. By default, documents should be rows of the matrix, + otherwise, needed to set this to False - `input` is either a string (file path) or a file-like object that supports - `seek()` (e.g. gzip.GzipFile, bz2.BZ2File). File-like objects are not closed automatically. """ logger.info("initializing corpus reader from %s", input) self.input, self.transposed = input, transposed @@ -840,8 +1305,13 @@ def __str__(self): (self.num_docs, self.num_terms, self.num_nnz)) def skip_headers(self, input_file): - """ - Skip file headers that appear before the first document. + """Skip file headers that appear before the first document. + + Parameters + ---------- + input_file : file-like object + Opened file. + """ for line in input_file: if line.startswith(b'%'): @@ -849,14 +1319,20 @@ def skip_headers(self, input_file): break def __iter__(self): - """ - Iteratively yield vectors from the underlying file, in the format (row_no, vector), - where vector is a list of (col_no, value) 2-tuples. + """Iterate over all corpus. - Note that the total number of vectors returned is always equal to the + Yields + ------ + (prev_id, document) : (int, list of (int, number) + Number of document and document in BoW format. + + Notes + ----- + Total number of vectors returned is always equal to the number of rows specified in the header; empty documents are inserted and yielded where appropriate, even if they are not explicitly stored in the Matrix Market file. + """ with utils.file_or_filename(self.input) as lines: self.skip_headers(lines) @@ -895,7 +1371,19 @@ def __iter__(self): yield previd, [] def docbyoffset(self, offset): - """Return document at file offset `offset` (in bytes)""" + """Get document at file offset `offset` (in bytes) + + Parameters + ---------- + offset : int + Offset (in bytes). + + Returns + ------- + list of (int, number) + Document in BoW format, reached by `offset`. + + """ # empty documents are not stored explicitly in MM format, so the index marks # them with a special offset, -1. if offset == -1: From 4c2c6383f1bf1be89f3a6ed2d0e462e826159998 Mon Sep 17 00:00:00 2001 From: Samyak Jain Date: Thu, 11 Jan 2018 22:45:02 +0530 Subject: [PATCH 11/14] Fix formula in `gensim.summarization.bm25`. Fix #1828 (#1833) * bm25 scoring function updated * Fixes #1828 * Fixes #1828 * Fixes #1828 * Fixes #1828 * Fixes #1828 * Fixes #1828 , Tests added * Fixes #1828 , Tests added * Fixes #1828 , Tests Added * Fixes #1828 , Tests Added * Fixes #1828 , Tests Added * Fixes #1828 , Tests Added * Fixes #1828 --- gensim/summarization/bm25.py | 9 ++++--- gensim/test/test_BM25.py | 50 ++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 gensim/test/test_BM25.py diff --git a/gensim/summarization/bm25.py b/gensim/summarization/bm25.py index ec484949cf..3a2bf5bbf6 100644 --- a/gensim/summarization/bm25.py +++ b/gensim/summarization/bm25.py @@ -4,7 +4,7 @@ # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html """This module contains function of computing rank scores for documents in -corpus and helper class `BM25` used in calculations. Original alhorithm +corpus and helper class `BM25` used in calculations. Original algorithm descibed in [1]_, also you may check Wikipedia page [2]_. @@ -61,7 +61,8 @@ class BM25(object): Dictionary with terms frequencies for whole `corpus`. Words used as keys and frequencies as values. idf : dict Dictionary with inversed terms frequencies for whole `corpus`. Words used as keys and frequencies as values. - + doc_len : list of int + List of document lengths. """ def __init__(self, corpus): @@ -78,12 +79,14 @@ def __init__(self, corpus): self.f = [] self.df = {} self.idf = {} + self.doc_len = [] self.initialize() def initialize(self): """Calculates frequencies of terms in documents and in corpus. Also computes inverse document frequencies.""" for document in self.corpus: frequencies = {} + self.doc_len.append(len(document)) for word in document: if word not in frequencies: frequencies[word] = 0 @@ -122,7 +125,7 @@ def get_score(self, document, index, average_idf): continue idf = self.idf[word] if self.idf[word] >= 0 else EPSILON * average_idf score += (idf * self.f[index][word] * (PARAM_K1 + 1) - / (self.f[index][word] + PARAM_K1 * (1 - PARAM_B + PARAM_B * len(document) / self.avgdl))) + / (self.f[index][word] + PARAM_K1 * (1 - PARAM_B + PARAM_B * self.doc_len[index] / self.avgdl))) return score def get_scores(self, document, average_idf): diff --git a/gensim/test/test_BM25.py b/gensim/test/test_BM25.py new file mode 100644 index 0000000000..a96302e8c9 --- /dev/null +++ b/gensim/test/test_BM25.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2010 Radim Rehurek +# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html + +""" +Automated tests for checking transformation algorithms (the models package). +""" + +import logging +import unittest + +from gensim.summarization.bm25 import get_bm25_weights +from gensim.test.utils import common_texts + + +class TestBM25(unittest.TestCase): + def test_max_match_with_itself(self): + """ Document should show maximum matching with itself """ + weights = get_bm25_weights(common_texts) + for index, doc_weights in enumerate(weights): + expected = max(doc_weights) + predicted = doc_weights[index] + self.assertAlmostEqual(expected, predicted) + + def test_nonnegative_weights(self): + """ All the weights for a partiular document should be non negative """ + weights = get_bm25_weights(common_texts) + for doc_weights in weights: + for weight in doc_weights: + self.assertTrue(weight >= 0.) + + def test_same_match_with_same_document(self): + """ A document should always get the same weight when matched with a particular document """ + corpus = [['cat', 'dog', 'mouse'], ['cat', 'lion'], ['cat', 'lion']] + weights = get_bm25_weights(corpus) + self.assertAlmostEqual(weights[0][1], weights[0][2]) + + def test_disjoint_docs_if_weight_zero(self): + """ Two disjoint documents should have zero matching""" + corpus = [['cat', 'dog', 'lion'], ['goat', 'fish', 'tiger']] + weights = get_bm25_weights(corpus) + self.assertAlmostEqual(weights[0][1], 0) + self.assertAlmostEqual(weights[1][0], 0) + + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + unittest.main() From 1648ac2e4299ccdfde2ac1b535faf2c5eaf6c022 Mon Sep 17 00:00:00 2001 From: Stergiadis Manos Date: Thu, 11 Jan 2018 18:52:10 +0100 Subject: [PATCH 12/14] Refactor tests for `gensim.corpora.WikiCorpus`(#1821) * minor style refactoring and comment fixes in accordance to PEP8 * Created test data in legitimate compressed XML format (.xml.bz2) for the WikiCorpus class. * Used the same raw data found for other sources (9 articles). * Added Various wiki markup to test the parsing regural expressions * Added test class for the WikiCorpus source. * Following the same inheritance schema as in the source TestWikiCorpus > TestTextCorpus > CorpusTestCase. * Testing methods are overriden where necessary to reflect logic changes. * All existing functionality is tested (account for markup handling, minimum article length etc) * Fix python 3 compatibility for generator next method * code review corrections * Moved WikiCorpus tests from test/test_wikicorpus.py into its class within the test_corpora.py file. * Adapted all old tests to the new class * Current Test class schema ensures that WikiCorpus also passes tests defined in parents * Deleted test_wikicorpus.py since it is now redundant * Discarded the empty input test for the WikiCorpus since an empty file is not legitimate XML * Added 2 more tests --- gensim/corpora/wikicorpus.py | 14 +- gensim/test/test_corpora.py | 167 ++++++++++++++++++++++- gensim/test/test_data/testcorpus.xml.bz2 | Bin 0 -> 1404 bytes gensim/test/test_wikicorpus.py | 135 ------------------ 4 files changed, 172 insertions(+), 144 deletions(-) create mode 100644 gensim/test/test_data/testcorpus.xml.bz2 delete mode 100644 gensim/test/test_wikicorpus.py diff --git a/gensim/corpora/wikicorpus.py b/gensim/corpora/wikicorpus.py index 0c1c229bac..7148b90884 100755 --- a/gensim/corpora/wikicorpus.py +++ b/gensim/corpora/wikicorpus.py @@ -3,6 +3,7 @@ # # Copyright (C) 2010 Radim Rehurek # Copyright (C) 2012 Lars Buitinck +# Copyright (C) 2018 Emmanouil Stergiadis # Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html @@ -56,8 +57,8 @@ RE_P12 = re.compile(r'\n(({\|)|(\|-)|(\|}))(.*?)(?=\n)', re.UNICODE) # table formatting RE_P13 = re.compile(r'\n(\||\!)(.*?\|)*([^|]*?)', re.UNICODE) # table cell formatting RE_P14 = re.compile(r'\[\[Category:[^][]*\]\]', re.UNICODE) # categories -# Remove File and Image template -RE_P15 = re.compile(r'\[\[([fF]ile:|[iI]mage)[^]]*(\]\])', re.UNICODE) +RE_P15 = re.compile(r'\[\[([fF]ile:|[iI]mage)[^]]*(\]\])', re.UNICODE) # Remove File and Image template + # MediaWiki namespaces (https://www.mediawiki.org/wiki/Manual:Namespace) that # ought to be ignored @@ -332,11 +333,7 @@ def __init__(self, fname, processes=None, lemmatize=utils.has_pattern(), diction self.token_min_len = token_min_len self.token_max_len = token_max_len self.lower = lower - - if dictionary is None: - self.dictionary = Dictionary(self.get_texts()) - else: - self.dictionary = dictionary + self.dictionary = dictionary or Dictionary(self.get_texts()) def get_texts(self): """ @@ -344,7 +341,7 @@ def get_texts(self): of tokens. Only articles of sufficient length are returned (short articles & redirects - etc are ignored). This is control by `article_min_tokens` on the class instance. + etc are ignored). This is controlled by `article_min_tokens` on the class instance. Note that this iterates over the **texts**; if you want vectors, just use the standard corpus interface instead of this function:: @@ -380,6 +377,7 @@ def get_texts(self): yield (tokens, (pageid, title)) else: yield tokens + except KeyboardInterrupt: logger.warn( "user terminated iteration over Wikipedia corpus after %i documents with %i positions " diff --git a/gensim/test/test_corpora.py b/gensim/test/test_corpora.py index 4ddc16e0cf..f330dbd271 100644 --- a/gensim/test/test_corpora.py +++ b/gensim/test/test_corpora.py @@ -20,7 +20,7 @@ import numpy as np from gensim.corpora import (bleicorpus, mmcorpus, lowcorpus, svmlightcorpus, - ucicorpus, malletcorpus, textcorpus, indexedcorpus) + ucicorpus, malletcorpus, textcorpus, indexedcorpus, wikicorpus) from gensim.interfaces import TransformedCorpus from gensim.utils import to_unicode from gensim.test.utils import datapath, get_tmpfile @@ -400,6 +400,171 @@ def test_indexing(self): pass +# Needed for the test_custom_tokenizer is the TestWikiCorpus class. +# Cannot be nested due to serializing. +def custom_tokenizer(content, token_min_len=2, token_max_len=15, lower=True): + return [ + to_unicode(token.lower()) if lower else to_unicode(token) for token in content.split() + if token_min_len <= len(token) <= token_max_len and not token.startswith('_') + ] + + +class TestWikiCorpus(TestTextCorpus): + def setUp(self): + self.corpus_class = wikicorpus.WikiCorpus + self.file_extension = '.xml.bz2' + self.fname = datapath('testcorpus.' + self.file_extension.lstrip('.')) + self.enwiki = datapath('enwiki-latest-pages-articles1.xml-p000000010p000030302-shortened.bz2') + + def test_default_preprocessing(self): + expected = ['computer', 'human', 'interface'] + corpus = self.corpus_class(self.fname, article_min_tokens=0) + first_text = next(corpus.get_texts()) + self.assertEqual(expected, first_text) + + def test_len(self): + # When there is no min_token limit all 9 articles must be registered. + corpus = self.corpus_class(self.fname, article_min_tokens=0) + all_articles = corpus.get_texts() + assert (len(list(all_articles)) == 9) + + # With a huge min_token limit, all articles should be filtered out. + corpus = self.corpus_class(self.fname, article_min_tokens=100000) + all_articles = corpus.get_texts() + assert (len(list(all_articles)) == 0) + + def test_load_with_metadata(self): + corpus = self.corpus_class(self.fname, article_min_tokens=0) + corpus.metadata = True + self.assertEqual(len(corpus), 9) + + docs = list(corpus) + self.assertEqual(len(docs), 9) + + for i, docmeta in enumerate(docs): + doc, metadata = docmeta + article_no = i + 1 # Counting IDs from 1 + self.assertEqual(metadata[0], str(article_no)) + self.assertEqual(metadata[1], 'Article%d' % article_no) + + def test_load(self): + corpus = self.corpus_class(self.fname, article_min_tokens=0) + + docs = list(corpus) + # the deerwester corpus always has nine documents + self.assertEqual(len(docs), 9) + + def test_first_element(self): + """ + First two articles in this sample are + 1) anarchism + 2) autism + """ + corpus = self.corpus_class(self.enwiki, processes=1) + + texts = corpus.get_texts() + self.assertTrue(u'anarchism' in next(texts)) + self.assertTrue(u'autism' in next(texts)) + + def test_unicode_element(self): + """ + First unicode article in this sample is + 1) папа + """ + bgwiki = datapath('bgwiki-latest-pages-articles-shortened.xml.bz2') + corpus = self.corpus_class(bgwiki) + texts = corpus.get_texts() + self.assertTrue(u'папа' in next(texts)) + + def test_custom_tokenizer(self): + """ + define a custom tokenizer function and use it + """ + wc = self.corpus_class(self.enwiki, processes=1, lemmatize=False, tokenizer_func=custom_tokenizer, + token_max_len=16, token_min_len=1, lower=False) + row = wc.get_texts() + list_tokens = next(row) + self.assertTrue(u'Anarchism' in list_tokens) + self.assertTrue(u'collectivization' in list_tokens) + self.assertTrue(u'a' in list_tokens) + self.assertTrue(u'i.e.' in list_tokens) + + def test_lower_case_set_true(self): + """ + Set the parameter lower to True and check that upper case 'Anarchism' token doesnt exist + """ + corpus = self.corpus_class(self.enwiki, processes=1, lower=True, lemmatize=False) + row = corpus.get_texts() + list_tokens = next(row) + self.assertTrue(u'Anarchism' not in list_tokens) + self.assertTrue(u'anarchism' in list_tokens) + + def test_lower_case_set_false(self): + """ + Set the parameter lower to False and check that upper case Anarchism' token exists + """ + corpus = self.corpus_class(self.enwiki, processes=1, lower=False, lemmatize=False) + row = corpus.get_texts() + list_tokens = next(row) + self.assertTrue(u'Anarchism' in list_tokens) + self.assertTrue(u'anarchism' in list_tokens) + + def test_min_token_len_not_set(self): + """ + Don't set the parameter token_min_len and check that 'a' as a token doesn't exist + Default token_min_len=2 + """ + corpus = self.corpus_class(self.enwiki, processes=1, lemmatize=False) + self.assertTrue(u'a' not in next(corpus.get_texts())) + + def test_min_token_len_set(self): + """ + Set the parameter token_min_len to 1 and check that 'a' as a token exists + """ + corpus = self.corpus_class(self.enwiki, processes=1, token_min_len=1, lemmatize=False) + self.assertTrue(u'a' in next(corpus.get_texts())) + + def test_max_token_len_not_set(self): + """ + Don't set the parameter token_max_len and check that 'collectivisation' as a token doesn't exist + Default token_max_len=15 + """ + corpus = self.corpus_class(self.enwiki, processes=1, lemmatize=False) + self.assertTrue(u'collectivization' not in next(corpus.get_texts())) + + def test_max_token_len_set(self): + """ + Set the parameter token_max_len to 16 and check that 'collectivisation' as a token exists + """ + corpus = self.corpus_class(self.enwiki, processes=1, token_max_len=16, lemmatize=False) + self.assertTrue(u'collectivization' in next(corpus.get_texts())) + + # #TODO: sporadic failure to be investigated + # def test_get_texts_returns_generator_of_lists(self): + # corpus = self.corpus_class(self.enwiki) + # l = corpus.get_texts() + # self.assertEqual(type(l), types.GeneratorType) + # first = next(l) + # self.assertEqual(type(first), list) + # self.assertTrue(isinstance(first[0], bytes) or isinstance(first[0], str)) + + def test_sample_text(self): + # Cannot instantiate WikiCorpus from lines + pass + + def test_sample_text_length(self): + # Cannot instantiate WikiCorpus from lines + pass + + def test_sample_text_seed(self): + # Cannot instantiate WikiCorpus from lines + pass + + def test_empty_input(self): + # An empty file is not legit XML + pass + + class TestTextDirectoryCorpus(unittest.TestCase): def write_one_level(self, *args): diff --git a/gensim/test/test_data/testcorpus.xml.bz2 b/gensim/test/test_data/testcorpus.xml.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..064b9ad1e9c9704d9e1204a4c4691f8561a400bd GIT binary patch literal 1404 zcmV-?1%vuRT4*^jL0KkKSqzed&j1DL-+)vyQHTHkKgM3#zyJUAU4Gj$#fso@SO*Fz}WDE$z(Sk68 zMwkE)<0efs!enF&2*lBXFoQ;z01)FQO*Fz}WDE$z(Sk68MwkE)DoB$EO#?=a2xT;7 zGb#F0LrjlQdYeh36Bz<(Lm3e#&-!k&=Tp-HOoS6EkR?Qf*$PENmp)I9F(u*he803X z!x;bw2*R^}EGr^u$&i2u2Xv7g3{{T|CXBQdIuIQxg;0fZNk3qSL=atevLnwj${+}( ztdyV(!vF#^THHEPFA%78@}kN}xJ*8abXoO>PrWTv_GF3?9e>r*2UOt=OE5h{({_w%&4;X!r^ux*; zHf_zn3-@yD$`+VL9FVm7Axxp9Emwtoyq>QFKR9QO-8g3qA<2Q=454hHhTd3LR-BpZ z)6t2-86zvh9BLG(c}UI}>xNc_ta%}vI73xK9(ZfZ98s#!!wXW-!wz_C*N$BgfT|#H(Q&htFN=Bp`1MVVgEZiJ<6v| zYOcEX()I1Gx_b1sb&W06_VI_V9Z(jTlw~xXbo#<6UlA%-iLcLcc zSsbvmEeeILWGWa#jN?G-eRTrZ@47&M~LsFki2DjQ+_A-*4lKg=lerwCWhquEdO^!)f> zpE!P2k)zHZjsBQa;Hmy$P0-sdGTHl~sT#@qT7CzYk52yBYK9&ftLj753rp1fVf|PH zbHnC&KI{t9zq=jXq-KB+XR6kq zR5rG?L(0<{!WLRJ~zLK#Eo2<+^IK~VGPKVIq8qc^5~Q1?TZ(B{eHUJ;=mqoywUp_Kkxklznmd^(|< zWM+moLg;_EcCNo#3ncsDcyuoD&4=*4m+ -# Licensed under the GNU LGPL v2.1 - http://www.gnu.org/licenses/lgpl.html - -""" -Automated tests for checking the WikiCorpus -""" - - -import logging -import unittest - -from gensim.corpora.wikicorpus import WikiCorpus -from gensim import utils -from gensim.test.utils import datapath - -FILENAME = 'enwiki-latest-pages-articles1.xml-p000000010p000030302-shortened.bz2' -FILENAME_U = 'bgwiki-latest-pages-articles-shortened.xml.bz2' - -logger = logging.getLogger(__name__) - - -def custom_tokeiner(content, token_min_len=2, token_max_len=15, lower=True): - return [ - utils.to_unicode(token.lower()) if lower else utils.to_unicode(token) for token in content.split() - if token_min_len <= len(token) <= token_max_len and not token.startswith('_') - ] - - -class TestWikiCorpus(unittest.TestCase): - - # #TODO: sporadic failure to be investigated - # def test_get_texts_returns_generator_of_lists(self): - # logger.debug("Current Python Version is %s", str(sys.version_info)) - # if sys.version_info < (2, 7, 0): - # return - # - # wc = WikiCorpus(datapath(FILENAME)) - # l = wc.get_texts() - # self.assertEqual(type(l), types.GeneratorType) - # first = next(l) - # self.assertEqual(type(first), list) - # self.assertTrue(isinstance(first[0], bytes) or isinstance(first[0], str)) - - def test_first_element(self): - """ - First two articles in this sample are - 1) anarchism - 2) autism - """ - wc = WikiCorpus(datapath(FILENAME), processes=1) - - texts = wc.get_texts() - self.assertTrue(u'anarchism' in next(texts)) - self.assertTrue(u'autism' in next(texts)) - - def test_unicode_element(self): - """ - First unicode article in this sample is - 1) папа - """ - wc = WikiCorpus(datapath(FILENAME_U), processes=1) - - texts = wc.get_texts() - self.assertTrue(u'папа' in next(texts)) - - def test_lower_case_set_true(self): - """ - set the parameter lower to True and check that upper case 'Anarchism' token doesnt exist - """ - wc = WikiCorpus(datapath(FILENAME), processes=1, lower=True, lemmatize=False) - row = wc.get_texts() - list_tokens = next(row) - self.assertTrue(u'Anarchism' not in list_tokens) - self.assertTrue(u'anarchism' in list_tokens) - - def test_lower_case_set_false(self): - """ - set the parameter lower to False and check that upper case Anarchism' token exist - """ - wc = WikiCorpus(datapath(FILENAME), processes=1, lower=False, lemmatize=False) - row = wc.get_texts() - list_tokens = next(row) - self.assertTrue(u'Anarchism' in list_tokens) - self.assertTrue(u'anarchism' in list_tokens) - - def test_min_token_len_not_set(self): - """ - don't set the parameter token_min_len and check that 'a' as a token doesn't exists - default token_min_len=2 - """ - wc = WikiCorpus(datapath(FILENAME), processes=1, lemmatize=False) - self.assertTrue(u'a' not in next(wc.get_texts())) - - def test_min_token_len_set(self): - """ - set the parameter token_min_len to 1 and check that 'a' as a token exists - """ - wc = WikiCorpus(datapath(FILENAME), processes=1, token_min_len=1, lemmatize=False) - self.assertTrue(u'a' in next(wc.get_texts())) - - def test_max_token_len_not_set(self): - """ - don't set the parameter token_max_len and check that 'collectivisation' as a token doesn't exists - default token_max_len=15 - """ - wc = WikiCorpus(datapath(FILENAME), processes=1, lemmatize=False) - self.assertTrue(u'collectivization' not in next(wc.get_texts())) - - def test_max_token_len_set(self): - """ - set the parameter token_max_len to 16 and check that 'collectivisation' as a token exists - """ - wc = WikiCorpus(datapath(FILENAME), processes=1, token_max_len=16, lemmatize=False) - self.assertTrue(u'collectivization' in next(wc.get_texts())) - - def test_custom_tokenizer(self): - """ - define a custom tokenizer function and use it - """ - wc = WikiCorpus(datapath(FILENAME), processes=1, lemmatize=False, tokenizer_func=custom_tokeiner, - token_max_len=16, token_min_len=1, lower=False) - row = wc.get_texts() - list_tokens = next(row) - self.assertTrue(u'Anarchism' in list_tokens) - self.assertTrue(u'collectivization' in list_tokens) - self.assertTrue(u'a' in list_tokens) - self.assertTrue(u'i.e.' in list_tokens) - - -if __name__ == '__main__': - logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.DEBUG) - unittest.main() From 4b8a1c0f6439e6acfabb4419d8f4f8842e284106 Mon Sep 17 00:00:00 2001 From: Samyak Jain Date: Fri, 12 Jan 2018 11:31:14 +0530 Subject: [PATCH 13/14] Fix parameter setting for `FastText.train`. Fix #1818 (#1837) * bm25 scoring function updated * Fixes #1828 * Fixes #1828 * Fixes #1828 * Fixes #1828 * Fixes #1828 * Fixes #1828 , Tests added * Fixes #1828 , Tests added * Fixes #1828 , Tests Added * Fixes #1828 , Tests Added * Fixes #1828 , Tests Added * Fixes #1828 , Tests Added * Fixes #1828 * Function Parameters corrected , Fixes #1818 * add missing params + add supercall --- gensim/models/fasttext.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gensim/models/fasttext.py b/gensim/models/fasttext.py index 2210c4e0ed..b52b8ecbde 100644 --- a/gensim/models/fasttext.py +++ b/gensim/models/fasttext.py @@ -528,9 +528,10 @@ def train(self, sentences, total_examples=None, total_words=None, self.neg_labels = zeros(self.negative + 1) self.neg_labels[0] = 1. - Word2Vec.train( - self, sentences, total_examples=self.corpus_count, epochs=self.iter, - start_alpha=self.alpha, end_alpha=self.min_alpha) + super(FastText, self).train( + sentences, total_examples=total_examples, total_words=total_words, epochs=epochs, start_alpha=start_alpha, + end_alpha=end_alpha, word_count=word_count, queue_factor=queue_factor, report_delay=report_delay + ) self.get_vocab_word_vecs() def __getitem__(self, word): From 525f3c32855e884e69d9580930394163738200fa Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Fri, 12 Jan 2018 04:42:14 -0500 Subject: [PATCH 14/14] Fix positional params used for `gensim.models.CoherenceModel` in `gensim.models.callbacks` (#1823) * add keyword params for call to gensim.models.CoherenceModel as positional arguments for coherence and topn were incorrect due to skipping param for keyed_vectors * Fix PEP8 --- gensim/models/callbacks.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gensim/models/callbacks.py b/gensim/models/callbacks.py index 824b9b0e1d..9f098abe79 100644 --- a/gensim/models/callbacks.py +++ b/gensim/models/callbacks.py @@ -98,10 +98,13 @@ def get_value(self, **kwargs): self.model = None self.topics = None super(CoherenceMetric, self).set_parameters(**kwargs) + cm = gensim.models.CoherenceModel( - self.model, self.topics, self.texts, self.corpus, self.dictionary, - self.window_size, self.coherence, self.topn + model=self.model, topics=self.topics, texts=self.texts, corpus=self.corpus, + dictionary=self.dictionary, window_size=self.window_size, + coherence=self.coherence, topn=self.topn ) + return cm.get_coherence()