在最后的元音之后找到单词

时间:2019-02-17 03:11:17

标签: python python-3.x

我目前正在尝试根据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'}  

但是我无法想到应对不同长度和多个元音的方法。

感谢您的帮助!

2 个答案:

答案 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

算法的作用

  1. 它从文件中填充rhymes词典中的声音列表(为清楚起见,我建议在韵律测试功能之外进行此操作)。
  2. 然后,它反转两个单词的声音列表中的元素顺序,并使用zip创建一个对(或元组)列表。
  3. 比较每个元组(来自单词的声音顺序相反)。我们计算相同的声音,并停止从背面对第一对不同的声音进行比较。
  4. 根据阈值(您可能希望用变量代替实际值),将给定的单词对视为押韵。