cppjieba"結(jié)巴"中文分詞的C++版本
簡介
CppJieba是"結(jié)巴"中文分詞的C++版本
代碼細(xì)節(jié)詳解請見 代碼詳解
特性
源代碼都寫進(jìn)頭文件src/*.hpp里,include即可使用。
支持utf-8, gbk編碼,但是推薦使用utf-8編碼, 因?yàn)間bk編碼缺少嚴(yán)格測試,慎用。
內(nèi)置分詞服務(wù)server/server.cpp,在linux環(huán)境下可安裝使用。
項(xiàng)目自帶較為完善的單元測試,核心功能中文分詞(utf8)的穩(wěn)定性接受過線上環(huán)境檢驗(yàn)。
支持載自定義用戶詞典。
支持 linux , mac osx 操作系統(tǒng)。
支持 Docker。
用法
依賴軟件
g++ (version >= 4.1 recommended) or clang++;
cmake (version >= 2.6 recommended);
下載和編譯
git clone --depth=10 --branch=master git://github.com/aszxqw/cppjieba.git cd cppjieba mkdir build cd build cmake .. make
有興趣的可以跑跑測試(可選):
./test/test.run ./load_test
演示
./segment.demo
詳細(xì)請看 test/segment_demo.cpp.
服務(wù)使用
啟動(dòng)服務(wù)
./bin/cjserver ../test/testdata/server.conf
客戶端請求示例
curl "http://127.0.0.1:11200/?key=南京市長江大橋"
["南京市", "長江大橋"]
curl "http://127.0.0.1:11200/?key=南京市長江大橋&format=simple"
南京市 長江大橋
用 chrome 瀏覽器打開也行 ( chrome 設(shè)置默認(rèn)編碼是utf-8):
同時(shí),也支持HTTP POST模式,使用如下調(diào)用:
curl -d "南京市長江大橋" "http://127.0.0.1:11200/"
返回結(jié)果如下:
["南京市", "長江大橋"]
如果有需要安裝使用的,可以按照如下操作:
安裝服務(wù)
sudo make install
服務(wù)啟動(dòng)和停止(僅限 linux 系統(tǒng))
/etc/init.d/cjserver.start >> /dev/null 2>&1 /etc/init.d/cjserver.stop
卸載服務(wù)(僅限 linux 系統(tǒng))
cd build/ cat install_manifest.txt | sudo xargs rm -rf
Docker 示例
安裝和啟動(dòng)
sudo docker pull yanyiwu/cppjieba sudo docker run -d -P yanyiwu/cppjieba
sudo docker ps
CONTAINER IDIMAGE COMMANDCREATED STATUS PORTS NAMES 7c29325e9c20yanyiwu/cppjieba:latest "./bin/cjserver ../t 4 minutes ago Up 4 minutes0.0.0.0:49160->11200/tcp angry_wilson
可以看到正在運(yùn)行的 Docker 容器(容器內(nèi)運(yùn)行著 cjserver 服務(wù)),并且服務(wù)的端口號被映射為 0.0.0.0:49160 。
所以現(xiàn)在可以來一發(fā)測試了:
curl "http://0.0.0.0:49160/?key=南京市長江大橋"
預(yù)期結(jié)果如下:
["南京市", "長江大橋"]
分詞結(jié)果示例
MPSegment
Output:
我來到北京清華大學(xué) 我/來到/北京/清華大學(xué) 他來到了網(wǎng)易杭研大廈 他/來到/了/網(wǎng)易/杭/研/大廈 小明碩士畢業(yè)于中國科學(xué)院計(jì)算所,后在日本京都大學(xué)深造 小/明/碩士/畢業(yè)/于/中國科學(xué)院/計(jì)算所/,/后/在/日本京都大學(xué)/深造
HMMSegment
我來到北京清華大學(xué) 我來/到/北京/清華大學(xué) 他來到了網(wǎng)易杭研大廈 他來/到/了/網(wǎng)易/杭/研大廈 小明碩士畢業(yè)于中國科學(xué)院計(jì)算所,后在日本京都大學(xué)深造 小明/碩士/畢業(yè)于/中國/科學(xué)院/計(jì)算所/,/后/在/日/本/京/都/大/學(xué)/深/造
MixSegment
我來到北京清華大學(xué) 我/來到/北京/清華大學(xué) 他來到了網(wǎng)易杭研大廈 他/來到/了/網(wǎng)易/杭研/大廈 小明碩士畢業(yè)于中國科學(xué)院計(jì)算所,后在日本京都大學(xué)深造 小明/碩士/畢業(yè)/于/中國科學(xué)院/計(jì)算所/,/后/在/日本京都大學(xué)/深造
FullSegment
我來到北京清華大學(xué) 我/來到/北京/清華/清華大學(xué)/華大/大學(xué) 他來到了網(wǎng)易杭研大廈 他/來到/了/網(wǎng)易/杭/研/大廈 小明碩士畢業(yè)于中國科學(xué)院計(jì)算所,后在日本京都大學(xué)深造 小/明/碩士/畢業(yè)/于/中國/中國科學(xué)院/科學(xué)/科學(xué)院/學(xué)院/計(jì)算/計(jì)算所/,/后/在/日本/日本京都大學(xué)/京都/京都大學(xué)/大學(xué)/深造
QuerySegment
我來到北京清華大學(xué) 我/來到/北京/清華/清華大學(xué)/華大/大學(xué) 他來到了網(wǎng)易杭研大廈 他/來到/了/網(wǎng)易/杭研/大廈 小明碩士畢業(yè)于中國科學(xué)院計(jì)算所,后在日本京都大學(xué)深造 小明/碩士/畢業(yè)/于/中國/中國科學(xué)院/科學(xué)/科學(xué)院/學(xué)院/計(jì)算所/,/后/在/中國/中國科學(xué)院/科學(xué)/科學(xué)院/學(xué)院/日本/日本京都大學(xué)/京都/京都大學(xué)/大學(xué)/深造
以上依次是MP,HMM,Mix三種方法的效果。
可以看出效果最好的是Mix,也就是融合MP和HMM的切詞算法。即可以準(zhǔn)確切出詞典已有的詞,又可以切出像"杭研"這樣的未登錄詞。
Full方法切出所有字典里的詞語。
Query方法先使用Mix方法切詞,對于切出來的較長的詞再使用Full方法。
自定義用戶詞典
自定義詞典示例請看test/testdata/userdict.utf8。
載入自定義詞典示例請看test/segment.cpp,產(chǎn)生的可執(zhí)行文件示例請見 build/segment.demo
沒有使用自定義用戶詞典時(shí)的結(jié)果:
令狐沖/是/云/計(jì)算/行業(yè)/的/專家
使用自定義用戶詞典時(shí)的結(jié)果:
令狐沖/是/云計(jì)算/行業(yè)/的/專家
關(guān)鍵詞抽取
make && ./keyword.demo
你將看到如下結(jié)果:
我是拖拉機(jī)學(xué)院手扶拖拉機(jī)專業(yè)的。不用多久,我就會升職加薪,當(dāng)上CEO,走上人生巔峰。 ["CEO:11.7392", "升職:10.8562", "加薪:10.6426", "手扶拖拉機(jī):10.0089", "巔峰:9.49396"]
詳細(xì)請見 test/keyword_demo.cpp.
詞性標(biāo)注
./tagging.demo
詳情請看 test/tagging_demo.cpp.
["我:r", "是:v", "藍(lán)翔:x", "技工:n", "拖拉機(jī):n", "學(xué)院:n", "手扶拖拉機(jī):n", "專業(yè):n", "的:uj", "。:x", "不用:v", "多久:m", ",:x", "我:r", "就:d", "會:v", "升職:v", "加薪:nr", ",:x", "當(dāng):t", "上:f", "總經(jīng)理:n", ",:x", "出任:v", "CEO:eng", ",:x", "迎娶:v", "白富美:x", ",:x", "走上:v", "人生:n", "巔峰:n", "。:x"]
支持自定義詞性。 比如在(dict/user.dict.utf8)增加一行
藍(lán)翔 nz
結(jié)果如下:
["我:r", "是:v", "藍(lán)翔:nz", "技工:n", "拖拉機(jī):n", "學(xué)院:n", "手扶拖拉機(jī):n", "專業(yè):n", "的:uj", "。:x", "不用:v", "多久:m", ",:x", "我:r", "就:d", "會:v", "升職:v", "加薪:nr", ",:x", "當(dāng):t", "上:f", "總經(jīng)理:n", ",:x", "出任:v", "CEO:eng", ",:x", "迎娶:v", "白富美:x", ",:x", "走上:v", "人生:n", "巔峰:n", "。:x"]
其它詞典資料分享
應(yīng)用
關(guān)于CppJieba的跨語言包裝使用
收到郵件詢問跨語言包裝(ios應(yīng)用開發(fā))使用的問題,這方面我沒有相關(guān)的經(jīng)驗(yàn),建議參考如下python使用cppjieba的項(xiàng)目:
jannson 開發(fā)的供 python模塊調(diào)用的項(xiàng)目 cppjiebapy , 和相關(guān)討論 cppjiebapy_discussion .
NodeJieba
如果有需要在node.js中使用分詞,不妨試一下NodeJieba。
simhash
如果有需要在處理中文文檔的的相似度計(jì)算,不妨試一下simhash。
exjieba
如果有需要在erlang中使用分詞的話,不妨試一下exjieba。
jiebaR
如果有需要在R中使用分詞的話,不妨試一下jiebaR。
libcppjieba
libcppjieba 是最簡單易懂的CppJieba頭文件庫使用示例。
keyword_server
KeywordServer 50行搭建一個(gè)中文關(guān)鍵詞抽取服務(wù)。
ngx_http_cppjieba_module
如果有需要在Nginx中使用分詞模塊的話,不妨試一下ngx_http_cppjieba_module.
線上演示
http://cppjieba-webdemo.herokuapp.com/ (建議使用chrome打開)
客服
鳴謝
"結(jié)巴"中文分詞作者: @SunJunyi
