Как получить синоним для нескольких слов с помощью NLTK?

#python #python-3.x #nlp #nltk

#python #python-3.x #nlp #nltk

Вопрос:

Я искал, что все вопросы предоставляют способ получить синоним только для одного слова, но это не работает, когда я пытаюсь использовать цикл for для получения синонима для нескольких слов.

Это мой код, но он работает не так, как ожидалось.

 str = "Action, Adventure, Drama"

def process_genre(str):
    for genre in str.split(","):
        result = []
        for syn in wordnet.synsets(genre):
            for l in syn.lemmas():
                result.append(l.name())
        print(result)
process_genre(str)
  

Это результат

 ['action', 'action', 'activity', 'activeness', 'military_action', 'action', 'natural_process', 'natural_action', 'action', 'activity', 'action', 'action', 'action', 'action_mechanism', 'legal_action', 'action', 'action_at_law', 'action', 'action', 'action', 'sue', 'litigate', 'process', 'carry_through', 'accomplish', 'execute', 'carry_out', 'action', 'fulfill', 'fulfil']
[]
[]
  

Список для Adventure и Drama печатается пустым, у которого должен быть свой синоним.

Кто-нибудь может объяснить мне, почему? Есть ли способ, возможно, сбросить его? Или …?

Комментарии:

1. Бесплатный совет: не используйте str в качестве имени переменной. Это имя строкового типа, и вы настраиваете себя на озадачивающие проблемы в будущем, если у вас войдет в привычку использовать его в качестве переменной. Python разрешает это (это не зарезервированное ключевое слово, подобное if ), но не поощряет это.

Ответ №1:

Я думаю, проблема в вашем вводе. У вас есть дополнительное пространство после, , поэтому, когда вы разбиваете на , , ваши слова становятся ["Action", " Adventure"," Drama"]

В wordnet нет таких слов, как Adventure и Drama (обратите внимание на пробел в начале word). Вот почему вы не получаете выходные данные для 2-го и 3-го слова.

Поработайте над своим вводом

разделить на ", " вместо ","

 str = "Action, Adventure, Drama"

def process_genre(str):
    for genre in str.split(", "):
        result = []
        for syn in wordnet.synsets(genre):
            for l in syn.lemmas():
                result.append(l.name())
        print(result)
process_genre(str)
  

Вывод:

 ['action', 'action', 'activity', 'activeness', 'military_action', 'action', 'natural_process', 'natural_action', 'action', 'activity', 'action', 'action', 'action', 'action_mechanism', 'legal_action', 'action', 'action_at_law', 'action', 'action', 'action', 'sue', 'litigate', 'process', 'carry_through', 'accomplish', 'execute', 'carry_out', 'action', 'fulfill', 'fulfil']
['adventure', 'escapade', 'risky_venture', 'dangerous_undertaking', 'gamble', 'chance', 'risk', 'hazard', 'take_chances', 'adventure', 'run_a_risk', 'take_a_chance', 'venture', 'hazard', 'adventure', 'stake', 'jeopardize']
['play', 'drama', 'dramatic_play', 'drama', 'dramatic_event', 'drama', 'drama']
  

Комментарии:

1. О, точно. Я должен просто сделать полосу после разделения. глупая ошибка для меня: / Спасибо за помощь!

2. Я рекомендую выработать привычку разделять строки терминов пробелами, а не запятой пробел. Упрощает жизнь и менее подвержен ошибкам. И тогда вы можете просто разделить с terms.split() .