对于任何两个单词,如果存在某种基于分类法/语义字段的关系,我想了解一下。例如,考虑到"Dog“和"Cat”这两个词,我希望有一个模型可以返回"Dog“和"Cat”匹配的单词,例如,这个模型将返回的一些单词可能是“动物”、“哺乳动物”、“宠物”等等。
是否有一个开放源码的预先培训的模型,可以做到这一点,不需要事先培训数据集?
发布于 2020-11-05 22:10:42
听起来,WordNet很适合这个任务。WordNet是一个词汇数据库,它像分类法一样将单词组织在层次树结构中,并包含许多单词的附加语义信息。参见这里是“猫”的WordNet,以获得基于浏览器的演示。一个单词在另一个单词之上的一个层次级别就是所谓的“hypernym”。猫的超自然现象是“猫”。使用NLTK中的WordNet,您可以得到两个单词的超限,直到得到相同的超级词为止。
对于“猫”和“狗”,常见的超自然现象是“动物”。参见这里的示例代码:
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'在您的问题中,您需要一个机器学习解决方案。一种经典的方法是通过 根西姆实现单词向量,但它们不会根据专家创建的数据库(如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)]https://stackoverflow.com/questions/64704461
复制相似问题