Python: Как добавить строку 'ub' к каждой произносимой гласной в строке? - PullRequest
7 голосов
/ 29 февраля 2012

Пример : Speak -> Spubeak, подробнее здесь

Не предлагайте мне решение, но укажите мне правильное направление или скажите, какую библиотеку Python я мог бы использовать? Я имею в виду регулярное выражение, так как мне нужно найти гласную, но тогда какой метод я мог бы использовать, чтобы вставить «ub» перед гласной?

Ответы [ 3 ]

9 голосов
/ 01 марта 2012

Это сложнее, чем простое регулярное выражение Например,

"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))

Вывод

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

Примечание: оно отличается от первого примера: каждое слово заменяется своими слогами.

3 голосов
/ 29 февраля 2012

Вы можете использовать регулярные выражения для подстановок. См. re.sub.

Пример:

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

Вам нужно будет прочитать документацию по группам регулярных выражений и так далее. Вам также необходимо выяснить, как сочетать разные гласные, а не только один в примере.

Чтобы получить некоторые отличные идеи (и код) для использования регулярных выражений в Python для словаря произношения, взгляните на эту ссылку, которая является одной из страниц дизайна для проекта Cainteoir : http://rhdunn.github.com/cainteoir/rules.html

В механизме преобразования текста в речь Cainteoir (который еще не полностью реализован) используются регулярные выражения. См. Также Словари произношения и регулярные выражения , еще одна статья автора Cainteoir.

1 голос
/ 01 марта 2012

Регулярные выражения - действительно лучший маршрут. Если вы не знаете, как поступить, проверьте, как работают группы захвата, и как вы можете включить их в свои замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...