Python:如何在字符串中每个发音元音前添加字符串“ ub”?

6

示例: Speak -> Spubeak, 更多信息请点击此处

请不要直接给我解决方案,而是指出正确的方向或告诉我可以使用哪个Python库?我考虑使用正则表达式,因为我需要找到元音字母,但我应该使用哪个方法在元音字母前插入'ub'呢?


8
首先,你需要一本带有发音的适当词典。然后你需要认识到,“little”、“acre”、“nth”和“psst”都是拥有非传统元音的单词,因为“little”和“acre”中的“e”是不发音的,但它们有两个音节,证明了在这些单词中“l”和“r”是元音。当然,“rhythm”中的两个音节也证明了“m”是一个元音。类似地,“nth”和“psst”显然在这两个单音节单词中有“n”和“s”作为元音。 “fire”和“fiery”各有多少个音节? “queue”中有多少个元音? “spy”中的“y”是元音,但在“yes”中不是。 - tchrist
这不是一个适合在StackOverflow上提问的好问题,因为它涉及到与编程、计算机科学或数学无关的特定语言学科目知识。 - Asclepius
3个回答

9

它比简单的正则表达式(例如)更加复杂。

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

简单的正则表达式无法捕捉到are中的e是不发音的。

您需要使用提供发音字典的库,例如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?"

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


2
我还没有看到任何一种方法能够正确地识别spY,AcRe,fIRe,fIeRY,lIttLe,rhYthM,queUe,Nth,pSst,yEarlY,但这些肯定是测试它的好东西。 - tchrist
你需要重新拼写它们。spy -> spubai, acre -> ubay-cubre, firey -> fuba-iubur-ubee - Claudiu

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

1
-1:正则表达式无法区分发音元音和不发音元音。 - Platinum Azure
2
@Platinum 首先,OP明确要求非解决方案,只是一种在元音前替换的方法。其次,您绝对可以编写一个正则表达式来区分发音元音和不发音元音。难道您真的认为不能使用正则表达式实现文本到语音合成器吗?如果您无法编写用于识别口语元音的正则表达式,那么作为一个人,您如何解析它呢? - Steven T. Snyder
2
@Platinum 这是一个链接,介绍了如何使用正则表达式生成发音字典:http://rhdunn.github.com/cainteoir/rules.html - Steven T. Snyder
1
不,你没有读错问题标题。*Python:如何在字符串中的每个发音元音前添加字符串'ub'*(强调我的)。 - Platinum Azure
@Platinum,你还应该注意到原帖中写道:“不要给我一个解决方案,而是指引我正确的方向”。这也是问题的一部分... - Steven T. Snyder
请提供Cainteoir项目的链接(包含字形到音素规则的部分)。 - jfs

1

正则表达式确实是最佳选择。如果您不确定如何继续,请查看捕获组的工作原理以及如何在替换中使用它们。


1
-1:正则表达式无法区分发音元音和不发音元音。 - Platinum Azure
2
嗯,我不是以英语为母语的人,所以我不能反驳那个... OP要求提供指针来帮助他处理任务,而不是直接给出解决方案,我建议了一些他可能不知道的正则表达式功能。但我从未声称单个正则表达式替换可以完成整个技巧。 - mgibsonbr
1
公平地说,如果OP有一种方法来识别发音元音,并且可以修改字符串以标记这些元音,那么正则表达式替换可能可以进行适当的字符串替换。另一方面,上述的“标记”可以通过添加ub的形式来实现,从而使正则表达式部分变得不必要。更糟糕的是,在这种情况下,原始问题仍然存在。 - Platinum Azure

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接