2016-09-20 91 views
0

我試圖找到不同的方式來編寫語義上類似的「城市中的事件」。我試圖通過查找與「事件」在語義上相似的詞來做到這一點,所以我可以將它們替換。nltk語義詞替換

要找到這些詞我正在使用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()) 

回答

1

你可以採取深入的學習方法。訓練word2vec模型,並獲取與「事件」向量最相似的向量。

您可以在這裏測試的模型Word2Vec Demo

1

下義詞的 「事件」是類型的 「事件」。其中之一是「奇蹟」,有些則是:

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

「事件的」 上位是在oposite。術語是「事件」是一個類型:

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

現在,拿這些和排序他們,例如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'] 

這是一個好的結果嗎?我不知道。我想它可以工作:「在渥太華的行爲」,「在紐約的案件」,「在羅馬的行動」,「在東京的時間」,「在阿姆斯特丹的方式」...

+0

此提醒的是,這是一個好主意,嘗試,並結合不同的方法。我找到了一個搜索查詢語句列表,搜索'events'並找到最常見的POS標籤結構(也許這是語法結構?)。然後,我搜索了那些POS標籤(例如'[n] [in] [n]'),然後嘗試通過加權它們的頻率和路徑相似性來對它們進行排序。這是一個很好的去,但word2vec是少了很多實驗。 – Alter

+0

@Alter出於好奇,你用word2vec獲得了「城市中的事件」是什麼樣的提示? – zvone

+0

word2vec僅用於單詞'events'。它工作得很好,但沒有給它上下文。它有像賽車,運動,音樂會這樣的結果 – Alter