2017-11-28 22 views
0

これは、単語をその音素だけでなく、それに対応する部分文字列にも変換できるようにすることです。例えば、何かのように:単語の部分文字列へのアルファベットの音韻、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で '完全な'部分文字列を検索する必要のないソリューションを望んでいます。時には部分文字列は完全な単語とは異なる発音をすることがあります。

ボーナス: 私は、複数の音素は、例えば(私が間違っている場合ではない言語学の人、私を修正)部分文字列に対応する必要がありますとき、これは難しいかもしれ実現:べきである、上記の場合

foo('ignoble', d['ignoble']) 
>>> (['i','g','n','o','b', ['l', 'e'] ], [u'IH0', u'G', u'N', u'OW1', u'B', [u'AH0', u'L']] 

をLとEの両方がAH0とLの両方に対応します。

答えて

0

文字列とアルファベットの両方のリストに対して、音節文法を使っていることがわかりました。

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']) 

それは私が私の特定のケースのために実現

[('perf', [u'P', u'ER0', u'F']), ('ect', [u'EH1', u'K', u'T'])] 

を与え、私は実際には各arpabetの音素によって分離する必要はありません - ちょうど音節は十分にあります。 誰かがより効率的な/より良いソリューションのためのアドバイスを持っている場合は、私に教えてください!

編集:私は「perf」の代わりに「per」が必要なので、時には順序が間違っています(再帰的にCVC、CVCCが正しいかVかVC )私が言語学や音節について何かを本当に知っているかどうかは分かりませんが、どのような規則が必要なのかは分かりません。しかし、私の特定のユースケースについては、これは問題ないと思います。

関連する問題