g2pC: A Context-aware Grapheme-to-Phoneme Conversion module for Chinese
There are several open source libraries of Chinese grapheme-to-phoneme conversion such as python-pinyin or xpinyin. However, none of them seem to disambiguate Chinese polyphonic words like "行" ("xíng" (go, walk) vs. "háng" (line)) or "了" ("le" (completed action marker) vs. "liǎo" (finish, achieve)). Instead, they pick up the most frequent pronunciation. Although that may be a simple and economic strategy, machine learning techniques can be of help. We use CRF to determine the pronunciation of polyphonic words. In addition to the target word itself and its part-of-speech, which are tagged by pkuseg, its neighboring words are also featurized.
pip install g2pc
e.g., Input: 我写了几行代码。 (I wrote a few lines of codes.)
STEP 1. Segment input string using pkuseg.
STEP 2. Look up the CC-CEDICT. Each token, a tuple, consists of word, pos, pronunciation candidates, meaning candidates, traditional character candidates.
STEP 3. For polyphonic words, we disambiguate them, using our pre-trained CRF model.
STEP 4. Tone change rules are applied.
>>> from g2pc import G2pC
>>> g2p = G2pC()
>>> g2p("一心一意")
# This returns a list of tuples, each of which consists of
# word, pos, pinyin, (tone changed) descriptive pinyin, English meaning, and equivanlent traditional character.
[[('一心一意',
'i',
'yi1 xin1 yi1 yi4',
'yi4 xin1 yi2 yi4',
"/concentrating one's thoughts and efforts/single-minded/bent on/intently/",
'一心一意')]
>>> text1 = "我写了几行代码。" # pay attention to the 行, which should be read as 'hang2', not 'xing2'
>>> text2 = "来不了" # pay attention to the 了, which should be read as 'liao3', not 'le'
# python-pinyin
>>> pip install pypinyin
>>> from pypinyin import pinyin
>>> pinyin(text1)
[['wǒ'], ['xiě'], ['le'], ['jǐ'], ['xíng'], ['dài'], ['mǎ'], ['。']]
>>> pinyin(text2)
[['lái'], ['bù'], ['le']]
# xpinyin
>>> pip install xpinyin
>>> from xpinyin import Pinyin
>>> p = Pinyin()
>>> p.get_pinyin(text1, tone_marks="numbers")
'wo3-xie3-le5-ji1-xing2-dai4-ma3-。'
>>> p.get_pinyin(text2, tone_marks="numbers")
'lai2-bu4-le5'
Model | # Correct | # Incorrect | Acc. (%) |
---|---|---|---|
g2pC (0.9.9.3) | 13,033 | 158 | 98.80 |
pypinyin (0.35.3) | 12,975 | 216 | 98.36 |
xpinyin (0.5.6) | 12,838 | 353 | 97.32 |
Accuracy
cedict.pkl
.cedict.pkl
.If you use our software for research, please cite:
@misc{gp2C2019,
author = {Park, Kyubyong},
title = {g2pC},
year = {2019},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/Kyubyong/g2pC}}
}