overtrue / pinyin Goto Github PK
View Code? Open in Web Editor NEW🇨🇳 基于词库的中文转拼音优质解决方案
Home Page: https://github.com/overtrue/pinyin
License: MIT License
🇨🇳 基于词库的中文转拼音优质解决方案
Home Page: https://github.com/overtrue/pinyin
License: MIT License
这个库使用的汉字的编码是什么呢?我传进去的字符是gbk编码的,发现转化不了。谢谢。
当字母和数字连一起的情况下,数字变成了:
传入: aaaa1234
输出: a\
如果传入aaaa_1234
输出:aaaa_
我的设置是
Pinyin::set('delimiter', '');
Pinyin::set('accent', false);
想问一下,第一种情况只保留了一个字母还加上了双斜线?
转换一个词好慢,几秒,怎么破。
你好,我想请教一下,对于非汉字的部分不想处理,希望保持原样该怎样设置?
bug:
1、···only_chinese 设置为true的时候···
Pinyin::parse("带着希望去china");
返回的数组里面src只有中文带着希望去
2、使用Pinyin::parse("带着希望去china")返回的数组letter
英语单词只有首字母
我看到 这里 是有 盖 这个姓的 但是访问
http://string2pinyin.sinaapp.com/?str=%E7%9B%96%E5%B0%8F%E5%A7%90
却返回的是 ge3
因为 sae 的版本比较老?
作者你好
现在有个情况是我有1000条记录,存放了中文名,我想要取出这些人名的拼音,但是透过$pinyin->name()
这样遍历去取会花费超过10s的时间,我将这些姓名变成一个大的文本想直接透过$pinyin->name()
一下子得到姓名,但我失败了,我得到了第一个字的拼音。
那么请问有什么更好的办法可以解决这个问题吗?
非常感谢!
wù l tè qián qí
,应为wù lā tè qián qí
;zhāo yáng qū
,应为cháo yáng qū
;jī xī xiàn
,应为jì xī xiàn
;bó sè shì
,应为bǎi sè shì
;dōu ān yáo zú zì zhì xiàn
,应为dū ān yáo zú zì zhì xiàn
;tǎ shén kù ěr gàn
,应为tǎ shí kù ěr gān
;zhǎng yáng tǔ jiā zú zì zhì xiàn
,应为cháng yáng tǔ jiā zú zì zhì xiàn
;mǎ yǐ qū
,应为mǎ wěi qū
;sān dōu shuǐ zú zì zhì xiàn
,应为sān dū shuǐ zú zì zhì xiàn
;对你说 转化成了 'dui-ni-shui`
Pinyin::pinyin('对你说', [
'delimiter' => '-',
'accent' => false,
// 'only_chinese' => true
])
你好,我在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}所对应的汉字范围不支持,是否有方法修正这样的错误?谢谢
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?
看了下源码将3.5MB的库都载入到内存中使用造出了极大的性能浪费~
优化方案可以使用文件流打开库文件对行操作进行匹配读取虽然速度没有直接在数组中操作快~
但是可以避免性能浪费建议加入缓存拓展接口因为第三方使用的项目都有自己的缓存机制加一个save和get的接口可以加快转换~
在实际项目中~载入3.5MB的文件(还在不断扩大)真的不现实。
可能稍微不注意就内存溢出了!
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 感觉不太智能 如果预先 给定 我们的字库文件数目呢
v2挺好扩展的。把:namespace Overtrue\Pinyin;命名空间注释。就扩展成功了。
今天看到老大更新到v3了。。扩展的试了下。
提示:Pinyin.php 164行错误。
namespace Overtrue\Pinyin;命名空间我注释了。不注释貌似不好扩展。
Pinyin::letter('您好世界', ['delimiter' => '-']); //N-H-S-J
第二个参数不是数组。建议增加一个大小写输出控制参数
读了下超哥的代码,看到每次在载入词库的时候都会重新组织一下数组的数据结构(词的第一个字为键值),这个过程不知道能不能在dict.php文件中就做好,以后就不需要每次组织一下这个数据结构呢,我修改了一下代码发现在我的自己上找一个词需要1.0x秒,但是如果先组织号数据结构之后就变成了0.46x秒了。不知道这样子编写有什么原因呢?
如题,因为之前改过一个版本的yield版本的库,因为性能,的确是一个大问题。
不过,比如程序不熟在虚拟机,以及使用在内存不大的程序上的场景挺多的~
所以,礼貌性的问一下,是否需要一个这样的loader?
如果需要,我提一个pr吧~重写fork了拼音库。
先讲一下,在2.x版本的时候就考虑使用这个库,但是当时文件都在内存,正式环境使用优点不切实际,后来出了3.x,也不利于这样的环境下使用。
先说下环境吧,一个社交类的产品,需要根据用户名设置search key,也就是用户名单字母缩写和全拼用语搜索使用。
线上环境不可能给出那么大的内存给单个请求使用的,所以,yield来使用的场景还是蛮多的~
之前利用作者的库二开了一份yield的代码,正在使用中。。。
作者既然有接口类,我看到这两天有位phper提了一个全部载入内存的loader。
所以考虑要不要给作者提一个yield特性不占用内存的pr呢~。
这边把数字都给过滤掉,我觉得是不科学的。
$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"
能不能提供一个接口去load本地的词库。
Readme中说补充词库的话需要
src/Pinyin/data/additional.php
这样的话某些情况得改源码
Pinyin::trans("置于死地") gives me "zhìyúsǐde" instead of "zhìyúsǐdì"...
Why?
圆晕:环装波纹。这里“晕”应该是第四声,输出的是第一声,能不能添加一下呢
echo Pinyin::letter("阿坝藏族羌族自治州");
//B Z Z Q Z Z Z Z
明显缺少一个A
如:C#,Java
想自己host一个,万一把您的豆豆都用光了。
php不熟,当api用。
希望输出全拼时能加入首字母大写的选项, 这样在输出全拼并且不需要分隔符的时候方便一眼就分出每个字的拼音
$name='剅河';
$depends=[
'剅'=>'lou'
];
Pinyin::appends($depends);
Pinyin::set('accent',false);
echo Pinyin::trans($name),PHP_EOL;
$name='好的';
echo Pinyin::trans($name),PHP_EOL;
输出如下:
lou 河
好的
请问这是怎么回事啊?
“ 添加获取首字母”,这个功能已经实现了。可以从TODO中划掉了。
AB首字母 => ABszm
而不是目前的 Aszm
[暴虎冯河] => 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
吧
比如 變, 龘
建议增加一个额外的参数,以支持 ü --> 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 吕和平”
代码如下
<?php
$option = [
'accent' => false,
'delimiter' => ' ',
'only_chinese' => false,
];
print_r(Pinyin::trans('Freeman俢', $option));
转换关键字Freeman俢
结果如下
Freeman俢
修
字未转换
有时单字修
也是不能正常转换。不确定什么时候会出现。
沈阳
沈日常使用基本只有shěn
一个读音,chén
作为通假字,在现代汉语中基本上没有使用
词库里面这些常用词语,还需要进行优化
Pinyin::set('delimiter', '');
Pinyin::letter("测试R60");
抛异常:
[ErrorException]
Undefined offset: 6
设置:
Pinyin::set('only_chinese', true);
就不报错。
比如有没有考虑过类似 json 或者 yaml 的格式来表示数据
这样其他的语言也可以读过来分别做实现
我按照文档来一步一步的把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的入口文件加载了,为什么还是会出现这样的情况?求求帮忙看下,解答下疑惑......
想问一下作者,地区多音字这边是怎么处理的?例如:长春(changchun)(zhangchun) 重庆(chongqing zhongqing)
Pinyin::trans('我们', array('delimiter' => '', 'first' => true));
输出 // wm
在v2版本我就给大哥你提过这个问题了呢~
不过呢~你只做的新版本也是有这个问题,单测都需要花费14mb。我统计了下,单测需要耗费4mb的内存。而其余的10mb则是你的字典资源占用的。
我的仓库 https://github.com/medz/pinyin
基于你的代码基础,写了一份试用yield特性的代码,单测测试的占用直接缩减到了最低。
希望这份代码,对你有启示吧!后面,我可能还会添加更多的代码特性进去。
女 字取不到
如题
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
字典里面有“重庆[Chong2 qing4]”结果翻译出来还是 zhòng qìng
代码里面没看到读取pinyin.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;
同时测试了几个少见的字,都能够正确输出。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.