我目前正在尝试根据CMU发音词典生成与输入单词押韵的单词列表,我已经设法将所有单词排列到词典中,其关键字是代表其值的字符串列表。但是,由于基于最后一个元音的押韵,在某种程度上包含一个以上单词的情况下,我一直坚持寻找解决方法
def dotheyrhyme(filename,word):
rhymes = {}
list = []
with open(filename) as f:
text = f.readlines()[56:]
for line in text:
splitline = line.split(" ")
rhymes[str(splitline[0])] = "".join(splitline[1:])
f.close()
comparer = rhymes[word.upper()].rstrip().split(" ")
return comparer
我计划将比较器变量用作基准,并相信反转该变量也可能是解决该问题的好方法,但是我迷失了或思考了比较最后一个元音和字母是否相同并追加的方法相应地?
示例:
{SECOND: 'S' 'EH1' 'K' 'AH0' 'N' 'D'}
请问韵
{'AND': 'AH0' 'N' 'D'}
但是这两个不会押韵
{'YELLOW': 'Y' 'EH1' 'L' 'OW0'}
和
{HELLO: 'HH' 'AH0' 'L' 'OW1'}
但是我无法想到应对不同长度和多个元音的方法。
感谢您的帮助!
答案 0 :(得分:1)
查找最后一个元音需要您具有一组元音。之后,您只需要向后遍历该列表即可。
vowels = {...} # some list of vowels
word = ['S', 'EH1', 'K', 'AH0', 'N', 'D']
for i in word[::-1]:
if i in vowels:
last_vowel = i
break
如果愿意接受其他想法,您还可以查看该图书馆,该图书馆为您找到押韵:https://pypi.org/project/pronouncing/
答案 1 :(得分:0)
您必须从头开始比较。有特殊的算法和数据结构可以在像您这样的情况下提供帮助-您可以检查Aho-Corasick algorithm。
但是在简单的情况下,您需要以相反的顺序比较单词,并找到高于某个阈值的公共子字符串,以将这些单词称为押韵,例如:
def if_rhymes(word1, word2):
r1 = reverse(rhymes[word2])
r2 = reverse(rhymes[word1])
the_same = 0
for sound1, sound2 in zip(r1, r2):
if sound1 == sound2:
the_same += 1
else:
break
if the_same < threshold:
return 'no rhyme' # or False if you want
else:
return 'rhymes' # or True
算法的作用
rhymes
词典中的声音列表(为清楚起见,我建议在韵律测试功能之外进行此操作)。 zip
创建一个对(或元组)列表。