汉字拼音转换工具(Python 版)¶
将汉字转为拼音。可以用于汉字注音、排序、检索(Russian translation) 。
基于 hotoo/pinyin 开发。
- Documentation: http://pypinyin.rtfd.io
- GitHub: https://github.com/mozillazg/python-pinyin
- License: MIT license
- PyPI: https://pypi.org/project/pypinyin
- Python version: 2.7, pypy, pypy3, 3.4, 3.5, 3.6, 3,7
特性¶
- 根据词组智能匹配最正确的拼音。
- 支持多音字。
- 简单的繁体支持, 注音支持。
- 支持多种不同拼音风格。
Contents¶
安装¶
可以使用 pip 进行安装:
$ pip install pypinyin
easy_install 安装:
$ easy_install pypinyin
源码安装:
$ python setup.py install
使用¶
示例¶
>>> from pypinyin import pinyin, lazy_pinyin, Style
>>> pinyin('中心')
[['zhōng'], ['xīn']]
>>> pinyin('中心', heteronym=True) # 启用多音字模式
[['zhōng', 'zhòng'], ['xīn']]
>>> pinyin('中心', style=Style.FIRST_LETTER) # 设置拼音风格
[['z'], ['x']]
>>> pinyin('中心', style=Style.TONE2, heteronym=True)
[['zho1ng', 'zho4ng'], ['xi1n']]
>>> lazy_pinyin('中心') # 不考虑多音字的情况
['zhong', 'xin']
注意事项 :
- 拼音结果不会标明哪个韵母是轻声,轻声的韵母没有声调或数字标识。
- 无声调相关拼音风格下的结果会使用
v
表示ü
。
处理不包含拼音的字符¶
当程序遇到不包含拼音的字符(串)时,会根据 errors
参数的值做相应的处理:
default
(默认行为): 不做任何处理,原样返回:pinyin('你好☆☆') [['nǐ'], ['hǎo'], ['☆☆']]
ignore
: 忽略该字符pinyin('你好☆☆', errors='ignore') [['nǐ'], ['hǎo']]
replace
: 替换为去掉\u
的 unicode 编码:pinyin('你好☆☆', errors='replace') [['nǐ'], ['hǎo'], ['26062606']]
callable 对象 : 提供一个回调函数,接受无拼音字符(串)作为参数, 支持的返回值类型:
unicode
或list
或None
。:pinyin('你好☆☆', errors=lambda x: 'star') [['nǐ'], ['hǎo'], ['star']] pinyin('你好☆☆', errors=lambda x: None) [['nǐ'], ['hǎo']]
返回值类型为
list
时,会自动 expend listpinyin('你好☆☆', errors=lambda x: ['star' for _ in x]) [['nǐ'], ['hǎo'], ['star'], ['star']] # 指定多音字 pinyin('你好☆☆', heteronym=True, errors=lambda x: [['star', '☆'] for _ in x]) [['nǐ'], ['hǎo'], ['star', '☆'], ['star', '☆']]
自定义拼音库¶
如果对结果不满意,可以通过
load_single_dict()
或
load_phrases_dict()
以自定义拼音库的方式修正结果:
>> from pypinyin import lazy_pinyin, load_phrases_dict, Style, load_single_dict
>> hans = '桔子'
>> lazy_pinyin(hans, style=Style.TONE2)
['jie2', 'zi3']
>> load_phrases_dict({'桔子': [['jú'], ['zǐ']]}) # 增加 "桔子" 词组
>> lazy_pinyin(hans, style=Style.TONE2)
['ju2', 'zi3']
>>
>> hans = '还没'
>> lazy_pinyin(hans, style=Style.TONE2)
['hua2n', 'me2i']
>> load_single_dict({ord('还'): 'hái,huán'}) # 调整 "还" 字的拼音顺序
>>> lazy_pinyin('还没', style=Style.TONE2)
['ha2i', 'me2i']
自定义拼音风格¶
可以通过 register()
来实现自定义拼音风格的需求:
In [1]: from pypinyin import lazy_pinyin
In [2]: from pypinyin.style import register
In [3]: @register('kiss')
...: def kiss(pinyin, **kwargs):
...: return '😘 {0}'.format(pinyin)
...:
In [4]: lazy_pinyin('么么', style='kiss')
Out[4]: ['😘 me', '😘 me']
strict
参数的影响¶
strict
参数用于控制处理声母和韵母时是否严格遵循 《汉语拼音方案》 标准:
In [1]: from pypinyin import Style, lazy_pinyin
In [2]: lazy_pinyin('乌', style=Style.TONE)
Out[2]: ['wū']
In [3]: lazy_pinyin('乌', style=Style.INITIALS)
Out[3]: ['']
In [4]: lazy_pinyin('乌', style=Style.INITIALS, strict=False)
Out[4]: ['w']
In [5]: lazy_pinyin('迂', style=Style.TONE)
Out[5]: ['yū']
In [6]: lazy_pinyin('迂', style=Style.FINALS_TONE)
Out[6]: ['ǖ']
In [7]: lazy_pinyin('迂', style=Style.FINALS_TONE, strict=False)
Out[7]: ['ū']
当 strict=True
时根据 《汉语拼音方案》 的如下规则处理声母、在韵母相关风格下还原正确的韵母:
- 21 个声母:
b p m f d t n l g k h j q x zh ch sh r z c s
(y, w 不是声母) - i行的韵母,前面没有声母的时候,写成yi(衣),ya(呀),ye(耶),yao(腰),you(忧),yan(烟), yin(因),yang(央),ying(英),yong(雍)。(y 不是声母)
- u行的韵母,前面没有声母的时候,写成wu(乌),wa(蛙),wo(窝),wai(歪),wei(威),wan(弯), wen(温),wang(汪),weng(翁)。(w 不是声母)
- ü行的韵母,前面没有声母的时候,写成yu(迂),yue(约),yuan(冤),yun(晕);ü上两点省略。 (韵母相关风格下还原正确的韵母 ü)
- ü行的韵跟声母j,q,x拼的时候,写成ju(居),qu(区),xu(虚),ü上两点也省略; 但是跟声母n,l拼的时候,仍然写成nü(女),lü(吕)。(韵母相关风格下还原正确的韵母 ü)
- iou,uei,uen前面加声母的时候,写成iu,ui,un。例如niu(牛),gui(归),lun(论)。 (韵母相关风格下还原正确的韵母 iou,uei,uen)
当 strict=False
时就是不遵守上面的规则来处理声母和韵母,
比如:y
, w
会被当做声母,yu(迂) 的韵母就是一般认为的 u
等。
具体差异可以查看 tests/test_standard.py 中的对比结果测试用例
命令行工具¶
程序内置了一个命令行工具 pypinyin
:
$ pypinyin 音乐
yīn yuè
$ pypinyin -h
命令行工具支持如下参数:
$ pypinyin -h
usage: pypinyin [-h] [-V] [-f {pinyin,slug}]
[-s {NORMAL,zhao,TONE,zh4ao,TONE2,zha4o,TONE3,zhao4,INITIALS,zh,FIRST_LETTER,z,FINALS,ao,FINALS_TONE,4ao,FINALS_TONE2,a4o,FINALS_TONE3,ao4,BOPOMOFO,BOPOMOFO_FIRST,CYRILLIC,CYRILLIC_FIRST}]
[-p SEPARATOR] [-e {default,ignore,replace}] [-m]
hans
convert chinese to pinyin.
positional arguments:
hans chinese string
optional arguments:
-h, --help show this help message and exit
-V, --version show program's version number and exit
-f {pinyin,slug}, --func {pinyin,slug}
function name (default: "pinyin")
-s {NORMAL,zhao,TONE,zh4ao,TONE2,zha4o,TONE3,zhao4,INITIALS,zh,FIRST_LETTER,z,FINALS,ao,FINALS_TONE,4ao,FINALS_TONE2,a4o,FINALS_TONE3,ao4,BOPOMOFO,BOPOMOFO_FIRST,CYRILLIC,CYRILLIC_FIRST}, --style {NORMAL,zhao,TONE,zh4ao,TONE2,zha4o,TONE3,zhao4,INITIALS,zh,FIRST_LETTER,z,FINALS,ao,FINALS_TONE,4ao,FINALS_TONE2,a4o,FINALS_TONE3,ao4,BOPOMOFO,BOPOMOFO_FIRST,CYRILLIC,CYRILLIC_FIRST}
pinyin style (default: "zh4ao")
-p SEPARATOR, --separator SEPARATOR
slug separator (default: "-")
-e {default,ignore,replace}, --errors {default,ignore,replace}
how to handle none-pinyin string (default: "default")
-m, --heteronym enable heteronym
-s
, --style
参数可以选值的含义如下:
-s 或 –style 的值 | 对应的拼音风格 |
---|---|
zhao | NORMAL |
zh4ao | TONE |
zha4o | TONE2 |
zhao4 | TONE3 |
zh | INITIALS |
z | FIRST_LETTER |
ao | FINALS |
4ao | FINALS_TONE |
a4o | FINALS_TONE2 |
ao4 | FINALS_TONE3 |
NORMAL | NORMAL |
TONE | TONE |
TONE2 | TONE2 |
TONE3 | TONE3 |
INITIALS | INITIALS |
FIRST_LETTER | FIRST_LETTER |
FINALS | FINALS |
FINALS_TONE | FINALS_TONE |
FINALS_TONE2 | FINALS_TONE2 |
FINALS_TONE3 | FINALS_TONE3 |
BOPOMOFO | BOPOMOFO |
BOPOMOFO_FIRST | BOPOMOFO_FIRST |
CYRILLIC | CYRILLIC |
CYRILLIC_FIRST | CYRILLIC_FIRST |
API¶
拼音风格¶
-
class
pypinyin.
Style
[源代码]¶ 拼音风格
-
NORMAL
= 0¶ 普通风格,不带声调。如: 中国 ->
zhong guo
-
TONE
= 1¶ 标准声调风格,拼音声调在韵母第一个字母上(默认风格)。如: 中国 ->
zhōng guó
-
TONE2
= 2¶ 声调风格2,即拼音声调在各个韵母之后,用数字 [1-4] 进行表示。如: 中国 ->
zho1ng guo2
-
TONE3
= 8¶ 声调风格3,即拼音声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 ->
zhong1 guo2
-
FIRST_LETTER
= 4¶ 首字母风格,只返回拼音的首字母部分。如: 中国 ->
z g
-
FINALS
= 5¶ 韵母风格,只返回各个拼音的韵母部分,不带声调。如: 中国 ->
ong uo
-
FINALS_TONE
= 6¶ 标准韵母风格,带声调,声调在韵母第一个字母上。如:中国 ->
ōng uó
-
FINALS_TONE2
= 7¶ 韵母风格2,带声调,声调在各个韵母之后,用数字 [1-4] 进行表示。如: 中国 ->
o1ng uo2
-
FINALS_TONE3
= 9¶ 韵母风格3,带声调,声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 ->
ong1 uo2
-
BOPOMOFO
= 10¶ 注音风格,带声调,阴平(第一声)不标。如: 中国 ->
ㄓㄨㄥ ㄍㄨㄛˊ
-
BOPOMOFO_FIRST
= 11¶ 注音风格,仅首字母。如: 中国 ->
ㄓ ㄍ
-
CYRILLIC
= 12¶ 汉语拼音与俄语字母对照风格,声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 ->
чжун1 го2
-
CYRILLIC_FIRST
= 13¶ 汉语拼音与俄语字母对照风格,仅首字母。如: 中国 ->
ч г
-
核心 API¶
-
pypinyin.
pinyin
(hans, style=<Style.TONE: 1>, heteronym=False, errors='default', strict=True)[源代码]¶ 将汉字转换为拼音.
参数: - hans (unicode 字符串或字符串列表) – 汉字字符串(
'你好吗'
)或列表(['你好', '吗']
). 可以使用自己喜爱的分词模块对字符串进行分词处理, 只需将经过分词处理的字符串列表传进来就可以了。 - style – 指定拼音风格,默认是
TONE
风格。 更多拼音风格详见Style
- errors –
指定如何处理没有拼音的字符。详见 处理不包含拼音的字符
'default'
: 保留原始字符'ignore'
: 忽略该字符'replace'
: 替换为去掉\u
的 unicode 编码字符串 ('\u90aa'
=>'90aa'
)- callable 对象: 回调函数之类的可调用对象。
- heteronym – 是否启用多音字
- strict – 是否严格遵照《汉语拼音方案》来处理声母和韵母,详见 strict 参数的影响
返回: 拼音列表
返回类型: list
引发: AssertionError – 当传入的字符串不是 unicode 字符时会抛出这个异常
Usage:
>>> from pypinyin import pinyin, Style >>> import pypinyin >>> pinyin('中心') [['zhōng'], ['xīn']] >>> pinyin('中心', heteronym=True) # 启用多音字模式 [['zhōng', 'zhòng'], ['xīn']] >>> pinyin('中心', style=Style.FIRST_LETTER) # 设置拼音风格 [['z'], ['x']] >>> pinyin('中心', style=Style.TONE2) [['zho1ng'], ['xi1n']] >>> pinyin('中心', style=Style.CYRILLIC) [['чжун1'], ['синь1']]
- hans (unicode 字符串或字符串列表) – 汉字字符串(
-
pypinyin.
lazy_pinyin
(hans, style=<Style.NORMAL: 0>, errors='default', strict=True)[源代码]¶ 不包含多音字的拼音列表.
与
pinyin()
的区别是返回的拼音是个字符串, 并且每个字只包含一个读音.参数: - hans (unicode or list) – 汉字
- style – 指定拼音风格,默认是
NORMAL
风格。 更多拼音风格详见Style
。 - errors – 指定如何处理没有拼音的字符,详情请参考
pinyin()
- strict – 是否严格遵照《汉语拼音方案》来处理声母和韵母,详见 strict 参数的影响
返回: 拼音列表(e.g.
['zhong', 'guo', 'ren']
)返回类型: list
引发: AssertionError – 当传入的字符串不是 unicode 字符时会抛出这个异常
Usage:
>>> from pypinyin import lazy_pinyin, Style >>> import pypinyin >>> lazy_pinyin('中心') ['zhong', 'xin'] >>> lazy_pinyin('中心', style=Style.TONE) ['zhōng', 'xīn'] >>> lazy_pinyin('中心', style=Style.FIRST_LETTER) ['z', 'x'] >>> lazy_pinyin('中心', style=Style.TONE2) ['zho1ng', 'xi1n'] >>> lazy_pinyin('中心', style=Style.CYRILLIC) ['чжун1', 'синь1']
-
pypinyin.
load_single_dict
(pinyin_dict, style='default')[源代码]¶ 载入用户自定义的单字拼音库
参数: - pinyin_dict (dict) – 单字拼音库。比如:
{0x963F: u"ā,ē"}
- style – pinyin_dict 参数值的拼音库风格. 支持 ‘default’, ‘tone2’
- pinyin_dict (dict) – 单字拼音库。比如:
-
pypinyin.
load_phrases_dict
(phrases_dict, style='default')[源代码]¶ 载入用户自定义的词语拼音库
参数: - phrases_dict (dict) – 词语拼音库。比如:
{u"阿爸": [[u"ā"], [u"bà"]]}
- style – phrases_dict 参数值的拼音库风格. 支持 ‘default’, ‘tone2’
- phrases_dict (dict) – 词语拼音库。比如:
-
pypinyin.
slug
(hans, style=<Style.NORMAL: 0>, heteronym=False, separator='-', errors='default', strict=True)[源代码]¶ 生成 slug 字符串.
参数: - hans (unicode or list) – 汉字
- style – 指定拼音风格,默认是
NORMAL
风格。 更多拼音风格详见Style
- heteronym – 是否启用多音字
- separstor – 两个拼音间的分隔符/连接符
- errors – 指定如何处理没有拼音的字符,详情请参考
pinyin()
- strict – 是否严格遵照《汉语拼音方案》来处理声母和韵母,详见 strict 参数的影响
返回: slug 字符串.
引发: AssertionError – 当传入的字符串不是 unicode 字符时会抛出这个异常
>>> import pypinyin >>> from pypinyin import Style >>> pypinyin.slug('中国人') 'zhong-guo-ren' >>> pypinyin.slug('中国人', separator=' ') 'zhong guo ren' >>> pypinyin.slug('中国人', style=Style.FIRST_LETTER) 'z-g-r' >>> pypinyin.slug('中国人', style=Style.CYRILLIC) 'чжун1-го2-жэнь2'
风格转换¶
-
pypinyin.style.
register
(style, func=None)[源代码]¶ 注册一个拼音风格实现
@register('echo') def echo(pinyin, **kwargs): return pinyin # or register('echo', echo)
-
pypinyin.style.
convert
(pinyin, style, strict, default=None, **kwargs)[源代码]¶ 根据拼音风格把原始拼音转换为不同的格式
参数: - pinyin (unicode) – 原始有声调的单个拼音
- style – 拼音风格
- strict (bool) – 是否严格遵照《汉语拼音方案》来处理声母和韵母,详见 strict 参数的影响
- default – 拼音风格对应的实现不存在时返回的默认值
返回: 按照拼音风格进行处理过后的拼音字符串
返回类型: unicode
分词¶
-
pypinyin.contrib.mmseg.
seg
= <pypinyin.contrib.mmseg.Seg object>¶ 基于内置词库的最大正向匹配分词器。使用:
>>> from pypinyin.contrib.mmseg import seg >>> text = '你好,我是中国人,我爱我的祖国' >>> seg.cut(text) <generator object Seg.cut at 0x10b2df2b0> >>> list(seg.cut(text)) ['你好', ',', '我', '是', '中国人', ',', '我', '爱', '我的', '祖', '国'] >>> seg.train(['祖国', '我是']) >>> list(seg.cut(text)) ['你好', ',', '我是', '中国人', ',', '我', '爱', '我的', '祖国'] >>>
开发文档¶
准备开发环境¶
$ virtualenv venv
$ . venv/bin/activate
(venv) $ pip install -U -r requirements_dev.txt
(venv) $ pip install -e .
(venv) $ pre-commit install
TODO: 把这个步骤放到一个 make 命令中。
注解
推荐在 Python 3.6+ 环境下进行开发。
测试¶
可以通过 make test
命令在当前 Python 版本下运行单元测试:
(venv) $ make test
可以通过 tox
测试程序在多个 Python 版本下的单元测试结果(这一步也可以在提 PR 的时候通过 CI 来运行):
(venv) $ tox
注解
如果对测试有疑问或者有些测试实在无法通过,可以先提交 PR 大家一起来看看。
目录结构¶
关键文件和目录
$ tree -L 2
.
├── CHANGELOG.rst # 更新日志
├── Makefile
├── README.rst
├── docs # 文档
├── gen_phrases_dict.py # 生成 phrases_dict.py 的脚本
├── gen_pinyin_dict.py # 生成 pinyin_dict.py 的脚本
├── phrase-pinyin-data # gen_phrases_dict.py 使用的数据源
├── pinyin-data # gen_pinyin_dict.py 使用的数据源
├── pypinyin # pypinyin 模块源代码
│ ├── __init__.py
│ ├── __main__.py # 命令行程序的入口
│ ├── compat.py
│ ├── constants.py
│ ├── contrib # 目前包含了一个分词模块
│ ├── core.py # pypinyin 模块的核心逻辑
│ ├── phonetic_symbol.py
│ ├── phrases_dict.py # 词组的拼音数据,由 gen_phrases_dict.py 生成
│ ├── pinyin_dict.py # 单个汉字的拼音数据,由 gen_pinyin_dict.py 生成
│ ├── runner.py # 命令行程序的主逻辑
│ ├── standard.py # strict=True 时的拼音转换逻辑
│ ├── style # 各种拼音风格在 style 目录下实现
│ ├── utils.py
├── pytest.ini
├── requirements_dev.txt
├── setup.cfg
├── setup.py
├── tests
├── tox.ini
实现思路/主逻辑¶
主逻辑:
- 对输入的字符串按是否是汉字进行分词(
seg
) - 对分词结果的每个词条进行获取词条拼音的逻辑
- 检查词条是否是汉字,不是汉字则走处理没有拼音数据的逻辑(
handle_nopinyin
) - 检查词条是否在
PHRASES_DICT
中,如果在直接取PHRASES_DICT
中这个词条的拼音数据 - 如果词条不在
PHRASES_DICT
中,遍历词条包含的字符,每个字符进行single_pinyin
逻辑处理
- 检查词条是否是汉字,不是汉字则走处理没有拼音数据的逻辑(
single_pinyin
的逻辑:- 检查字符是否在
PINYIN_DICT
中,如果在的话,取PINYIN_DICT
中这个字符的拼音数据 - 如果不在的话,走
handle_nopinyin
逻辑
- 检查字符是否在
handle_nopinyin
逻辑: 根据errors
参数的值返回不同的结果。- 对上面的步骤获得的拼音数据按指定的拼音风格进行转换。
PHRASES_DICT
:词组拼音数据PINYIN_DICT
: 单个汉字的拼音数据
TODO: 画流程图
发布新版本¶
- 切分到 develop 分支
- rebase master 分支的代码:
make rebase_master
- 通过
make gen_data
生成最新的数据文件 - 通过
make test
跑测试 - 更新 CHANGELOG
- 提交代码
- 检查 develop 分支的 CI 结果
- 切换到 master 分支
- 合并 develop 分支代码:
git merge_dev
- 更新版本号:
- 大改动(1.1.x -> 1.2.x):
make bump_minor
- 小改动(1.1.1 -> 1.1.2):
make bump_patch
- 大改动(1.1.x -> 1.2.x):
- 发布到 test pypi:
make publish_test
- 安装和测试发布到 test pypi 上的版本
- 发布到 pypi:
make publish
- 安装和测试发布到 pypi 上的版本
- 提交 master 分支代码,更新 develop 分支代码,进入下一个开发阶段:
make start_next
FAQ¶
如何禁用内置的“词组拼音库”¶
设置环境变量 PYPINYIN_NO_PHRASES=true
即可
INITIALS
声母风格下,以 y
, w
, yu
开头的汉字返回空字符串¶
比如:
pinyin('火影忍者', style=Style.INITIALS) [['h'], [''], ['r'], ['zh']]
因为 y
, w
, yu
都不是声母。参考:
hotoo/pinyin#57,
#22,
#27,
#44
声母风格(INITIALS)下,“雨”、“我”、“圆”等汉字返回空字符串,因为根据 《汉语拼音方案》 , y,w,ü (yu) 都不是声母,在某些特定韵母无声母时,才加上 y 或 w,而 ü 也有其特定规则。 如果你觉得这个给你带来了麻烦,那么也请小心一些无声母的汉字(如“啊”、“饿”、“按”、“昂”等)。 这时候你也许需要的是首字母风格(FIRST_LETTER)。 —— @hotoo
如果觉得这个行为不是你想要的,就是想把 y 当成声母的话,可以指定 strict=False
, 这个可能会符合你的预期。详见 strict 参数的影响
Changelog¶
0.35.3 (2019-05-11)¶
- [Bugfixed] 修复鼻音
m̀
无法转换为不含声调结果的问题。 - [Improved] 使用 phrase-pinyin-data v0.10.0 的词语拼音数据。 Fixed #166 #167 #169 #170
- [Improved] Windows CI 增加在 x64 下跑测试 (via #164 Thanks @hanabi1224)
0.35.2 (2019-04-06)¶
- [Improved] 使用 phrase-pinyin-data v0.9.2 的词语拼音数据。 Fixed #159 #160
- [Improved] 使用 pinyin-data v0.7.0 的拼音数据。
0.35.0 (2019-02-24)¶
- [Improved] 使用 phrase-pinyin-data v0.9.0 的词语拼音数据。 Fixed #154 #149
- [New] 支持
朝阳
这种一个词多个音('朝阳': [['zhāo', 'cháo'], ['yáng']]
)在多音字模式下输出多个音。 Fixed #154
0.34.1 (2018-12-30)¶
- [Improved] 使用 phrase-pinyin-data v0.8.5 的词语拼音数据。 Fixed #151
0.34.0 (2018-12-08)¶
不兼容旧版的变更¶
[Changed] 当
errors
参数的值是个回调对象并且返回值是个list
时, 会使用这个 list 来 extend 结果 list (via #147 . Thanks @howl-anderson )# 更新前 >>> pinyin('你好☆☆', errors=lambda x: ['star' for _ in x]) [['nǐ'], ['hǎo'], ['star', 'star']] # 更新后 >>> pinyin('你好☆☆', errors=lambda x: ['star' for _ in x]) [['nǐ'], ['hǎo'], ['star'], ['star']]
详见文档: https://pypinyin.readthedocs.io/zh_CN/develop/usage.html#handle-no-pinyin
0.33.1 (2018-09-23)¶
- [Improved] 使用 pinyin-data v0.6.2 的拼音数据。
- [Improved] 使用 phrase-pinyin-data v0.8.4 的词语拼音数据。
0.33.0 (2018-08-05)¶
- [Bugfixed] 修复命令行程序在
sys.stdin.encoding
为None
时无法正常工作的问题。 - [Improved] 使用 pinyin-data v0.6.1 的拼音数据。
- [Improved] 使用 phrase-pinyin-data v0.8.3 的词语拼音数据。
- Fixed #137
- [Changed] 不再测试 Python 2.6 和 Python 3.3,增加测试 Python 3.7 和 PyPy3 即不保证程序兼容 Python 2.6 和 Python 3.3。
0.32.0 (2018-07-28)¶
- [Improved] 使用 pinyin-data v0.6.0 的拼音数据。
- [Improved] 使用 phrase-pinyin-data v0.8.2 的词语拼音数据。
0.30.1 (2018-04-25)¶
- [Improved] 更新文档和测试。(via 7fa0b87)
- [Improved] 对用户传入的已进行分词处理的数据进行二次分词以便提高准确性。(via #126)
- [Improved] 使用 pinyin-data v0.5.1 的拼音数据。(via #125)
0.30.0 (2018-02-03)¶
- [New] 支持有拼音的非汉字字符
〇
(via #119)。 - [Changed] 修复之前无意中把
pinyin
函数中的strict
参数的默认值修改为了False
, 现在把strict
参数的默认值恢复为预期的True
(via #121)。关于strict
参数的影响详见文档: strict 参数的影响
0.26.1 (2017-10-25)¶
- [Improved] 使用 phrase-pinyin-data v0.5.1 的词语拼音数据。fixed #106
0.25.0 (2017-10-01)¶
[New] 内置一个最大匹配分词模块,使用内置的词语拼音库来训练这个分词模块, 解决自定义词语库有时可能不生效的问题(因为这个词语在 jieba 等分词模块中不是可用词)。(via #81)
获取拼音或自定义词库后使用:
>>> from pypinyin import pinyin, load_phrases_dict >>> load_phrases_dict({'了局': [['liǎo'], ['jú']]}) >>> pinyin('了局啊') # 使用 jieba 分词 Building prefix dict from the default dictionary ... Dumping model to file cache /var/folders/s6/z9r_07h53pj_d4x7qjszwmbw0000gn/T/jieba.cache Loading model cost 1.175 seconds. Prefix dict has been built succesfully. [['le'], ['jú'], ['a']] >>> from pypinyin.contrib.mmseg import seg, retrain >>> retrain(seg) # 没有使用 load_phrases_dict 时可以不调用这个函数 >>> pinyin(seg.cut('了局啊')) # 使用内置的最大匹配分词 [['liǎo'], ['jú'], ['a']] >>>
单独使用:
>>> from pypinyin.contrib.mmseg import seg >>> text = '你好,我是中国人,我爱我的祖国' >>> seg.cut(text) <generator object Seg.cut at 0x10b2df2b0> >>> list(seg.cut(text)) ['你好', ',', '我', '是', '中国人', ',', '我', '爱', '我的', '祖', '国'] >>> seg.train(['祖国', '我是']) >>> list(seg.cut(text)) ['你好', ',', '我是', '中国人', ',', '我', '爱', '我的', '祖国'] >>>
0.23.0 (2017-07-09)¶
- [New] 使用 phrase-pinyin-data v0.5.0 的词语拼音数据。
0.22.0 (2017-06-14)¶
- [New] 支持 IronPython (via #86). Thanks @LevyLession
0.21.1 (2017-05-29)¶
- [Bugfixed] 修复在 Python 2 下通过 pip install 安装 wheel 格式的安装包后, 无法正常使用的问题。(Python 2 下没有自动安装依赖包)
0.21.0 (2017-05-14)¶
[New] 重构各拼音风格实现,支持自定义拼音风格或覆盖已有拼音风格的实现.
from pypinyin.style import register @register('style1') def func(pinyin, **kwargs): # pinyin = xxx # convert to style1 return pinyin def func(pinyin, **kwargs): # pinyin = xxx # convert to style2 return pinyin register('style2', func=func)
0.20.0 (2017-05-13)¶
[New] 增加
strict
参数来控制处理声母和韵母时是否严格遵循 《汉语拼音方案》 标准。当
strict=True
时根据 《汉语拼音方案》 的如下规则处理声母、在韵母相关风格下还原正确的韵母:- 21 个声母:
b p m f d t n l g k h j q x zh ch sh r z c s
(y, w 不是声母) - i行的韵母,前面没有声母的时候,写成yi(衣),ya(呀),ye(耶),yao(腰),you(忧),yan(烟),yin(因),yang(央),ying(英),yong(雍)。(y 不是声母)
- u行的韵母,前面没有声母的时候,写成wu(乌),wa(蛙),wo(窝),wai(歪),wei(威),wan(弯),wen(温),wang(汪),weng(翁)。(w 不是声母)
- ü行的韵母,前面没有声母的时候,写成yu(迂),yue(约),yuan(冤),yun(晕);ü上两点省略。(韵母相关风格下还原正确的韵母 ü)
- ü行的韵跟声母j,q,x拼的时候,写成ju(居),qu(区),xu(虚),ü上两点也省略; 但是跟声母n,l拼的时候,仍然写成nü(女),lü(吕)。(韵母相关风格下还原正确的韵母 ü)
- iou,uei,uen前面加声母的时候,写成iu,ui,un。例如niu(牛),gui(归),lun(论)。(韵母相关风格下还原正确的韵母 iou,uei,uen)
具体差异可以查看 tests/test_standard.py 中的对比结果测试用例
- 21 个声母:
[Changed] 改为使用 enum 定义拼音风格(兼容旧版本)
0.19.0 (2017-05-05)¶
[New] 韵母风格下根据 汉语拼音方案 还原原始的
iou
,uei
,uen
韵母。iou,uei,uen前面加声母的时候,写成iu,ui,un。 例如niu(牛),gui(归),lun(论)。即:
- niu 的韵母是 iou
- gui 的韵母是 uei
- lun 的韵母是 uen
[Fixed] 修复韵母相关风格下没有正确处理
wu
的韵母的问题 (比如:无
在FINALS_TONE
风格下的结果是uú
的问题) 。[Fixed] 修复漏了 ǖ -> v1 的转换。
0.18.2 (2017-04-25)¶
- [Fixed] 使用 phrase-pinyin-data v0.4.1 的词语拼音数据, fixed #72 。
0.18.0 (2017-03-22)¶
- [Changed] 使用 phrase-pinyin-data v0.4.0 的词语拼音数据。
0.17.0 (2017-03-13)¶
- [Changed] 词语拼音数据改为使用来自 phrase-pinyin-data v0.3.1 的拼音数据。
- [Fixed] 修正
斯事体大
的拼音。
0.16.1 (2017-02-12)¶
- [Improved] 使用 pinyin-data v0.4.1 的拼音数据. fixed #58
- [Improved] 更新 厦门 的拼音. fixed #59
0.16.0 (2016-11-27)¶
[New] Added new pinyin styles -
CYRILLIC
(汉语拼音与俄语字母对照表) andCYRILLIC _FIRST
(via #55 thanks @tyrbonit)>>> pypinyin.pinyin('中心', style=pypinyin.CYRILLIC) [['чжун1'], ['синь1']] >>> pypinyin.pinyin('中心', style=pypinyin.CYRILLIC_FIRST) [['ч'], ['с']]
[New] Added Russian translation README (README_ru.rst)
[New] Command-line tool supported the new pinyin styles:
CYRILLIC, CYRILLIC_FIRST
0.15.0 (2016-10-18)¶
- [Changed] 使用 pinyin-data v0.4.0 的拼音数据
0.14.0 (2016-09-24)¶
[New] 新增注音
BOPOMOFO
及注音首字母BOPOMOFO_FIRST
风格(via #51 thanks @gumblex @Artoria2e5)>>> pypinyin.pinyin('中心', style=pypinyin.BOPOMOFO) [['ㄓㄨㄥ'], ['ㄒㄧㄣ']] >>> pypinyin.pinyin('中心', style=pypinyin.BOPOMOFO_FIRST) [['ㄓ'], ['ㄒ']]
[New] 新增音调在拼音后的
TONE3
以及FINALS_TONE3
风格(via #51 thanks @gumblex @Artoria2e5 )>>> pypinyin.pinyin('中心', style=pypinyin.TONE3) [['zhong1'], ['xin1']] >>> pypinyin.pinyin('中心', style=pypinyin.FINALS_TONE3) [['ong1'], ['in1']]
[New] 命令行程序支持新增的四个风格:
TONE3, FINALS_TONE3, BOPOMOFO, BOPOMOFO_FIRST
[Bugfixed] 修复 TONE2 中 ü 标轻声的问题(像 侵略 -> qi1n lv0e4),以及去除文档中 0 表示轻声(via #51 thanks @gumblex)
0.13.0 (2016-08-19)¶
- [Changed] 分离词组库中包含中文逗号的词语(via f097b6a)
- [Changed] 使用 pinyin-data v0.3.0 的拼音数据
0.12.1 (2016-05-11)¶
- [Bugfixed] 修复一些词语存在拼音粘连在一起的情况. (#41 thanks @jolly-tao )
0.12.0 (2016-03-12)¶
[Changed] 单个汉字的拼音数据改为使用来自 pinyin-data 的拼音数据。
[New] 命令行程序支持从标准输入读取汉字信息:
$ echo "你好" | pypinyin nǐ hǎo $ pypinyin < hello.txt nǐ hǎo
0.11.0 (2016-01-16)¶
- [Changed] 分割
__init__.py
为compat.py
,constants.py
,core.py
和utils.py
。 影响:__init__.py
中只保留文档中提到过的 api, 如果使用了不在文档中的 api 则需要调整代码。
0.9.5 (2015-12-19)¶
- [Bugfixed] 修复未正确处理鼻音(详见 汉语拼音 - 维基百科 )的问题(#31 thanks @xulin97 ):
ḿ、ń、ň、ǹ
对应 “呒”、“呣”、“唔”、“嗯”等字。 这些字之前在各种风格下都输出原始的汉字而不是拼音。
0.9.2 (2015-11-15)¶
[New]
load_single_dict
和load_phrases_dict
增加style
参数支持 TONE2 风格的拼音load_single_dict({ord(u'啊'): 'a1'}, style='tone2') load_phrases_dict({u"阿爸": [[u"a1"], [u"ba4"]]}, style='tone2'}
[Improved] Improved docs
0.8.4 (2015-08-23)¶
- [Changed]
y
,w
也不是声母. (hotoo/pinyin#57):- 以
y
,w
开头的拼音在声母(INITIALS
)模式下将返回['']
- 以
0.8.0 (2015-06-27)¶
[New] 内置简单的分词功能,完善处理没有拼音的字符 (如果不需要处理多音字问题, 现在可以不用安装
jieba
或其他分词模块了):# 之前, 安装了结巴分词模块 lazy_pinyin(u'你好abc☆☆') [u'ni', u'hao', 'a', 'b', 'c', u'\u2606', u'\u2606'] # 现在, 无论是否安装结巴分词模块 lazy_pinyin(u'你好abc☆☆') [u'ni', u'hao', u'abc\u2606\u2606']
- [Changed] 当
errors
参数是回调函数时,函数的参数由单个字符
变更为单个字符或词组
。即: 对于abc
字符串, 之前将调用三次errors
回调函数:func('a') ... func('b') ... func('abc')
现在只调用一次:func('abc')
。 [Changed] 将英文字符也纳入
errors
参数的处理范围:# 之前 lazy_pinyin(u'abc', errors='ignore') [u'abc'] # 现在 lazy_pinyin(u'abc', errors='ignore') []
0.7.0 (2015-06-20)¶
- [Bugfixed] Python 2 下无法使用
from pypinyin import *
的问题 - [New] 支持以下环境变量:
PYPINYIN_NO_JIEBA=true
: 禁用“自动调用结巴分词模块”PYPINYIN_NO_PHRASES=true
: 禁用内置的“词组拼音库”
0.6.0 (2015-06-10)¶
[New]
errors
参数支持回调函数(#17):def foobar(char): return u'a' pinyin(u'あ', errors=foobar)
0.5.6 (2015-02-26)¶
- [Bugfixed] “苹果” pinyin error. #11
- [Bugfixed] 重复 import jieba 的问题
- [Improved] 精简 phrases_dict
- [Improved] 更新文档
0.5.1 (2014-03-09)¶
[New] 参数
errors
用来控制如何处理没有拼音的字符:'default'
: 保留原始字符'ignore'
: 忽略该字符'replace'
: 替换为去掉\u
的 unicode 编码字符串(u'\u90aa'
=>u'90aa'
)
只处理
[^a-zA-Z0-9_]
字符。
0.3.0 (2013-09-26)¶
- [Bugfixed] 首字母风格无法正确处理只有韵母的汉字
- [New] 三个拼音风格:
pypinyin.STYLE_FINALS
: 韵母风格1,只返回各个拼音的韵母部分,不带声调。如:ong uo
pypinyin.STYLE_FINALS_TONE
: 韵母风格2,带声调,声调在韵母第一个字母上。如:ōng uó
pypinyin.STYLE_FINALS_TONE2
: 韵母风格2,带声调,声调在各个拼音之后,用数字 [0-4] 进行表示。如:o1ng uo2
0.2.0 (2013-09-22)¶
[Improved] 完善对中英文混合字符串的支持:
>> pypinyin.pinyin(u'你好abc') [[u'n\u01d0'], [u'h\u01ceo'], [u'abc']]
0.1.0 (2013-09-21)¶
- [New] Initial Release