2015-06-02 2 views
5

Я работаю с API-интерфейсом Python NLTK Wordnet. Я пытаюсь найти лучший synset, который представляет собой группу слов.NLTK Wordnet Synset для фразы слов

Если мне нужно найти лучший сингл для чего-то типа «школа & канцелярские принадлежности», я не уверен, как это сделать. До сих пор я пытался найти в synsets для отдельных слов, а затем вычисления лучший самый низкий общий hypernym как это:

def find_best_synset(category_name): 
    text = word_tokenize(category_name) 
    tags = pos_tag(text) 

    node_synsets = [] 
    for word, tag in tags: 
     pos = get_wordnet_pos(tag) 
     if not pos: 
      continue 
     node_synsets.append(wordnet.synsets(word, pos=pos)) 

    max_score = 0 
    max_synset = None 
    max_combination = None 
    for combination in itertools.product(*node_synsets): 
     for test in itertools.combinations(combination, 2): 
      score = wordnet.path_similarity(test[0], test[1]) 
      if score > max_score: 
       max_score = score 
       max_combination = test 
       max_synset = test[0].lowest_common_hypernyms(test[1]) 
    return max_synset 

Однако это не очень хорошо работает и это очень дорого. Есть ли способ выяснить, какой синт лучше всего представляет несколько слов вместе?

Благодарим за помощь!

+0

Если все ваши выражения похожи на этот пример, то вам, вероятно, не стоит искать общий гипероним. «Школьные принадлежности» - это своего рода припасы, но это не какая-то школа. Скорее, вы могли бы рассмотреть синхронизацию последнего слова и устранить неоднозначность среди тех, кто использует предыдущие слова (я не уверен, как это сделать, однако). – lenz

+0

Хммм, я вижу вашу точку зрения, но я не думаю, что все выражения похожи на этот пример. Я понимаю, что «школа и офис» - это тип поставок, но они по-прежнему считаются существительными вместо прилагательных. –

+0

Ну, это не упростит вашу задачу, если выражения имеют разные внутренние структуры. Я предлагаю вам вручную назначить правильный синхронизм в случайном образце (например, 20), а затем посмотреть, можете ли вы увидеть шаблон. Или вручную делайте еще больше экземпляров и тренируйте дерево решений. – lenz

ответ

4

Помимо того, что я уже сказал в комментариях, я думаю, что способ выбора лучшего гиперонима может быть испорчен. Синтаксис, в котором вы закончили, не является самым низким общим гиперонимом всех слов, но только двух из них.

Давайте придерживаться вашего примера «школа & канцелярские принадлежности». Для каждого слова в выражении вы получаете несколько synsets. Таким образом, переменная node_synsets будет выглядеть следующим образом:

[[school_1, school_2], [office_1, office_2, office_3], [supply_1]] 

В этом примере есть 6 способов, чтобы объединить каждый synset с любым из других:

[(school_1, office_1, supply_1), 
(school_1, office_2, supply_1), 
(school_1, office_3, supply_1), 
(school_2, office_1, supply_1), 
(school_2, office_2, supply_1), 
(school_2, office_3, supply_1)] 

Этих тройки, что вы перебрать во внешней петле foritertools.product). Если выражение имеет 4 слова, вы будете перебирать четверки, с 5 его пятью и т. Д.

Теперь, с внутренней петлей for, вы соедините каждую тройку. Первый из них:

[(school_1, office_1), 
(school_1, supply_1), 
(office_1, supply_1)] 

... и вы определяете самый низкий гипероним среди каждой пары. Таким образом, в конце вы получаете самый низкий гипероним, скажем, school_2 и office_1, что может быть своего рода учреждением. Это, вероятно, не очень важно, так как не учитывает никакой синхронизации последнего слова.

Возможно, вам стоит попробовать найти самый низкий общий гипероним все три слова: слов, в каждой комбинации их синтаксисов, и возьмите один из них, лучший среди них.

+0

Согласен, я попытался сделать это на более поздней итерации. Решение, которое я закончил использовать, состояло в том, чтобы не уменьшать их до одного гипернима, а вместо этого использовать все сгенерированные синтезаторы для получения наилучшего результата. Довольно много возвращающих «node_synsets» и используя это. Если я действительно хочу найти LCH для всех трех ... мог бы я найти его между двумя из них, а затем использовать это в вычислении LCH с третьим? –

+0

Я бы так сказал, да. – lenz

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