I have a poem and I want the Python code to just print those words which are rhyming with each other.
So far I am able to:
wordpunct_tokenize()
cmudict.entries() with elements as those last words and their pronunciation. I am stuck with the next step. How should I try to match those pronunciations? In all, my major task is to find out if two given words rhyme or not. If rhyme, then return True, else False.
The Pronouncing library does a great job for that. No hacking, quick to load, and is based on the CMU Pronouncing Dictionary so it's reliable.
https://pypi.python.org/pypi/pronouncing
From their documentation:
>>> import pronouncing
>>> pronouncing.rhymes("climbing")
['diming', 'liming', 'priming', 'rhyming', 'timing']
Here I found a way to find rhymes to a given word using 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)
where inp is a word and level means how good the rhyme should be.
So you could use this function and to check if 2 words rhyme you could just check if one is in other's set of allowed rhymes:
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)
Use soundex or double metaphone to find out if they rhyme. NLTK doesn't seem to implement these but a quick Google search showed some implementations.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With