在Python中使用NLTK查找押韵

时间:2014-09-07 20:36:05

标签: python nltk

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

到目前为止,我能够:

  1. 使用wordpunct_tokenize()
  2. 打破诗句
  3. 删除标点符号
  4. 来清理单词
  5. 将诗中每个句子的最后一个单词存储在一个列表中
  6. 使用cmudict.entries()生成另一个列表,其中元素作为最后一个单词及其发音。
  7. 我坚持下一步。我该如何尝试匹配这些发音?总而言之,我的主要任务是找出两个给定的单词是否押韵。如果是押韵,则返回True,否则False

3 个答案:

答案 0 :(得分:11)

Pronouncing library做得很好。没有黑客攻击,快速加载,并且基于CMU发音词典,所以它是可靠的。

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

来自documentation

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

答案 1 :(得分:9)

Here我找到了一种使用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)

其中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)

答案 2 :(得分:2)

使用soundex或双metaphone来查明它们是否押韵。 NLTK似乎没有实现这些,但快速谷歌搜索显示了一些实现。