WordNet 之类的声音非常适合这项任务。 WordNet 是一个词汇数据库,它以分层树结构(如分类法)组织单词,并包含许多单词的附加语义信息。参见例如WordNet for "cat" here 用于基于浏览器的演示。比另一个词高一个层次的词是所谓的“上位词”。 cat 的上位词是例如'猫'。使用WordNet in NLTK,您可以获得两个单词的上位词,直到获得相同的上位词。
对于“猫”和“狗”,常用的上位词是“动物”。在此处查看示例代码:
from nltk.corpus import wordnet as wn
wn.synsets('cat')
# output: [Synset('cat.n.01'), Synset('guy.n.01'), Synset('cat.n.03'), Synset('kat.n.01'), Synset('cat-o'-nine-tails.n.01'), Synset('caterpillar.n.02'), ...]
wn.synset('cat.n.01').hypernyms()
# output: [Synset('feline.n.01')]
wn.synset('feline.n.01').hypernyms()
wn.synset('carnivore.n.01').hypernyms()
wn.synset('placental.n.01').hypernyms()
wn.synset('mammal.n.01').hypernyms()
wn.synset('vertebrate.n.01').hypernyms()
wn.synset('chordate.n.01').hypernyms()
# output: 'animal'
wn.synsets('dog')
# output: [Synset('dog.n.01'), Synset('frump.n.01'), Synset('dog.n.03'), Synset('cad.n.01'), Synset('pawl.n.01'), Synset('chase.v.01')]
wn.synset('dog.n.01').hypernyms()
wn.synset('domestic_animal.n.01').hypernyms()
# output: 'animal'
您在问题中要求机器学习解决方案。经典的方法是通过Gensim 的词向量,但它们不会根据专家创建的数据库(如 WordNet)为您提供明确的常见类别,而只会为您提供接下来经常出现的词到训练数据中的目标词(“猫”、“狗”)。我认为机器学习不一定是这里最好的工具。
见例子:
import gensim.downloader as api
model_glove = api.load("glove-wiki-gigaword-100")
model_glove.most_similar(positive=["dog", "cat"], negative=None, topn=10)
# output: [('dogs', 0.7998143434524536),
('pet', 0.7550237774848938),
('puppy', 0.7239114046096802),
('rabbit', 0.7165164351463318),
('cats', 0.7114559412002563),
('monkey', 0.6967265605926514),
('horse', 0.6890867948532104),
('animal', 0.6713783740997314),
('mouse', 0.6644925475120544),
('boy', 0.6607726812362671)]