Python 是否有一个「;是一种;NLTK中的功能?

Python 是否有一个「;是一种;NLTK中的功能?,python,nlp,nltk,Python,Nlp,Nltk,我试图使用NLTK捕捉对象的一般类的出现。例如,鳟鱼和鲱鱼是鱼的类型,鹰和麻雀是鸟的类型。NLTK(或任何其他库)中是否有任何功能可以帮助我做到这一点 我不是在寻找同义词,因为它们只是表达同一事物的另一种方式。。。例如,使用wordnet.synsets我得到了以下“sparrow”的同义词: “树篱麻雀”、“邓诺克”、“夏枯草”、“麻雀”、“真麻雀” 对于“鸟”的同义词,我得到: “娃娃”、“鼻涕”、“裙子”、“观鸟”、“小鸡”、“嘶嘶声”、“呜呜声”、“覆盆子”、“小鸟”、“布朗克斯乔伊”、

我试图使用NLTK捕捉对象的一般类的出现。例如,
鳟鱼
鲱鱼
的类型,
麻雀
的类型。NLTK(或任何其他库)中是否有任何功能可以帮助我做到这一点

我不是在寻找同义词,因为它们只是表达同一事物的另一种方式。。。例如,使用
wordnet.synsets
我得到了以下“sparrow”的同义词:

“树篱麻雀”、“邓诺克”、“夏枯草”、“麻雀”、“真麻雀”

对于“鸟”的同义词,我得到:

“娃娃”、“鼻涕”、“裙子”、“观鸟”、“小鸡”、“嘶嘶声”、“呜呜声”、“覆盆子”、“小鸟”、“布朗克斯乔伊”、“嘘声”、“羽毛球”、“剃须刀”、“小鸟”、“梭子”、“丫头”、“家禽”、“爵士”、“拉兹”


我正在寻找一种方式来说明
sparrow
是一种

我找到了一种粗略的解决方法,可以在这段时间内使用,但如果有更好的方法,我仍然希望能得到任何帮助

原来有一个同义词
path\u similarity()
函数,它给出了两个wordnet同义词之间的相似性。我编写了一个函数来查找两个项目的所有同义词组合之间的相似性,并获得了最高的相似性值。我必须设置一个相似性阈值,上面可以考虑一种类型的另一种东西。
from nltk.corpus import wordnet

def getSimilarity(thing1, thing2):
    similarity = []
    for syn1 in wordnet.synsets(thing1):
        for syn2 in wordnet.synsets(thing2):
            sim = syn1.path_similarity(syn2)
            if sim:
                similarity.append(sim)
    return max(similarity)

print('fish<->fish similarity: {}'.format(getSimilarity('fish', 'fish')))
print('fish<->trout similarity: {}'.format(getSimilarity('fish', 'trout')))
print('fish<->herring similarity: {}'.format(getSimilarity('fish', 'herring')))
print('fish<->cat similarity: {}'.format(getSimilarity('fish', 'cat')))
print('fish<->dog similarity: {}'.format(getSimilarity('fish', 'dog')))
print('..........')
print('bird<->bird similarity: {}'.format(getSimilarity('bird', 'bird')))
print('bird<->sparrow similarity: {}'.format(getSimilarity('bird', 'sparrow')))
print('bird<->eagle similarity: {}'.format(getSimilarity('bird', 'eagle')))
print('bird<->cat similarity: {}'.format(getSimilarity('bird', 'cat')))
print('bird<->fish similarity: {}'.format(getSimilarity('bird', 'fish')))
从nltk.corpus导入wordnet
def getSimilarity(thing1,thing2):
相似性=[]
对于wordnet.synsets(thing1)中的syn1:
对于wordnet.synsets(thing2)中的syn2:
sim=syn1.路径相似性(syn2)
如果sim卡:
相似性追加(sim)
返回最大值(相似性)
打印('fishfish-similarity:{}'。格式(getSimilarity('fish','fish'))
打印('fishtrout相似度:{}'。格式(getSimilarity('fish','trout'))
打印('fishherring-similarity:{}'。格式(getSimilarity('fish','herring'))
打印('fishcat相似度:{}'。格式(getSimilarity('fish','cat'))
打印('fishdog similarity:{}'。格式(getSimilarity('fish','dog'))
打印(“……”)
打印('birdbird similarity:{}'。格式(getSimilarity('bird','bird'))
打印('birdsparrow similarity:{}'。格式(getSimilarity('bird','sparrow'))
打印('birdeagle similarity:{}'。格式(getSimilarity('bird','eagle'))
打印('birdcatsimilarity:{}'。格式(getSimilarity('bird','cat'))
打印('birdfish similarity:{}'。格式(getSimilarity('bird','fish'))
输出:

fish<->fish similarity: 1.0
fish<->trout similarity: 0.5
fish<->herring similarity: 0.3333333333333333
fish<->cat similarity: 0.2
fish<->dog similarity: 0.2
..........
bird<->bird similarity: 1.0
bird<->sparrow similarity: 0.3333333333333333
bird<->eagle similarity: 0.3333333333333333
bird<->cat similarity: 0.25
bird<->dog similarity: 0.25
..........
bird<->fish similarity: 0.25
fishfish相似性:1.0
鳟鱼相似性:0.5
鲱鱼相似性:0.3333
fishcat相似性:0.2
鱼狗相似性:0.2
..........
鸟类相似性:1.0
鸟类相似性:0.3333
鸟类相似性:0.3333
鸟粪相似性:0.25
birddog相似性:0.25
..........
鸟类相似性:0.25

我钦佩你在尝试利用wordnet相似度评分方面的独创性,但我怀疑这是否足以满足你的目的。您所追求的是hypernym关系,Wordnet语法集通过
hypernyms()
方法方便地提供了它。(由于某些原因,引理也有一个
hypernyms()
方法;但它总是空的;不要让它迷惑你。)

以下是Wordnet可以告诉你的关于“麻雀”一词的内容:

正如您所见,Wordnet通过两个步骤将您从一只麻雀带到另一只鸟,而不是一步。这正是Wordnet碰巧包含的内容

更一般地说,您所寻找的是语料库中所有内容的分类法,也就是说,您所在领域中每个有趣概念的分层词汇表。请注意,我一直在限定,如“您的语料库”、“您的域”。有许多不同的方法可以根据“类型”对事物进行分类。小麦是一种植物,但你也可以说它是一种谷类谷物(植物的一种亚类型),或者说它是一种种子、一种食品、食品的一种成分等等(别介意“小麦”也是一种颜色等等)


因此,满足您需求的理想解决方案是对您感兴趣的事物进行分类,并且适合您的目的。如果你正在处理一个特定的领域,很可能有一个;尝试谷歌搜索或询问合适的堆栈交换。但是,许多这样的资源是RDF格式的,并且需要不同于您可能使用的工具和技术。一个巨大的免费资源是从维基百科中提取的。这是给你一个想法的条目。

Hyper-/Hyponyms=)谢谢@alvas,我不知道他们是这么叫的!谢谢你@alexis,这真的很有帮助!
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets("sparrow")
[Synset('sparrow.n.01'), Synset('hedge_sparrow.n.01')]
>>> sparrow = wn.synsets("sparrow")[0]
>>> sparrow.hypernyms()
[Synset('passerine.n.01')]
>>> sparrow.hypernyms()[0].hypernyms()
[Synset('bird.n.01')]
>>> sparrow.hypernyms()[0].hypernyms()[0].hypernyms()
[Synset('vertebrate.n.01')]