NLTK中是否有“Is a type of”功能?

2024-04-19 21:42:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用NLTK捕捉对象的一般类的出现。例如,troutherringfish类型,eaglessparrowsbirds类型。NLTK(或任何其他库)中是否有任何功能可以帮助我做到这一点?你知道吗

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

'hedge_sparrow', 'dunnock', 'Prunella_modularis', 'sparrow', 'true_sparrow'。你知道吗

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

'doll', 'snort', 'skirt', 'birdwatch', 'chick', 'hiss', 'hoot', 'raspberry', 'bird', 'Bronx_cheer', 'boo', 'shuttlecock', 'razzing', 'birdie', 'shuttle', 'wench', 'fowl', 'dame', 'razz'。你知道吗

我在寻找一种方式来说明sparrowbird的一种类型。你知道吗


Tags: 对象功能类型方式同义词nltkfishsparrow
2条回答

我找到了一个粗略的解决方法,我可以在这期间使用,但我仍然会感谢任何帮助,如果有更好的方式存在。你知道吗

原来有一个同义词path_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')))

输出:

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

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

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

>>> 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')]

如您所见,Wordnet将您从麻雀分为两步,而不是一步。这正是Wordnet碰巧包含的内容。你知道吗

一般来说,你要找的是语料库中所有内容的分类法,也就是说,你的领域中每一个有趣概念的分级词汇表。请注意,我一直保持资格,如在“你的语料库”,“你的领域”。按“类型”来分类有许多不同的方法。小麦是一种植物,但你也可以说它是一种谷类谷物(植物的一个子类型),或者说它是一种种子、一种食品、一种食品成分等等(别介意“小麦”也是一种颜色等等)

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

相关问题 更多 >