PHP高性能输出UNICODE正则汉字列表 汉字转拼音多音字解决方案 搜索引擎分词细胞词库更新 搜狗词库提取TXT...
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
目前現(xiàn)狀
漢字轉(zhuǎn)拼音
難度大就大在 多音字!行業(yè)上較準(zhǔn)確的是基于詞語(yǔ)、成語(yǔ)的識(shí)別。搜狗有1萬(wàn)多詞庫(kù) 每個(gè)詞庫(kù)又很大:
比如:
最終 無(wú)法達(dá)到100%精確 只能盡可能準(zhǔn)確 加大正確率!
防止采集
HookPHP項(xiàng)目地址:https://github.com/letwang/HookPHP,如果大家喜歡的話,請(qǐng)給個(gè)Star,讓更多的人看到優(yōu)秀的開(kāi)源項(xiàng)目,為PHP發(fā)展貢獻(xiàn)一把力量!QQ架構(gòu)探討群:679116380
搜索引擎
分詞同理:
每年高考漢語(yǔ)都有修正版 現(xiàn)在一次站在巨人肩膀上固定好詞庫(kù)?以后還是要根據(jù)高考方案來(lái)更新?所以 最終 無(wú)法達(dá)到100%精確 只能盡可能準(zhǔn)確 加大正確率!
解決方案
1.運(yùn)用采集工具批量采集搜狗詞庫(kù)到本地
2.執(zhí)行Python程序,把上述詞庫(kù)提取出到TXT文檔中
#!/usr/bin/python # -*- coding: utf-8 -*- #https://my.oschina.net/cart #letwangimport struct,sys,binascii,pdb,osstartPy = 0x1540; startChinese = 0x2628;GPy_Table ={} GTable = []def byte2str(data):i = 0;length = len(data)ret = u''while i < length:x = data[i] + data[i+1]t = unichr(struct.unpack('H',x)[0])if t == u'\r':ret += u'\n'elif t != u' ':ret += ti += 2return retdef getPyTable(data):if data[0:4] != "\x9D\x01\x00\x00":return Nonedata = data[4:]pos = 0length = len(data)while pos < length:index = struct.unpack('H',data[pos]+data[pos+1])[0]pos += 2l = struct.unpack('H',data[pos]+data[pos+1])[0]pos += 2py = byte2str(data[pos:pos+l])GPy_Table[index]=pypos += ldef getWordPy(data):pos = 0length = len(data)ret = u''while pos < length:index = struct.unpack('H',data[pos]+data[pos+1])[0]ret += GPy_Table[index]pos += 2 return retdef getWord(data):pos = 0length = len(data)ret = u''while pos < length:index = struct.unpack('H',data[pos]+data[pos+1])[0]ret += GPy_Table[index]pos += 2 return retdef getChinese(data): pos = 0length = len(data)while pos < length:same = struct.unpack('H',data[pos]+data[pos+1])[0]pos += 2py_table_len = struct.unpack('H',data[pos]+data[pos+1])[0]pos += 2py = getWordPy(data[pos: pos+py_table_len])pos += py_table_lenfor i in xrange(same):c_len = struct.unpack('H',data[pos]+data[pos+1])[0]pos += 2 word = byte2str(data[pos: pos + c_len])pos += c_len ext_len = struct.unpack('H',data[pos]+data[pos+1])[0]pos += 2count = struct.unpack('H',data[pos]+data[pos+1])[0]GTable.append((count,py,word))pos += ext_lendef deal(file_name):print '-'*60f = open(file_name,'rb')data = f.read()f.close()if data[0:12] !="\x40\x15\x00\x00\x44\x43\x53\x01\x01\x00\x00\x00":print "確認(rèn)你選擇的是搜狗(.scel)詞庫(kù)?"sys.exit(0)print "詞庫(kù)名:" ,byte2str(data[0x130:0x338])print "詞庫(kù)類(lèi)型:" ,byte2str(data[0x338:0x540])print "描述信息:" ,byte2str(data[0x540:0xd40])print "詞庫(kù)示例:",byte2str(data[0xd40:startPy])getPyTable(data[startPy:startChinese])getChinese(data[startChinese:])if __name__ == '__main__':o = [fname for fname in os.listdir("./") if fname[-5:] == ".scel"]for f in o:deal(f)f = open('sougou.txt','w')for count,py,word in GTable:f.write( unicode('{%(count)s}' %{'count':count}+py+' '+ word).encode('utf-8') )f.write('\n')f.close()把上述保存為文件名sougou,且所有采集好的搜狗詞庫(kù)放置與其同級(jí),執(zhí)行 python sougou,會(huì)生成sougou.txt,里面就是成千上萬(wàn)的 詞頻、拼音、分詞,再使用Cron定時(shí)任務(wù)采集、更新詞庫(kù)即可保持漢字轉(zhuǎn)拼音、搜索引擎分詞元數(shù)據(jù)常新。
實(shí)際,除了搜狗還有其他輸入法詞庫(kù)可供類(lèi)似操作,最終目的是詞庫(kù)夠新 夠全!
另外,在unicode官網(wǎng)可以查到中文漢字通用的unicode編碼范圍。
PHP高性能輸出UNICODE正則漢字列表
網(wǎng)上,針對(duì)漢字、特殊字符的UNICODE 編碼、解碼實(shí)現(xiàn),方法諸多,但是大多是復(fù)制粘貼,沒(méi)有新意!以下為原創(chuàng):
<?php for ($i = 0x4e00; $i <= 0x9fa5; $i ++) {echo json_decode('"\u' . dechex($i) . '"'); }上述會(huì)打印20902個(gè)漢字列表,這也解釋了上述正則是如何透明的工作匹配漢字的,其中有幾個(gè)知識(shí)點(diǎn):
PHP UNICODE 漢字 編碼:
var_dump(json_encode('2018 ABC 我是中國(guó)人!網(wǎng)站:http://my.oschina.net/cart/'));上述就實(shí)現(xiàn)了PHP中對(duì)漢字、特殊字符的 UNICODE 編碼,會(huì)輸出:
string(96) ""2018 ABC \u6211\u662f\u4e2d\u56fd\u4eba\uff01\u7f51\u7ad9\uff1ahttp:\/\/my.oschina.net\/cart\/""PHP UNICODE 漢字 解碼:
如果我們嘗試
var_dump(json_decode('2018 ABC \u6211\u662f\u4e2d\u56fd\u4eba\uff01\u7f51\u7ad9\uff1ahttp:\/\/my.oschina.net\/cart\/'));或者
var_dump(json_decode("2018 ABC \u6211\u662f\u4e2d\u56fd\u4eba\uff01\u7f51\u7ad9\uff1ahttp:\/\/my.oschina.net\/cart\/"));結(jié)果都是
NULL是錯(cuò)誤的,并沒(méi)有按照我們的意愿解碼!
因?yàn)槟悴?span style="color:#e53333;">沒(méi)有傳入正確的json格式字符串!!!
心細(xì)的同學(xué)肯定已經(jīng)發(fā)現(xiàn),上述json_encode輸出的是
"2018 ABC \u6211\u662f\u4e2d\u56fd\u4eba\uff01\u7f51\u7ad9\uff1ahttp:\/\/my.oschina.net\/cart\/"注意輸出字符串兩段的 雙引號(hào), 這也是輸出 json_encode 內(nèi)容的一部分!很重要!
所以我們?nèi)绻胝_的用json_decode解碼,我們以下操作即可:
var_dump(json_decode('"2018 ABC \u6211\u662f\u4e2d\u56fd\u4eba\uff01\u7f51\u7ad9\uff1ahttp:\/\/my.oschina.net\/cart\/"'));正確的解碼輸出了我們的結(jié)果:
string(63) "2018 ABC 我是中國(guó)人!網(wǎng)站:http://my.oschina.net/cart/"看看,沒(méi)有什么技術(shù)含量,都是基本知識(shí)的掌握!
PHP UNICODE 漢字 不規(guī)則形式 解碼:
也許有的同學(xué)沒(méi)有那么幸運(yùn),得到的字符串形如:
2018 ABC u6211u662fu4e2du56fdu4ebauff01u7f51u7ad9uff1ahttp:\/\/my.oschina.net\/cart\/怎么解碼?心細(xì)的同事已經(jīng)發(fā)現(xiàn),所有的u少了\,應(yīng)該是\u,u后面跟隨的是【0-9a-f】4位字符串!
瀟灑破之(preg_replace的e修飾符在PHP新版本已經(jīng)棄用了,所以官方推薦使用preg_replace_callback代替之!):
$str = '2018 ABC u6211u662fu4e2du56fdu4ebauff01u7f51u7ad9uff1ahttp:\/\/my.oschina.net\/cart\/'; var_dump(json_decode('"'.preg_replace_callback("/u([0-9a-f]{4})/", function($match){return '\u'.$match[1];}, $str).'"'));就1句話,完工,下班。
轉(zhuǎn)載于:https://my.oschina.net/cart/blog/326787
總結(jié)
以上是生活随笔為你收集整理的PHP高性能输出UNICODE正则汉字列表 汉字转拼音多音字解决方案 搜索引擎分词细胞词库更新 搜狗词库提取TXT...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 树莓派 php5 安装失败怎么办
- 下一篇: css怎样在按钮点击时修改边框