NLTK中是否存在“某种类型”的功能?

时间:2019-04-12 23:29:58

标签: python nlp nltk

我正在尝试使用NLTK捕获对象的一般类的出现。例如,from django.conf import settings def contact(request): if request.method == 'POST': message = request.POST.get('message', '') from_email = request.POST.get('from_email', '') send_mail('Contact Form', message, from_email, [settings.EMAIL_HOST_USER]) return render(request, 'first_app/contact.html') trout是的类型。herringfish类型> eagles。 NLTK(或其他任何与此相关的库)中是否有任何功能可以帮助我做到这一点?

我不是在寻找同义词,因为它们只是表达相同意思的另一种方式...因此,例如,使用sparrows,我将得到以下内容作为“麻雀”的同义词:

birds

对于'bird'的同义词,我得到:

wordnet.synsets

我正在寻找一种方式来说明'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'的一种类型。

2 个答案:

答案 0 :(得分:1)

我很欣赏您尝试利用词网相似度得分的独创性,但我怀疑它是否足以满足您的目的。您所追求的是 hypernym 关系,Wordnet同义词集可以通过hypernyms()方法方便地提供它。 (出于某些原因,Lemmas也有一个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分两步将您从麻雀转移到 bird 。这就是Wordnet恰好包含的内容。

更一般而言,您要查找的是语料库中所有内容的分类,即域中每个有趣概念的分层词汇表。请注意,我一直保持资格,例如“您的语料库”,“您的域名”。有许多不同的方法可以按“类型”对事物进行分类。小麦是一种植物,但您也可以说它是谷类谷物(植物的一种亚型),或者它是种子,食品,食品中的成分等。(不用担心,“小麦”是也是颜色等)

因此,满足您需求的理想解决方案是对您感兴趣的事物进行分类 适合您的目的。域,很可能会有一个;尝试使用Google搜索或在合适的堆栈交换中进行询问。但是,许多此类资源都是RDF格式的,它们需要的工具和技术与您可能习惯的工具和技术不同。 dbpedia是一种巨大的免费资源,它是从维基百科中提取的。这是swallow上的条目,旨在为您提供一个想法。

答案 1 :(得分:0)

我发现了可以在此期间使用的粗略解决方法,但是如果存在更好的方法,我仍然将不胜感激。

事实证明,存在一个同义词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