Python:如何将字符串“ub”添加到字符串中的每个发音元音?
Posted
技术标签:
【中文标题】Python:如何将字符串“ub”添加到字符串中的每个发音元音?【英文标题】:Python: How to prepend the string 'ub' to every pronounced vowel in a string? 【发布时间】:2012-03-19 07:52:29 【问题描述】:示例:说话 -> Spubeak,more info here
不要给我一个解决方案,而是指出我正确的方向或告诉我可以使用哪个 python 库?我正在考虑正则表达式,因为我必须找到一个元音,但是我可以使用哪种方法在元音前面插入“ub”?
【问题讨论】:
首先,您需要一本带发音的正确词典。然后你必须意识到 little、acre、nth 和 psst 都是不运动的词- 传统元音,因为 little 和 acre 中的 e 是无声的,但它们有两个音节,证明 l 和 r 是这些词中的元音。当然m是两音节词rhythm中的元音。类似地,nth 和 psst 在这两个单音节词中显然有 n 和 s 作为元音。 fire 和 fiery 有多少个音节? queue 有多少个元音? Y 在 spy 中是元音,但在 yes 中不是。 【参考方案1】:它比简单的正则表达式更复杂e.g.,
"Hi, how are you?" → "Hubi, hubow ubare yubou?"
简单的正则表达式不会发现e
在are
中不发音。
您需要一个提供发音词典的库,例如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))
输出
“嗨,你好吗?” → “Hubay, hubaw ubar yubuw?”
注意:它与第一个示例不同:每个单词都替换为其音节。
【讨论】:
我还没有看到任何可以正确识别 spY、AcRe、fire、fiery、littLe、rhYthM、queUe、Nth、pSst、yEarlY 的方法,但是那些肯定是用来测试它的好东西。 你必须开始重新拼写它们。间谍 -> spubai, acre -> ubay-cubre, firey -> fuba-iubur-ubee【参考方案2】:您可以使用正则表达式进行替换。见re.sub
。
例子:
>>> import re
>>> re.sub(r'(e)', r'ub\1', 'speak')
'spubeak'
您需要阅读正则表达式组等的文档。您还需要弄清楚如何匹配不同的元音,而不仅仅是示例中的那个。
有关在 Python 中使用正则表达式制作发音词典的一些好主意(和代码),请查看此链接,它是 Cainteoir 项目的设计页面之一:http://rhdunn.github.com/cainteoir/rules.html
Cainteoir 的文本转语音规则引擎设计(尚未完全实现)使用正则表达式。另请参阅 Pronunciation Dictionaries and Regexes,Cainteoir 作者的另一篇文章。
【讨论】:
-1:正则表达式将无法区分发音元音和静音元音。 @Platinum 首先,OP专门要求一个非解决方案,只是在元音前面替换的一种方法。其次,您绝对可以编写一个正则表达式来区分发音元音和静音元音。您真的认为无法使用正则表达式实现文本到语音合成器吗?如果您不能编写正则表达式来识别口语元音,您如何将其解析为人? @Platinum 这里有一个链接,它描述了如何使用正则表达式生成发音词典:rhdunn.github.com/cainteoir/rules.html 不,您没有阅读问题标题。 Python:如何将字符串“ub”添加到字符串中的每个发音元音(强调我的)。 @Platinum 您还应该读到 OP 写道“不要给我解决方案,但要指出我正确的方向”。这是问题的一部分......【参考方案3】:正则表达式确实是最好的方法。如果您不确定如何继续,请检查捕获组的工作方式,以及如何将它们包含在替换中。
【讨论】:
-1:正则表达式将无法区分发音元音和静音元音。 好吧,我不是以英语为母语的人,所以我无法反驳...... OP 要求指点来帮助他处理任务,而不是一个彻底的解决方案,我建议一些他可能不知道的正则表达式的特性。但我从来没有声称一个单一的正则表达式替换就可以做到这一点。 公平地说,如果 OP 有一种方法来识别发音元音,一种修改字符串以标记这些元音的方法,那么正则表达式替换可能会进行适当的字符串替换。再说一次,前面提到的“标记”可以以添加ub
的形式出现,从而使正则表达式部分变得不必要。更糟糕的是,原来的问题仍然存在。以上是关于Python:如何将字符串“ub”添加到字符串中的每个发音元音?的主要内容,如果未能解决你的问题,请参考以下文章