Spaces:
Runtime error
Runtime error
| 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() |