在Python中使用NLTK查找押韵

2024-05-16 11:56:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

到目前为止,我能够:

  1. wordpunct_tokenize()打断诗歌句子
  2. 去掉标点符号来清除单词
  3. 把这首诗每句的最后一个字都记在一张单子里
  4. 使用cmudict.entries()生成另一个列表,元素作为最后一个单词及其发音。

我被困在下一步。我应该怎样试着匹配这些发音呢?总之,我的主要任务是找出两个单词是否押韵。如果押韵,则返回True,否则返回False


Tags: 代码true元素列表单词句子单子entries
3条回答

使用soundex或双变音找出它们是否押韵。NLTK似乎没有实现这些功能,但是Google的快速搜索显示了一些实现。

^{} library对此做得很好。无黑客攻击,加载速度快,基于CMU发音字典,所以很可靠。

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

从他们的documentation

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

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)

相关问题 更多 >