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”?

【问题讨论】:

首先,您需要一本带发音的正确词典。然后你必须意识到 littleacrenthpsst 都是不运动的词- 传统元音,因为 littleacre 中的 e 是无声的,但它们有两个音节,证明 lr 是这些词中的元音。当然m是两音节词rhythm中的元音。类似地,nthpsst 在这两个单音节词中显然有 ns 作为元音。 firefiery 有多少个音节? queue 有多少个元音? Yspy 中是元音,但在 yes 中不是。 【参考方案1】:

它比简单的正则表达式更复杂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))

输出

“嗨,你好吗?” → “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”添加到字符串中的每个发音元音?的主要内容,如果未能解决你的问题,请参考以下文章

Python如何将列表中的元素添加到另一个字符串列表中

我如何创建将单词添加到字符串python的循环

如何将整数迭代附加到python中的字符串中?

将字符串添加到字典中的所有键(Python)

如何将动态生成的pdf文件添加到zipfile Python?

如何将 Python 字符串变量添加到 Python 中 SQL 字符串变量的一部分?