在最后一个V之后查找单词

2024-09-30 20:33:31 发布

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

我目前正在根据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

我计划使用comparer变量作为基线,并且相信反转这个变量也是一个很好的方法,但是我迷失了或者过度思考如何比较后面的最后一个元音和字母是否相同并相应地追加?在

示例:

^{pr2}$

与…押韵

{'AND': 'AH0' 'N' 'D'} 

但这两个不押韵

{'YELLOW': 'Y' 'EH1' 'L' 'OW0'}

以及

{HELLO: 'HH' 'AH0' 'L' 'OW1'}

但是我想不出什么方法来抵消长度的变化和多个元音。在

谢谢你的帮助!在


Tags: 方法text列表linefilename单词wordsplit
2条回答

你得从头开始比较。有一些特殊的算法和数据结构可以帮助处理像您这样的情况—您可以检查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

算法的作用

  1. 它从您从文件中填充的rhymes字典中获取声音列表(为了清晰起见,我建议在押韵测试函数之外进行)。在
  2. 然后它反转两个单词的发音列表中元素的顺序,并使用zip创建一个成对(或元组)列表。在
  3. 对每个元组(单词的发音顺序相反)进行比较。我们数一数相同的声音,不再从后面比较第一对不同的声音。在
  4. 根据阈值(您可能希望用变量替换实际值),您可以将给定的一对单词视为押韵。在

找到最后一个元音需要有一组元音。在那之后,你只需要反向迭代列表。在

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/

相关问题 更多 >