clickbaitonator / fudge /poetry_util.py
Dusan's picture
Update fudge/poetry_util.py
ebf895f
import string
import pronouncing
from Phyme import Phyme
phyme = Phyme()
from fudge.constants import *
def is_iambic(phrase):
"""
check that we satisfy iambic meter.
return 1 if so, otherwise 0.
definitely an imperfect check...
if we end up needing to check a word that's not in the CMU dictionary, just return 0.
"""
meter = ''
for word in phrase.split():
word = word.strip().strip(string.punctuation).lower()
try:
phones_list = pronouncing.phones_for_word(word)
stresses = pronouncing.stresses(phones_list[0])
if len(stresses) == 1:
if stresses == '1':
stresses = '2' # allow ambiguity for 1-syllable words with stress 1
meter += stresses # just default to the first pronunciation if > 1 given
except:
return 0 # word not found
meter = [int(x) for x in meter]
even_stresses_full = [meter[i] for i in range(0, len(meter), 2)]
odd_stresses_full = [meter[i] for i in range(1, len(meter), 2)]
even_stresses = set(even_stresses_full)
odd_stresses = set(odd_stresses_full)
if 0 in odd_stresses:
return 0
if 1 in even_stresses:
return 0
return 1
def count_syllables(words):
syllables = 0
for word in words.split():
word = word.strip().strip(string.punctuation)
try:
phones_list = pronouncing.phones_for_word(word)
stresses = pronouncing.stresses(phones_list[0])
syllables += min(MAX_SYLLABLES_PER_WORD, len(stresses))
except:
# if we don't know, just do a quick approximation here; it shouldn't come up too often
syllables += min(MAX_SYLLABLES_PER_WORD, round(len(word) / 3))
return syllables
def get_rhymes(word):
# throws exception if word not in the rhyme dict (rare)
rhymes = []
rhyme_dict = phyme.get_perfect_rhymes(word)
for length_dict in rhyme_dict.values():
for word in length_dict:
if '(' in word: # sometimes you have stuff like preferred(1) where they indicate a particular pronunciation
rhymes.append(word.split('(')[0])
else:
rhymes.append(word)
return sorted(list(set(rhymes)))
def get_rhyme_group(word):
sorted_rhyme_list = get_rhymes(word)
return ' '.join(sorted_rhyme_list)
def perfect_rhyme_end(s1, s2):
ending_word1 = s1.split()[-1].strip(string.punctuation)
ending_word2 = s2.split()[-1].strip(string.punctuation)
try:
return get_rhyme_group(ending_word1) == get_rhyme_group(ending_word2)
except:
return False # unknown words
if __name__=='__main__':
result = is_iambic('Shall I compare thee to a summer day')
result2 = count_syllables('Shall I compare thee to a summer day')
import pdb; pdb.set_trace()