Python:如何将字符串'ub'添加到字符串中的每个发音元音?

时间:2012-02-29 19:57:09

标签: python regex string nlp

示例:发言 - > Spubeak,more info here

不要给我一个解决方案,但请指出正确的方向或告诉我可以使用哪个python库?我正在考虑正则表达式,因为我必须找到一个元音,但是我可以使用哪种方法在元音前插入'ub'?

3 个答案:

答案 0 :(得分:9)

它比一个简单的正则表达式e.g.,

更复杂
"Hi, how are you?" → "Hubi, hubow ubare yubou?"

简单的正则表达式不会发现eare没有发音。

您需要一个提供发音词典的库,例如nltk.corpus.cmudict

from nltk.corpus import cmudict # $ pip install nltk
# $ python -c "import nltk; nltk.download('cmudict')"

def spubeak(word, pronunciations=cmudict.dict()):
    istitle = word.istitle() # remember, to preserve titlecase
    w = word.lower() #note: ignore Unicode case-folding
    for syllables in pronunciations.get(w, []):
        parts = []
        for syl in syllables:
            if syl[:1] == syl[1:2]:
                syl = syl[1:] # remove duplicate
            isvowel = syl[-1].isdigit()
            # pronounce the word
            parts.append('ub'+syl[:-1] if isvowel else syl)
        result = ''.join(map(str.lower, parts))
        return result.title() if istitle else result
    return word # word not found in the dictionary

示例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re

sent = "Hi, how are you?"
subent = " ".join(["".join(map(spubeak, re.split("(\W+)", nonblank)))
                   for nonblank in sent.split()])
print('"{}" → "{}"'.format(sent, subent))

输出

"Hi, how are you?" → "Hubay, hubaw ubar yubuw?"

注意:它与第一个示例不同:每个单词都被其音节替换。

答案 1 :(得分:3)

您可以使用正则表达式进行替换。请参阅re.sub

示例:

>>> import re
>>> re.sub(r'(e)', r'ub\1', 'speak')
'spubeak'

您需要阅读正则表达式组的文档等。您还需要弄清楚如何匹配不同的元音而不仅仅是示例中的元音。

对于在Python中使用正则表达式作为发音词典的一些好主意(和代码),请查看此链接,该链接是Cainteoir项目的设计页面之一:http://rhdunn.github.com/cainteoir/rules.html

Cainteoir的文本到语音规则引擎设计(尚未完全实现)使用正则表达式。另请参阅Cainteoir作者的另一篇文章Pronunciation Dictionaries and Regexes

答案 2 :(得分:1)

正则表达式确实是最佳路线。如果您不确定如何继续,请检查捕获组的工作方式,以及如何将其包含在替换中。