2016-09-20 2 views
0

Я пытаюсь найти различные способы написания «событий в [городе]», которые семантически похожи. Я пытаюсь сделать это, найдя слова, которые семантически похожи на «события», поэтому я могу их заменить.nltk семантическое замещение слова

Чтобы найти эти слова, я использую nSLT wordnet corpus, но получаю некоторые довольно странные результаты. Например, используя гипонимы «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

В гипонимов из "события" являются типами "событие". Одним из них является «чудо», некоторые другие: hypernyms

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

Теперь, возьмите и сортируйте их, например. 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

Это напомнило, что это была хорошая идея, чтобы попробовать и комбинировать различные методы. Я нашел список триграмм поискового запроса, искал «события» и нашел наиболее распространенную структуру тегов POS (возможно, это грамматическая структура?). Затем я просто искал те теги POS (например, '[n] [in] [n]'), затем попробовал сортировать их, взвешивая их частоту и сходство с «событиями». Это был хороший ход, но word2vec было намного меньше экспериментов. – Alter

+0

@Alter Просто из любопытства, какого рода предложение вы получили с word2vec для «событий в [городе]»? – zvone

+0

word2vec использовался только для слова 'events'. Он работал очень хорошо, не придавая ему больше контекста. Он имел такие результаты, как «гоночный, спортивный, концертный» – Alter

Смежные вопросы