我正在尝试使用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
是的类型。herring
和fish
是的类型> 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'
的一种类型。
答案 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