用Python将单词的子串拼音转换成arpabe

2024-09-27 21:31:53 发布

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

这样做的目的是,我希望能够将一个单词不仅转换成它的音素,而且还转换成与之对应的子串。例如,类似于:

from nltk.corpus import cmudict
d = cmudict.dict()
...
print foo('perfect', d['perfect']) 
>>> (['p','er','f','e','c','t'], [u'P', u'ER0', u'F', u'EH1', u'K', u'T'])

我希望能找到NLTK的一部分或者一个我可以研究的广泛可用的资源,但是任何能解决这个问题的东西都是受欢迎的。在

另外,我希望任何解决方案都不必在cmudict中查找'perfect'的子字符串。有时子串的发音会与完整单词不同。在

奖金: 我意识到,当多个音素对应一个子串时,这可能会很困难(如果我错了,请纠正我,而不是语言学人士),例如:

^{pr2}$

对于上述情况,L和E是否应同时对应AH0和L?在


Tags: fromimport目的foocorpus单词dictprint
1条回答
网友
1楼 · 发布于 2024-09-27 21:31:53

结果表明,对于字符串和arpabet列表,使用音节语法有点管用。在

def str_syllables(s):
    k = ['V' if x in list('aeiouy') else 'C' for x in s]
    k = ''.join(k)
    syl_list = []
    while k:
        end = 0
        if(k.startswith('CVCC') or k.startswith('CCCV')):
            end = 4
        elif(k.startswith('CCV') or k.startswith('CVC') or k.startswith('VCC')):
            end = 3
        elif(k.startswith('VC') or k.startswith('CV')):
            end = 2
        elif(k.startswith('V')):
            end = 1
        else:
            print "Syllables couldn't be computed: ", k, s
            return None
        syl_list.append(s[0:end])
        s = s[end:]
        k = k[end:]
    return syl_list

def phoneme_syllables(l):
    arp_vowels = ['AA','AE','AH','AO','AW','AY','EH','ER','EY','IH',
                    'IY','OW','OY','UH','UW']
    pk = ['V' if any(v in x for v in arp_vowels) else 'C' for x in l]
    pk = ''.join(pk)
    syl_list = []
    while pk:
        end = 0
        if(pk.startswith('CVCC') or pk.startswith('CCCV')):
            end = 4
        elif(pk.startswith('CCV') or pk.startswith('CVC') or pk.startswith('VCC')):
            end = 3
        elif(pk.startswith('VC') or pk.startswith('CV')):
            end = 2
        elif(pk.startswith('V')):
            end = 1
        else:
            print "Syllables couldn't be computed: ", pk, syl_list, l
            return None
        syl_list.append(l[0:end])
        l = l[end:]
        pk = pk[end:]
    return syl_list

def str_phonem_match(s, p_list):
    """
    Input: string
    Output:
        [('per', [P, ER0]), ('fect', [F, EH1, K, T])]
    """
    syl_list = str_syllables(s)
    syl_p_list = phoneme_syllables(p_list[0])
    if len(syl_p_list) == len(syl_list):
        return zip(syl_list, syl_p_list)
    print k, s, syl_p_list, syl_list
    return [(None, None)]

print str_phonem_match('perfect', arpabet['perfect'])

它给予

^{pr2}$

我意识到,对于我的具体情况,我不需要按每个arpabet音素来区分,只要音节就足够了。 如果有人对更有效/更好的解决方案有什么建议,请告诉我!在

编辑:等等。。。因为我想要的是“per”而不是“perf”,有时顺序会不正确(应该是递归的,这样我就可以检查CVC、CVCC是对的还是V或VC是对的) 我不确定我是否真的懂语言学或音节,也不知道应该有什么样的规则。但是对于我的特定用例,我认为这会正常工作。在

相关问题 更多 >

    热门问题