在Python中使用NLTK查找押韵

lea*_*r57 17 python nltk

我有一首诗,我希望Python代码只打印那些彼此押韵的单词.

到目前为止,我能够:

  1. 打破诗句 wordpunct_tokenize()
  2. 通过删除标点符号来清理单词
  3. 将诗中每个句子的最后一个单词存储在一个列表中
  4. 使用cmudict.entries()元素作为最后的单词及其发音生成另一个列表.

我坚持下一步.我该如何尝试匹配这些发音?总而言之,我的主要任务是找出两个给定的单词是否押韵.若韵,则返回True,否则False.

Jef*_*son 12

该Pronouncing库做了伟大的工作了点.没有黑客攻击,快速加载,并且基于CMU发音字典,所以它是可靠的.

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

从他们的文件:

>>> import pronouncing
>>> pronouncing.rhymes("climbing")
['diming', 'liming', 'priming', 'rhyming', 'timing']
Run Code Online (Sandbox Code Playgroud)


ken*_*der 9

在这里,我找到了一种使用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)
Run Code Online (Sandbox Code Playgroud)

inp一个词在哪里,level意味着押韵应该有多好.

所以你可以使用这个功能,并检查是否有两个单词押韵,你可以检查一个是否在其他允许的押韵中:

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)
Run Code Online (Sandbox Code Playgroud)