簡體   English   中英

nltk語義詞替換

[英]nltk semantic word substitution

我試圖找到在語義上相似的“城市中的事件”的不同寫法。 我正在嘗試通過查找在語義上類似於“事件”的單詞來做到這一點,以便替換它們。

為了找到這些單詞,我使用了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())

“事件”的下位是“事件”的類型。 其中之一是“奇跡”,還有一些是:

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

“事件”的上位詞是相反的。 術語“事件”是以下類型的:

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

您可以看到“事件”是其下義詞之一

>>> 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

現在,對它們進行排序,例如按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']

這樣好嗎? 我不知道。 我想這可能行得通:“在渥太華表演”,“紐約案件”,“羅馬行動”,“東京時間”,“阿姆斯特丹之路” ...

您可以采用深度學習方法。 訓練word2vec模型,並獲得與“事件”向量最相似的向量。

您可以在此處測試模型Word2Vec演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM