2016-09-20 194 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