7 Star 16 Fork 5

Yanyi Wu / cppjieba

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

CppJieba Build Status

简介

CppJieba是"结巴"中文分词的C++版本

代码细节详解请见 代码详解

特性

  • 源代码都写进头文件src/*.hpp里,include即可使用。
  • 支持utf-8, gbk编码,但是推荐使用utf-8编码, 因为gbk编码缺少严格测试,慎用。
  • 内置分词服务server/server.cpp,在linux环境下可安装使用。
  • 项目自带较为完善的单元测试,核心功能中文分词(utf8)的稳定性接受过线上环境检验。
  • 支持载自定义用户词典。
  • 支持 linux , mac osx 操作系统。
  • 支持 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

详细请看 test/segment_demo.cpp.

服务使用

启动服务

./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 设置默认编码是utf-8):

同时,也支持HTTP POST模式,使用如下调用:

curl -d "南京市长江大桥" "http://127.0.0.1:11200/"

返回结果如下:

["南京市", "长江大桥"]

如果有需要安装使用的,可以按照如下操作:

安装服务

sudo make install

服务启动和停止(仅限 linux 系统)

/etc/init.d/cjserver.start >> /dev/null 2>&1
/etc/init.d/cjserver.stop

卸载服务(仅限 linux 系统)

cd build/
cat install_manifest.txt | sudo xargs rm -rf

Docker 示例

安装和启动

sudo docker pull yanyiwu/cppjieba
sudo docker run -d -P yanyiwu/cppjieba
sudo docker ps
CONTAINER ID        IMAGE                     COMMAND                CREATED             STATUS              PORTS                      NAMES
7c29325e9c20        yanyiwu/cppjieba:latest   "./bin/cjserver ../t   4 minutes ago       Up 4 minutes        0.0.0.0:49160->11200/tcp   angry_wilson        

可以看到正在运行的 Docker 容器(容器内运行着 cjserver 服务),并且服务的端口号被映射为 0.0.0.0:49160

所以现在可以来一发测试了:

curl "http://0.0.0.0:49160/?key=南京市长江大桥"

预期结果如下:

["南京市", "长江大桥"]

分词结果示例

MPSegment

Output:

我来到北京清华大学
我/来到/北京/清华大学

他来到了网易杭研大厦
他/来到/了/网易/杭/研/大厦

小明硕士毕业于中国科学院计算所,后在日本京都大学深造
小/明/硕士/毕业/于/中国科学院/计算所/,/后/在/日本京都大学/深造

HMMSegment

我来到北京清华大学
我来/到/北京/清华大学

他来到了网易杭研大厦
他来/到/了/网易/杭/研大厦

小明硕士毕业于中国科学院计算所,后在日本京都大学深造
小明/硕士/毕业于/中国/科学院/计算所/,/后/在/日/本/京/都/大/学/深/造

MixSegment

我来到北京清华大学
我/来到/北京/清华大学

他来到了网易杭研大厦
他/来到/了/网易/杭研/大厦

小明硕士毕业于中国科学院计算所,后在日本京都大学深造
小明/硕士/毕业/于/中国科学院/计算所/,/后/在/日本京都大学/深造

FullSegment

我来到北京清华大学
我/来到/北京/清华/清华大学/华大/大学

他来到了网易杭研大厦
他/来到/了/网易/杭/研/大厦

小明硕士毕业于中国科学院计算所,后在日本京都大学深造
小/明/硕士/毕业/于/中国/中国科学院/科学/科学院/学院/计算/计算所/,/后/在/日本/日本京都大学/京都/京都大学/大学/深造

QuerySegment

我来到北京清华大学
我/来到/北京/清华/清华大学/华大/大学

他来到了网易杭研大厦
他/来到/了/网易/杭研/大厦

小明硕士毕业于中国科学院计算所,后在日本京都大学深造
小明/硕士/毕业/于/中国/中国科学院/科学/科学院/学院/计算所/,/后/在/中国/中国科学院/科学/科学院/学院/日本/日本京都大学/京都/京都大学/大学/深造

以上依次是MP,HMM,Mix三种方法的效果。

可以看出效果最好的是Mix,也就是融合MP和HMM的切词算法。即可以准确切出词典已有的词,又可以切出像"杭研"这样的未登录词。

Full方法切出所有字典里的词语。

Query方法先使用Mix方法切词,对于切出来的较长的词再使用Full方法。

自定义用户词典

自定义词典示例请看test/testdata/userdict.utf8

载入自定义词典示例请看test/segment.cpp,产生的可执行文件示例请见 build/segment.demo

没有使用自定义用户词典时的结果:

令狐冲/是/云/计算/行业/的/专家

使用自定义用户词典时的结果:

令狐冲/是/云计算/行业/的/专家

关键词抽取

make && ./keyword.demo

你将看到如下结果:

我是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。
["CEO:11.7392", "升职:10.8562", "加薪:10.6426", "手扶拖拉机:10.0089", "巅峰:9.49396"]

详细请见 test/keyword_demo.cpp.

词性标注

./tagging.demo

详情请看 test/tagging_demo.cpp.

["我:r", "是:v", "蓝翔:x", "技工:n", "拖拉机:n", "学院:n", "手扶拖拉机:n", "专业:n", "的:uj", "。:x", "不用:v", "多久:m", ",:x", "我:r", "就:d", "会:v", "升职:v", "加薪:nr", ",:x", "当:t", "上:f", "总经理:n", ",:x", "出任:v", "CEO:eng", ",:x", "迎娶:v", "白富美:x", ",:x", "走上:v", "人生:n", "巅峰:n", "。:x"]

支持自定义词性。 比如在(dict/user.dict.utf8)增加一行

蓝翔 nz

结果如下:

["我:r", "是:v", "蓝翔:nz", "技工:n", "拖拉机:n", "学院:n", "手扶拖拉机:n", "专业:n", "的:uj", "。:x", "不用:v", "多久:m", ",:x", "我:r", "就:d", "会:v", "升职:v", "加薪:nr", ",:x", "当:t", "上:f", "总经理:n", ",:x", "出任:v", "CEO:eng", ",:x", "迎娶:v", "白富美:x", ",:x", "走上:v", "人生:n", "巅峰:n", "。:x"]

其它词典资料分享

应用

关于CppJieba的跨语言包装使用

收到邮件询问跨语言包装(ios应用开发)使用的问题,这方面我没有相关的经验,建议参考如下python使用cppjieba的项目:

jannson 开发的供 python模块调用的项目 cppjiebapy , 和相关讨论 cppjiebapy_discussion .

NodeJieba

如果有需要在node.js中使用分词,不妨试一下NodeJieba

simhash

如果有需要在处理中文文档的的相似度计算,不妨试一下simhash

exjieba

如果有需要在erlang中使用分词的话,不妨试一下exjieba

jiebaR

如果有需要在R中使用分词的话,不妨试一下jiebaR

libcppjieba

libcppjieba 是最简单易懂的CppJieba头文件库使用示例。

keyword_server

KeywordServer 50行搭建一个中文关键词抽取服务

ngx_http_cppjieba_module

如果有需要在Nginx中使用分词模块的话,不妨试一下ngx_http_cppjieba_module.

线上演示

http://cppjieba-webdemo.herokuapp.com/ (建议使用chrome打开)

客服

wuyanyi09@foxmail.com

鸣谢

"结巴"中文分词作者: SunJunyi
https://github.com/fxsjy/jieba

作者

The MIT License (MIT) Copyright (c) 2013 Yanyi Wu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

"结巴"中文分词的C++版本 展开 收起
C++
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C++
1
https://gitee.com/yanyiwu/cppjieba.git
git@gitee.com:yanyiwu/cppjieba.git
yanyiwu
cppjieba
cppjieba
master

搜索帮助

14c37bed 8189591 565d56ea 8189591