nltk语义词替换

时间:2016-09-20 21:00:47

标签: python nlp nltk

我试图找到不同的写作方式" [city]"它们在语义上相似。我试图通过找到语义上类似于"事件"的词来做到这一点。所以我可以替换它们。

要找到这些单词,我使用nltk的wordnet语料库,但我得到了一些非常奇怪的结果。例如,使用' event.n.01'的下位词,我在渥太华"获得了奇迹。

共同的下位词和上位词似乎同样糟糕或更糟。我想知道是否有人能更好地理解结构并提供潜在的解决方案?

以下是一些示例代码:

!/usr/bin/python3

import nltk

lemma = 'event.n.01'
synset = nltk.corpus.wordnet.synset(lemma)

print("%s: %s" % (synset.name(), synset.definition()))

print("\nFinding hyponyms...")
print([s.split('.')[0] for w in synset.hyponyms() for s in w.lemma_names()])

print("\nFinding hypernym paths...")
print([s.split('.')[0] for hyprs in synset.hypernym_paths() for hypr in hyprs for s in hypr.lemma_names()])

print("\nFinding co-hyponyms...")
for hypers in synset.hypernym_paths():
        for hyper in hypers:
                print(hyper.name())
                for hypos in hyper.hyponyms():
                        print("\t%s" % (', '.join(hypos.lemma_names())))

print(synset.similar())

2 个答案:

答案 0 :(得分:1)

"事件" hyponyms 是"事件"的类型。其中一个是"奇迹"其他一些是:

>>> [s for w in synset.hyponyms() for s in w.lemma_names][:7]  # is 7 enough? :)
['zap', 'act', 'deed', 'human_action', 'human_activity', 'happening', 'occurrence']

"事件' S" 上位词是对立面。条款"事件"是一种类型:

>>> synset.hypernyms()
[Synset('psychological_feature.n.01')]

你可以看到" event"是其中一个 hyponyms

>>> synset.hypernyms()[0].hyponyms()
[Synset('motivation.n.01'), Synset('cognition.n.01'), Synset('event.n.01')]

那些不是真的"类似"术语("渥太华的心理特征"对于机器人来说似乎是正确的结果,但对人类来说似乎不是正确的结果。)

或许最好从一个完全不同的角度来看待它,例如

>>> text = nltk.Text(word.lower() for word in nltk.corpus.brown.words())
>>> text.similar('event')
time day man order state way case house one place action night point
situation work year act and area audience

现在,拿出那些并对它们进行排序,例如by path_similarity:

>>> words = 'time day man order state way case house one place action night point'\
...         ' situation work year act and area audience'.split()
>>> 
>>> def get_symilarity(synset, word):
...     return max([synset.path_similarity(synset2)
...                for synset2 in nltk.corpus.wordnet.synsets(word)]+[0])
>>> 
>>> sorted(words, key=lambda w: get_symilarity(synset, w), reverse=True)[:5]
['act', 'case', 'action', 'time', 'way']

这是一个好结果吗?我不知道。我想它可以奏效:"渥太华的行为","纽约案例","罗马行动","东京时间" ,"阿姆斯特丹的方式" ...

答案 1 :(得分:1)

您可以采取深度学习方法。训练word2vec模型并获得与“事件”向量最相似的向量。

您可以在Word2Vec Demo

测试模型