🇨🇳 基于 CC-CEDICT 词典的中文转拼音工具,更准确的支持多音字的汉字转拼音解决方案。

Overview

Pinyin

Build Status Latest Stable Version Total Downloads Latest Unstable Version License Scrutinizer Code Quality Code Coverage FOSSA Status

🇨🇳 基于 CC-CEDICT 词典的中文转拼音工具,更准确的支持多音字的汉字转拼音解决方案。

安装

使用 Composer 安装:

$ composer require "overtrue/pinyin:~4.0"

使用

可选转换方案:

  • 内存型,适用于服务器内存空间较富余,优点:转换快
  • 小内存型(默认),适用于内存比较紧张的环境,优点:占用内存小,转换不如内存型快
  • I/O型,适用于虚拟机,内存限制比较严格环境。优点:非常微小内存消耗。缺点:转换慢,不如内存型转换快,php >= 5.5

可用选项:

选项 描述
PINYIN_TONE UNICODE 式音调:měi hǎo
PINYIN_ASCII_TONE 带数字式音调: mei3 hao3
PINYIN_NO_TONE 无音调:mei hao
PINYIN_KEEP_NUMBER 保留数字
PINYIN_KEEP_ENGLISH 保留英文
PINYIN_KEEP_PUNCTUATION 保留标点
PINYIN_UMLAUT_V 使用 v 代替 yu, 例如:吕 lyu 将会转为 lv

拼音数组

convert('带着希望去旅行,比到达终点更美好', PINYIN_TONE); // ["dài","zhe","xī","wàng","qù","lǚ","xíng","bǐ","dào","dá","zhōng","diǎn","gèng","měi","hǎo"] $pinyin->convert('带着希望去旅行,比到达终点更美好', PINYIN_ASCII_TONE); //["dai4","zhe","xi1","wang4","qu4","lyu3","xing2","bi3","dao4","da2","zhong1","dian3","geng4","mei3","hao3"] ">
use Overtrue\Pinyin\Pinyin;

// 小内存型
$pinyin = new Pinyin(); // 默认
// 内存型
// $pinyin = new Pinyin('\\Overtrue\\Pinyin\\MemoryFileDictLoader');
// I/O型
// $pinyin = new Pinyin('\\Overtrue\\Pinyin\\GeneratorFileDictLoader');

$pinyin->convert('带着希望去旅行,比到达终点更美好');
// ["dai", "zhe", "xi", "wang", "qu", "lyu", "xing", "bi", "dao", "da", "zhong", "dian", "geng", "mei", "hao"]

$pinyin->convert('带着希望去旅行,比到达终点更美好', PINYIN_TONE);
// ["dài","zhe","xī","wàng","qù","lǚ","xíng","bǐ","dào","dá","zhōng","diǎn","gèng","měi","hǎo"]

$pinyin->convert('带着希望去旅行,比到达终点更美好', PINYIN_ASCII_TONE);
//["dai4","zhe","xi1","wang4","qu4","lyu3","xing2","bi3","dao4","da2","zhong1","dian3","geng4","mei3","hao3"]
  • 小内存型: 将字典分片载入内存
  • 内存型: 将所有字典预先载入内存
  • I/O型: 不载入内存,将字典使用文件流打开逐行遍历并运用php5.5生成器(yield)特性分配单行内存

生成用于链接的拼音字符串

$pinyin->permalink('带着希望去旅行'); // dai-zhe-xi-wang-qu-lyu-xing
$pinyin->permalink('带着希望去旅行', '.'); // dai.zhe.xi.wang.qu.lyu.xing

获取首字符字符串

$pinyin->abbr('带着希望去旅行'); // dzxwqlx
$pinyin->abbr('带着希望去旅行', '-'); // d-z-x-w-q-l-x

$pinyin->abbr('你好2018!', PINYIN_KEEP_NUMBER); // nh2018
$pinyin->abbr('Happy New Year! 2018!', PINYIN_KEEP_ENGLISH); // HNY2018

翻译整段文字为拼音

将会保留中文字符:,。 ! ? : “ ” ‘ ’ 并替换为对应的英文符号。

$pinyin->sentence('带着希望去旅行,比到达终点更美好!');
// dai zhe xi wang qu lyu xing, bi dao da zhong dian geng mei hao!

$pinyin->sentence('带着希望去旅行,比到达终点更美好!', PINYIN_TONE);
// dài zhe xī wàng qù lǚ xíng, bǐ dào dá zhōng diǎn gèng měi hǎo!

翻译姓名

姓名的姓的读音有些与普通字不一样,比如 ‘单’ 常见的音为 dan,而作为姓的时候读 shan

$pinyin->name('单某某'); // ['shan', 'mou', 'mou']
$pinyin->name('单某某', PINYIN_TONE); // ["shàn","mǒu","mǒu"]

更多使用请参考 测试用例

在 Laravel 中使用

独立的包在这里:overtrue/laravel-pinyin

Contribution

欢迎提意见及完善补充词库 overtrue/pinyin-dictionary-maker 💋

参考

PHP 扩展包开发

想知道如何从零开始构建 PHP 扩展包?

请关注我的实战课程,我会在此课程中分享一些扩展开发经验 —— 《PHP 扩展包实战教程 - 从入门到发布》

License

FOSSA Status

Comments
  • 内存性能优化~

    内存性能优化~

    看了下源码~将3.5MB的库都载入到内存中使用~造出了极大的性能浪费~ 优化方案可以使用文件流打开库文件~对行操作进行匹配读取~虽然速度没有直接在数组中操作快~ 但是可以避免性能浪费~建议加入缓存拓展接口~因为第三方使用的项目都有自己的缓存机制~加一个save和get的接口~可以加快转换~ 在实际项目中~载入3.5MB的文件(还在不断扩大)真的不现实。 可能稍微不注意就内存溢出了!

    opened by medz 18
  • 你写的一直都存在占用内存很大的问题~所以我fork你的代码,自己写了一份。

    你写的一直都存在占用内存很大的问题~所以我fork你的代码,自己写了一份。

    在v2版本我就给大哥你提过这个问题了呢~ 不过呢~你只做的新版本也是有这个问题,单测都需要花费14mb。我统计了下,单测需要耗费4mb的内存。而其余的10mb则是你的字典资源占用的。 我的仓库 https://github.com/medz/pinyin 基于你的代码基础,写了一份试用yield特性的代码,单测测试的占用直接缩减到了最低。 希望这份代码,对你有启示吧!后面,我可能还会添加更多的代码特性进去。

    opened by medz 9
  • 5.0 语法设计

    5.0 语法设计

    转换模式

    你可以在转换前选择不同的模式:

    // 默认
    $pinyin->convert('带着希望去旅行,比到达终点更美好');
    // ["dài","zhe","xī","wàng","qù","lyu","xíng", "bǐ","dào","dá","zhōng","diǎn","gèng","měi","hǎo"]
    
    // 多音字模式
    $pinyin->polyphonic()->convert('重庆银行');
    // [['zhong', 'qing'], 'qing', 'yin', ['xing', 'hang']]
    
    // 仅保留汉字
    $pinyin->onlyHans()->convert('新年快乐,Happy New Year! 2018!');
    
    // 作为姓氏处理
    $pinyin->asSurname()->covert('单某某'); 
    // ['shan', 'mou', 'mou']
    

    转换结果处理

    convert 方法将返回一个 Collection 对象,你可以使用以下方式自定义处理该结果,以满足你的不同需求:

    // 移除声调
    $pinyin->noTone()->convert('带着希望去旅行,比到达终点更美好');
    // ["dai", "zhe", "xi", "wang", "qu", "lyu", "xing", "bi", "dao", "da", "zhong", "dian", "geng", "mei", "hao"]
    
    // 使用数字声调
    $pinyin->useNumberTone()->convert('带着希望去旅行,比到达终点更美好');
    // ["dai4","zhe","xi1","wang4","qu4","lyu3","xing2", "bi3","dao4","da2","zhong1","dian3","geng4","mei3","hao3"]
    
    // 使用 `v` 代替 `yu`, 例如:吕 `lyu` 将会转为 `lv`
    $pinyin->yuToV()->convert('带着希望去旅行,比到达终点更美好');
    // ["dài","zhe","xī","wàng","qù","lv","xíng", "bǐ","dào","dá","zhōng","diǎn","gèng","měi","hǎo"]
    
    // 使用 `u` 代替 `yu`, 例如:吕 `lyu` 将会转为 `u`
    $pinyin->yuToU()->convert('带着希望去旅行,比到达终点更美好');
    // ["dài","zhe","xī","wàng","qù","lv","xíng", "bǐ","dào","dá","zhōng","diǎn","gèng","měi","hǎo"]
    
    // 拼接为字符串
    $pinyin->join('-')->convert('带着希望去旅行,比到达终点更美好');
    // dài-zhe-xī-wàng-qù-lyu-xíng-bǐ-dào-dá-zhōng-diǎn-gèng-měi-hǎo
    
    // 遍历
    $pinyin->convert('带着希望去旅行,比到达终点更美好')->map('ucfirst')->join('-');
    // Dài-Zhe-Xī-Wàng-Qù-Lyu-Xíng-Bǐ-Dào-Dá-Zhōng-Diǎn-Gèng-Měi-Hǎo
    
    // 去除数字、英文字母、符号
    $pinyin->noNumber()
    		->noAlpha()
    		->noPunctuation()
                     ->convert('新年快乐,Happy New Year! 2018!')
    		->joinWith(' ');
    // xin nian kuai le 
    
    // 上面写法等价于
    $pinyin->onlyHans()->convert('新年快乐,Happy New Year! 2018!');
    
    opened by overtrue 7
  • modify default dictLoader from 'FileDictLoader' to 'MemoryFileDictLoader'

    modify default dictLoader from 'FileDictLoader' to 'MemoryFileDictLoader'

    "fileDictLoader" will do too many IO operate when i calling 'function Convert()' in a loop (in fact, fileDictLoader will IO operate when every calling ), so i hope MemoryFileDictLoader can be a defalut implement.

    opened by Kuri-su 5
  • php7.3和php7.4环境下,3.x系列和4.x系列都是行为不一致.这是

    php7.3和php7.4环境下,3.x系列和4.x系列都是行为不一致.这是

    这是不然我用php7.4版本啊

    $a = "php73"; $b = (new Pinyin())->sentence($a); //php73下 输出 php73 //php74下 输出 php

    具体验证代码 https://github.com/gitdebugdemo/pinyin/blob/php74-4.0.5/tests/Test.php

    验证集成环境: php73-ok https://github.com/gitdebugdemo/pinyin/tree/php73-4.0.5
    php74-不ok.数字73被删除了. https://github.com/gitdebugdemo/pinyin/tree/php74-4.0.5

    WX20191219-153946

    opened by warningwhoami 4
  • 汉字转拼音,文件执行超内存

    汉字转拼音,文件执行超内存

    PHP Fatal error:  Allowed memory size of 67108864 bytes exhausted (tried to allocate 6 bytes) in /mnt/www/api-3.weipei.cc/vendor/overtrue/pinyin/src/Pinyin/Pinyin.php on line 292
    
    opened by huiyonghkw 4
  • 性能优化

    性能优化

    读了下超哥的代码,看到每次在载入词库的时候都会重新组织一下数组的数据结构(词的第一个字为键值),这个过程不知道能不能在dict.php文件中就做好,以后就不需要每次组织一下这个数据结构呢,我修改了一下代码发现在我的自己上找一个词需要1.0x秒,但是如果先组织号数据结构之后就变成了0.46x秒了。不知道这样子编写有什么原因呢?

    opened by brittyu 4
  • 汉字+字母+数字报错

    汉字+字母+数字报错

    Pinyin::set('delimiter', '');   
    Pinyin::letter("测试R60");
    

    抛异常:

    [ErrorException]     
    Undefined offset: 6
    

    设置:

    Pinyin::set('only_chinese', true);
    

    就不报错。

    opened by snowpine 4
  • 拼音转换错误

    拼音转换错误

    请看例句 还说什么呢?还给你。个屁! 这句话转换的拼音为 hái shuō shí mǒ ne? huán gěi nǐ. hái gè pì

    词语”什么“的拼音转换错误有些奇怪。 我看在CEDICT里面是有”什么“这个词条的 什麼 什么 [shen2 me5] /what?/who?/something/anything/ 但是在words_*文件里面却没有找到”什么“

    另外,对于单个多音字,比如例子里面第二个还字,现在只是依照在word_*文件里面的出现顺序来获取拼音。有考虑使用词性吗?

    谢谢

    bug 
    opened by lengyuan 3
  • preg_replace(

    preg_replace("~[^\p{Han}\p{P}\p{Z}\p{M}\p{N}\p{L}\t]~u", '', $string)

    In the pinyin.php file,I have a question about the code. preg_replace("~[^\p{Han}\p{P}\p{Z}\p{M}\p{N}\p{L}\t]~u", '', $string)

    Pay attention to the ^ character,Is it right?what does the code means?

    opened by JihanZhuang 3
Releases(5.0.0)
Owner
安正超
Keep calm and coding.
安正超