Найти рифму с помощью NLTK в Python

У меня есть стихотворение, и я хочу, чтобы код Python просто печатал те слова, которые рифмуются друг с другом.

До сих пор я могу:

  • Разделите предложения стихотворения с помощью wordpunct_tokenize()
  • Очистите слова, удалив знаки препинания
  • Сохраните последнее слово каждого предложения стихотворения в списке
  • Сгенерируйте другой список, используя cmudict.entries() с элементами, такими как последние слова и их произношение.

Я застрял со следующим шагом. Как я могу попытаться сопоставить эти произношения? В общем, моя главная задача - выяснить, рифмуются ли два заданных слова или нет. Если рифма, верните True, else False.

Ответ 1

Здесь Я нашел способ найти рифмы для данного слова, используя NLTK:

def rhyme(inp, level):
     entries = nltk.corpus.cmudict.entries()
     syllables = [(word, syl) for word, syl in entries if word == inp]
     rhymes = []
     for (word, syllable) in syllables:
             rhymes += [word for word, pron in entries if pron[-level:] == syllable[-level:]]
     return set(rhymes)

где imp - это слово, а level означает хороший рифма.

Итак, вы можете использовать эту функцию и проверить, есть ли 2 слова рифмы, вы можете просто проверить, есть ли в другом наборе разрешенных рифм:

def doTheyRhyme ( word1, word2 ):
  # first, we don't want to report 'glue' and 'unglue' as rhyming words
  # those kind of rhymes are LAME
  if word1.find ( word2 ) == len(word1) - len ( word2 ):
      return False
  if word2.find ( word1 ) == len ( word2 ) - len ( word1 ): 
      return False

  return word1 in rhyme ( word2, 1 )

Ответ 2

Pronouncing library отлично справляется с этим. Не взламывать, быстро загружать и на основе словаря высказываний CMU, чтобы он был надежным.

https://pypi.python.org/pypi/pronouncing

Из документации:

>>> import pronouncing
>>> pronouncing.rhymes("climbing")
['diming', 'liming', 'priming', 'rhyming', 'timing']

Ответ 3

Используйте soundex или двойной метафон, чтобы узнать, риферируют ли они. NLTK, похоже, не реализует их, но быстрый поиск Google показал некоторые реализации.