Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在最后一个元音后寻找单词_Python_Python 3.x - Fatal编程技术网

Python 在最后一个元音后寻找单词

Python 在最后一个元音后寻找单词,python,python-3.x,Python,Python 3.x,我目前正试图根据CMU发音词典生成一个与输入单词押韵的单词列表。我已设法将所有单词排列到一个词典中,它们的键是一个表示其值的字符串列表。然而,由于一些基于最后一个元音的押韵,我一直在寻找如何处理包含多个元音的单词 def dotheyrhyme(filename,word): rhymes = {} list = [] with open(filename) as f: text = f.readlines()[56:] for line

我目前正试图根据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变量作为基线,并且相信反转这个变量也可能是一个很好的方法,但是我不知道或者想太多方法来比较最后一个元音和后面的字母是否相同并相应地追加

例如:

{SECOND: 'S' 'EH1' 'K' 'AH0' 'N' 'D'} 
将与

{'AND': 'AH0' 'N' 'D'} 
但这两个不押韵


{'YELLOW':'Y''EH1''L''OW0'}
查找最后一个元音需要有一组元音。在此之后,您只需向后迭代列表

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

如果你愿意接受其他想法,你也可以看看这个为你找到押韵的图书馆:

你必须从结尾开始比较。有一些特殊的算法和数据结构,可以在类似您的情况下提供帮助-您可以检查

但在简单的情况下,您需要按相反的顺序比较单词,并找到高于某个阈值的公共子字符串,以将这些单词称为押韵,例如:

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
def if_押韵(单词1,单词2):
r1=倒转(押韵[字2])
r2=反面(押韵[单词1])
相同=0
对于zip中的sound1和sound2(r1、r2):
如果sound1==sound2:
相同的+=1
其他:
打破
如果相同<阈值:
返回“不押韵”或False(如果需要)
其他:
返回“押韵”或True
算法的作用

  • 它从您从文件中填充的
    押韵
    字典中获取声音列表(为清晰起见,我建议在押韵测试功能之外执行此操作)
  • 然后,它反转两个单词的发音列表中元素的顺序,并使用
    zip
    创建一个成对(或元组)列表
  • 比较每个元组(单词的发音顺序相反)。我们数一数相同的声音,并停止从后面比较第一对不同的声音
  • 根据阈值(您可能需要将变量替换为实际值),考虑给定的一对单词作为韵母。

  • 我看到了这一点,因为在这种情况下,单词无论重音如何都是押韵的,如果在将誓言视为单个字符串的情况下,将阈值设置为2,那么使用示例作为基础,理想情况下,在最后一个元音之后,单词只会是一个单词。在字符串上使用replace方法来消除int是一个好方法方法在我找到一个确定阈值的理想方法之后?我也遇到了一个边缘案例,在尝试不同的代码实现时,单词yellow和hello的读音分别是Y EH1 L OW0和HH AH0 L OW1,所以在这个反向过程中,这个案例通过了,所以我将尝试正式循环通过拉链,我相信如果我理解你的理解正确的话,它会在每次检查后通过循环退出string@Vanguard当前位置很抱歉,但很难理解您所问的问题…没问题,我想我已经解决了,请使用“替换并继续”,以便我可以处理以元音结尾的单词。我现在正试图找到一种方法来打开字典并一起使用这个功能,这样它就可以在一定的时间范围内运行,但谢谢你的帮助:)@Vanguard:如果答案有帮助,请在左边用绿色勾号标出。我明白了,谢谢,但是在比较两个不同长度的单词时,我可以通过检查从最后一个元音的列表元素到列表末尾的索引是否匹配来确定它们是否押韵。目前,我对hello:HH AH0 L OW1和yellow:Y EH1 L OW0这两个不押韵的词有困难,但我在将我的推理转化为代码时遇到了困难,因为最后一个元音不包含任何声音,只剩下其他元音