Code Monkey home page Code Monkey logo

pinyin's Introduction

Pinyin

Test Latest Stable Version Total Downloads Latest Unstable Version License

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

喜欢我的项目?点击这里支持我

安装

使用 Composer 安装:

composer require overtrue/pinyin:^5.0

使用

拼音风格

除了获取首字母的方法外,所有方法都支持第二个参数,用于指定拼音的格式,可选值为:

  • symbol (默认)声调符号,例如 pīn yīn
  • none 不输出拼音,例如 pin yin
  • number 末尾数字模式的拼音,例如 pin1 yin1

返回值

除了 permalink 返回字符串外,其它方法都返回集合类型 Overtrue\Pinyin\Collection

use Overtrue\Pinyin\Pinyin;

$pinyin = Pinyin::sentence('你好,世界');

你可以通过以下方式访问集合内容:

echo $pinyin; // nǐ hǎo shì jiè

// 直接将对象转成字符串
$string = (string) $pinyin; // nǐ hǎo shì jiè

$pinyin->toArray(); // ['nǐ', 'hǎo', 'shì', 'jiè']

// 直接使用索引访问
$pinyin[0]; // 'nǐ'

// 使用函数遍历
$pinyin->map('ucfirst'); // ['Nǐ', 'Hǎo', 'Shì', 'Jiè']

// 拼接为字符串
$pinyin->join(' '); // 'nǐ hǎo shì jiè'
$pinyin->join('-'); // 'nǐ-hǎo-shì-jiè'

// 转成 json
$pinyin->toJson(); // '["nǐ","hǎo","shì","jiè"]'
json_encode($pinyin); // '["nǐ","hǎo","shì","jiè"]'

文字段落转拼音

use Overtrue\Pinyin\Pinyin;

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

// 去除声调
echo Pinyin::sentence('带着希望去旅行,比到达终点更美好', 'none');
// dai zhe xi wang qu lv xing , bi dao da zhong dian geng mei hao

// 保留所有非汉字字符
echo Pinyin::fullSentence('ル是片假名,π是希腊字母', 'none');
// ル shi pian jia ming ,π shi xi la zi mu

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

通常用于文章链接等,可以使用 permalink 方法获取拼音字符串:

echo Pinyin::permalink('带着希望去旅行'); // dai-zhe-xi-wang-qu-lyu-xing
echo Pinyin::permalink('带着希望去旅行', '.'); // dai.zhe.xi.wang.qu.lyu.xing

获取首字符字符串

通常用于创建搜索用的索引,可以使用 abbr 方法转换:

Pinyin::abbr('带着希望去旅行'); // ['d', 'z', 'x', 'w', 'q', 'l', 'x']
echo Pinyin::abbr('带着希望去旅行')->join('-'); // d-z-x-w-q-l-x
echo Pinyin::abbr('你好2018!')->join(''); // nh2018
echo Pinyin::abbr('Happy New Year! 2018!')->join(''); // HNY2018

姓名首字母

将首字作为姓氏转换,其余作为普通词语转换:

Pinyin::nameAbbr('欧阳'); // ['o', 'y']
echo Pinyin::nameAbbr('单单单')->join('-'); // s-d-d

姓名转换

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

Pinyin::name('单某某'); // ['shàn', 'mǒu', 'mǒu']
Pinyin::name('单某某', 'none'); // ['shan', 'mou', 'mou']
Pinyin::name('单某某', 'none')->join('-'); // shan-mou-mou

护照姓名转换

根据国家规定 关于**护照旅行证上姓名拼音 ü(吕、律、闾、绿、女等)统一拼写为 YU 的提醒 的规则,将 ü 转换为 yu

Pinyin::passportName('吕小布'); // ['lyu', 'xiao', 'bu']
Pinyin::passportName('女小花'); // ['nyu', 'xiao', 'hua']
Pinyin::passportName('律师'); // ['lyu', 'shi']

多音字

多音字的返回值为关联数组的集合,默认返回去重后的所有读音:

$pinyin = Pinyin::polyphones('重庆');

$pinyin['重']; // ["zhòng", "chóng", "tóng"]
$pinyin['庆']; // ["qìng"]

$pinyin->toArray();
// [
//     "重": ["zhòng", "chóng", "tóng"],
//     "庆": ["qìng"]
// ]

如果不想要去重,可以数组形式返回:

$pinyin = Pinyin::polyphones('重庆重庆', Converter::TONE_STYLE_SYMBOL, true);

// or 
$pinyin = Pinyin::polyphonesAsArray('重庆重庆', Converter::TONE_STYLE_SYMBOL);

$pinyin->toArray();
// [
//     ["重" => ["zhòng", "chóng", "tóng"]],
//     ["庆" => ["qìng"]],
//     ["重" => ["zhòng", "chóng", "tóng"]],
//     ["庆" => ["qìng"]]
// ]

单字转拼音

和多音字类似,单字的返回值为字符串,多音字将根据该字字频调整得到常用音:

$pinyin = Pinyin::chars('重庆');

echo $pinyin['重']; // "zhòng"
echo $pinyin['庆']; // "qìng"

$pinyin->toArray();
// [
//     "重": "zhòng",
//     "庆": "qìng"
// ]

Warning

当单字处理时由于多音字来自词频表中取得常用音,所以在词语环境下可能出现不正确的情况,建议使用多音字处理。

更多使用请参考 测试用例

v/yu/ü 的问题

根据国家语言文字工作委员会的规定,lvlyu 都是正确的,但是 lv 是最常用的,所以默认使用 lv,如果你需要使用其他的,可以在初始化时传入:

echo Pinyin::sentence('旅行');
// lǚ xíng

echo Pinyin::sentence('旅行', 'none');
// lv xing

echo Pinyin::yuToYu()->sentence('旅行', 'none');
// lyu xing

echo Pinyin::yuToU()->sentence('旅行', 'none');
// lu xing

echo Pinyin::yuToV()->sentence('旅行', 'none');
// lv xing

Warning

仅在拼音风格为非 none 模式下有效。

命令行工具

你可以使用命令行来实现拼音的转换:

php ./bin/pinyin 带着希望去旅行 --method=sentence --tone-style=symbol
# dài zhe xī wàng qù lǚ xíng

更多使用方法,可以查看帮助文档:

php ./bin/pinyin --help

# Usage:
#     ./pinyin [chinese] [method] [options]
# Options:
#     -j, --json               输出 JSON 格式.
#     -c, --compact            不格式化输出 JSON.
#     -m, --method=[method]    转换方式,可选:sentence/sentenceFull/permalink/abbr/nameAbbr/name/passportName/phrase/polyphones/chars.
#     --no-tone                不使用音调.
#     --tone-style=[style]     音调风格,可选值:symbol/none/number, default: none.
#     -h, --help               显示帮助.

在 Laravel 中使用

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

中文简繁转换

如何你有这个需求,也可以了解我的另一个包:overtrue/php-opencc

Contribution

欢迎提意见及完善补充词库:

参考

❤️ Sponsor me

Sponsor me

如果你喜欢我的项目并想支持它,点击这里 ❤️

Project supported by JetBrains

Many thanks to Jetbrains for kindly providing a license for me to work on this and other open-source projects.

PHP 扩展包开发

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

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

License

MIT

pinyin's People

Contributors

abrahamgreyson avatar aizuyan avatar allowing avatar aufree avatar dependabot-preview[bot] avatar dependabot[bot] avatar domainname avatar drl3fty avatar fossabot avatar garveen avatar honvid avatar isecret avatar kmvan avatar libook avatar liuxd avatar luokuncool avatar medz avatar modilay avatar n0ah avatar overtrue avatar rookie20570 avatar shengbinxu avatar ssynhtn avatar summerblue avatar totoleo avatar wangfenjin avatar wfyhehe avatar wiseker avatar xiaobeicn avatar xjchengo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pinyin's Issues

代码优化

public function map(Closure $callback)
{
for ($i = 0; $i < 100; ++$i) {
$segment = $this->path.'/'.sprintf($this->segmentName, $i);
if (file_exists($segment)) {
$dictionary = (array) include $segment;
$callback($dictionary);
}
}
}

这块儿 loop 次数 能不能优化下呢 调用100次 file_existes 感觉不太智能 如果预先 给定 我们的字库文件数目呢

汉字+字母+数字报错

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

抛异常:

[ErrorException]     
Undefined offset: 6

设置:

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

就不报错。

没有的字库

echo Pinyin::letter("阿坝藏族羌族自治州");

//B Z Z Q Z Z Z Z

明显缺少一个A

性能优化

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

Class 'Overtrue\Pinyin\Pinyin' not found

我按照文档来一步一步的把Pinyin安装好了,但是在代码中使用的时候,提示说Class 'Overtrue\Pinyin\Pinyin' not found。我是用的是thinkphp3.2.3,下面的是我的代码:

<?php
namespace Home\Controller;
//namespace Overtrue\Pinyin;
use Think\Controller;
use Overtrue\Pinyin\Pinyin;
class TestController extends Controller {
	public function _initialize() {}
	public function test() {

		$pinyin = new Pinyin();
		var_dump($pinyin -> convert('你好'));
	}
}

autoload.php文件也在thinkphp的入口文件加载了,为什么还是会出现这样的情况?求求帮忙看下,解答下疑惑......

关于不带调 ü 的 ascii 转写问题

建议增加一个额外的参数,以支持 ü --> yu 转写方案,而不是 ü --> v。

参见:https://zh.wikipedia.org/wiki/%C3%9C

ü 这一字母不便于用常用的美式键盘作电脑输入,汉语拼音输入法中都以v代替输入。英语中没有这一字母,因此,带有这一字母的汉语人名、地名转写为英语时,有时只好将两点省去,写为u,引起混淆,例如女娲被错误地转写为Nuwa。部分人士[11]认为,涉及ü的音节只有nü、lü、nüe、lüe四个,因此可以把这四个音节拼写为nyu、lyu、nyue、lyue,这样既便于电脑输入,在拼读时也更准确;不过“nyu”与其他音节相连时,会引起混淆,需要加隔音符号,譬如“妓女(jì'nyǔ)”若不加隔音符号易与“金鱼(jīnyú)”混淆。中华人民共和国自发行电子护照以来,对人名中的“ü”都转写成“yu”,如吕姓一律作“Lyu”[4][12][e]。2011年10月发布国家标准GB/T 28039-2011《**人名汉语拼音字母拼写规则》明文规定:“根据技术处理的特殊需要,必要的场合(如公民护照、对外文件和书刊等),大写字母Ü可以用YU代替。例如: Lǚ Hépínɡ 拼写为:LYU HEPING 吕和平”

permlink自动过滤数字了

这边把数字都给过滤掉,我觉得是不科学的。

$pinyin = new Overtrue\Pinyin\Pinyin();
$str = '1中文有数字3哈哈2';
$str = $pinyin->permlink($str);
var_dump($str); // string(26) "zhong-wen-you-shu-zi-ha-ha"

关于加载字典文件的路径问题

由于字典文件不一定放在默认位置,为了灵活,建议在调用方法里增加可指定加载字典位置的参数。感谢您的开源,帮助了我解决了问题。

能否批量取姓名的拼音呢?

作者你好
现在有个情况是我有1000条记录,存放了中文名,我想要取出这些人名的拼音,但是透过$pinyin->name()这样遍历去取会花费超过10s的时间,我将这些姓名变成一个大的文本想直接透过$pinyin->name()一下子得到姓名,但我失败了,我得到了第一个字的拼音。
那么请问有什么更好的办法可以解决这个问题吗?

非常感谢!

一个奇怪的问题

代码如下

<?php
 $option = [
            'accent'       => false,
            'delimiter'    => ' ',
            'only_chinese' => false,
        ];
print_r(Pinyin::trans('Freeman俢', $option));

转换关键字Freeman俢
结果如下

Freeman俢

字未转换

有时单字也是不能正常转换。不确定什么时候会出现。

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

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

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

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

礼貌性的硬一下,哦不不不,就是问下是否需要一个yield生成器类型的loader呢?

如题,因为之前改过一个版本的yield版本的库,因为性能,的确是一个大问题。

不过,比如程序不熟在虚拟机,以及使用在内存不大的程序上的场景挺多的~

所以,礼貌性的问一下,是否需要一个这样的loader?

如果需要,我提一个pr吧~重写fork了拼音库。

先讲一下,在2.x版本的时候就考虑使用这个库,但是当时文件都在内存,正式环境使用优点不切实际,后来出了3.x,也不利于这样的环境下使用。

先说下环境吧,一个社交类的产品,需要根据用户名设置search key,也就是用户名单字母缩写和全拼用语搜索使用。

线上环境不可能给出那么大的内存给单个请求使用的,所以,yield来使用的场景还是蛮多的~

之前利用作者的库二开了一份yield的代码,正在使用中。。。

作者既然有接口类,我看到这两天有位phper提了一个全部载入内存的loader。

所以考虑要不要给作者提一个yield特性不占用内存的pr呢~。

词根问题

在词典文件中,足的拼音有误,当前为ju,正确的应为zu
screen shot 2015-07-11 at 14 21 13

内存性能优化~

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

bug

对你说 转化成了 'dui-ni-shui`

Pinyin::pinyin('对你说', [
    'delimiter' => '-',
    'accent' => false,
    // 'only_chinese' => true
])

几个地名翻译错误

  1. 乌拉特前旗,翻译为wù l tè qián qí,应为wù lā tè qián qí
  2. 朝阳区,翻译为zhāo yáng qū,应为cháo yáng qū
  3. 绩溪县,翻译为jī xī xiàn,应为jì xī xiàn
  4. 百色县,翻译为bó sè shì,应为bǎi sè shì
  5. 都安瑶族自治县,翻译为dōu ān yáo zú zì zhì xiàn,应为dū ān yáo zú zì zhì xiàn
  6. 塔什库尔干,翻译为tǎ shén kù ěr gàn,应为tǎ shí kù ěr gān
  7. 长阳土家族自治县,翻译为zhǎng yáng tǔ jiā zú zì zhì xiàn,应为cháng yáng tǔ jiā zú zì zhì xiàn
  8. 马尾区,翻译为mǎ yǐ qū,应为mǎ wěi qū
  9. 三都水族自治县,翻译为sān dōu shuǐ zú zì zhì xiàn,应为sān dū shuǐ zú zì zhì xiàn

文档说明错误

Pinyin::letter('您好世界', ['delimiter' => '-']); //N-H-S-J
第二个参数不是数组。建议增加一个大小写输出控制参数

question

能不能提供一个接口去load本地的词库。

Readme中说补充词库的话需要

src/Pinyin/data/additional.php

这样的话某些情况得改源码

'堃' 字无法转换为拼音

我在写一个用户管理系统,用户头像的存储是使用 年级 + 中文名字的拼音 构成的,因此调用了这个类库,但在测试时,发现 ( kun ) 字没有被转为拼音( 摔呀,这还是我自己的名字 )。
测试代码如下

require '../vendor/autoload.php';
use Overtrue\Pinyin\Pinyin;
Pinyin::set('delimiter','');
Pinyin::set('accent',false); // 设置 中文转拼音 类库, 无分隔,无音调

$name = '堃';
$name_pinyin = Pinyin::trans($name); // 获取拼音
echo $name_pinyin;

输出结果( 直接输出了原汉字 ):
image

同时测试了几个少见的字,都能够正确输出。

冯 默认被转换为 ping2

    [暴虎冯河] =>   bao4 hu3 ping2 he2
    [冯] =>   ping2
    [冯内果] =>   feng2 nei4 guo3
    [冯友兰] =>   feng2 you3 lan2
    [冯梦龙] =>   feng2 meng4 long2
    [冯德英] =>   feng2 de2 ying1
    [冯武] =>   feng2 wu3
    [冯玉祥] =>   feng2 yu4 xiang2
    [冯窦伯] =>   feng2 dou4 bo2
    [冯骥才] =>   feng2 ji4 cai2

由于常见于姓氏,建议还是默认feng2

字母和数字连在一起的情况下的返回值

当字母和数字连一起的情况下,数字变成了:
传入: aaaa1234

输出: a\

如果传入aaaa_1234

输出:aaaa_

我的设置是
Pinyin::set('delimiter', '');
Pinyin::set('accent', false);

想问一下,第一种情况只保留了一个字母还加上了双斜线?

自定义词库中有些汉字无法转译成拼音字母

你好,我在pinyin/data目录下新增了自定义的文件words_6,文件内容如下:
<?php
return array (
'' => ' zē',
'' => ' gē',
'隣' => ' lē',
);
但是输出$pinyin = $pinyin->convert('')的返回值,确是个空数组。通过查看源代码,发现你首先对字符串进行了预处理,如果不满足正则匹配preg_replace("~[^\p{Han}\p{P}\p{Z}\p{M}\p{N}\p{L}\t]u", '', $string)就返回空字符串,难道“”不满足p{Han}这个匹配条件吗?是否可以提供一个有效的p{Han}所支持的字符列表?如果p{Han}所对应的汉字范围不支持,是否有方法修正这样的错误?谢谢

性能问题

转换一个词好慢,几秒,怎么破。

编码问题

这个库使用的汉字的编码是什么呢?我传进去的字符是gbk编码的,发现转化不了。谢谢。

v3不好扩展到Thinkphp 3.2.3中

v2挺好扩展的。把:namespace Overtrue\Pinyin;命名空间注释。就扩展成功了。

今天看到老大更新到v3了。。扩展的试了下。
提示:Pinyin.php 164行错误。
namespace Overtrue\Pinyin;命名空间我注释了。不注释貌似不好扩展。

发现两个小bug

bug:
1、···only_chinese 设置为true的时候···
Pinyin::parse("带着希望去china"); 返回的数组里面src只有中文带着希望去

2、使用Pinyin::parse("带着希望去china")返回的数组letter英语单词只有首字母

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.