Skip to content
forked from yanyiwu/cppjieba

"结巴"中文分词的C++版本,使用 darts Double Array Trie 降低内存占用到 1/100

Notifications You must be signed in to change notification settings

byronhe/cppjieba

This branch is 6 commits ahead of, 70 commits behind yanyiwu/cppjieba:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

author
byronhe
Aug 26, 2022
a0db409 · Aug 26, 2022
Aug 26, 2022
Jul 22, 2016
Aug 26, 2022
Aug 26, 2022
Jan 17, 2014
Apr 3, 2017
Jan 20, 2016
Mar 11, 2020
Jul 22, 2020
Sep 21, 2019
Apr 27, 2016

Repository files navigation

CppJieba English

Build Status Author Donate Platform Performance Tag License Build status

logo

简介

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

特性

  • 源代码都写进头文件include/cppjieba/*.hpp里,include即可使用。
  • 支持utf8编码。
  • 项目自带较为完善的单元测试,核心功能中文分词(utf8)的稳定性接受过线上环境检验。
  • 支持载自定义用户词典,多路径时支持分隔符'|'或者';'分隔。
  • 支持 Linux , Mac OSX, Windows 操作系统。

引入 darts 后的不兼容改动

  • 由于 Double Array Trie 无法支持动态插入词,删除 InsertUserWord() 方法
  • FullSegment.hpp 中 maxId 的计算有 bug,做了 fix。
  • 为了节省内存,改成允许传入空的 idfPath 和 stopWordPath 。
  • 会生成 Double Array Trie 临时文件,临时文件名默认会自动生成,也可以传 dict_cache_path 指定
  • 改成自定义词典中重复的词,保留权重最大的。
  • 删除 Unicode.hpp 中的无用代码

用法

依赖软件

  • g++ (version >= 4.1 is recommended) or clang++;
  • cmake (version >= 2.6 is recommended);

下载和编译

git clone --depth=10 --branch=master git://github.com/yanyiwu/cppjieba.git
cd cppjieba
mkdir build
cd build
cmake ..
make

有兴趣的可以跑跑测试(可选):

make test

Demo

./demo

结果示例:

[demo] Cut With HMM
他/来到/了/网易/杭研/大厦
[demo] Cut Without HMM
他/来到/了/网易/杭/研/大厦
我来到北京清华大学
[demo] CutAll
我/来到/北京/清华/清华大学/华大/大学
小明硕士毕业于中国科学院计算所,后在日本京都大学深造
[demo] CutForSearch
小明/硕士/毕业/于/中国/科学/学院/科学院/中国科学院/计算/计算所/,/后/在/日本/京都/大学/日本京都大学/深造
[demo] Insert User Word
男默/女泪
男默女泪
[demo] CutForSearch Word With Offset
[{"word": "小明", "offset": 0}, {"word": "硕士", "offset": 6}, {"word": "毕业", "offset": 12}, {"word": "于", "offset": 18}, {"word": "中国", "offset": 21}, {"word": "科学", "offset": 27}, {"word": "学院", "offset": 30}, {"word": "科学院", "offset": 27}, {"word": "中国科学院", "offset": 21}, {"word": "计算", "offset": 36}, {"word": "计算所", "offset": 36}, {"word": ",", "offset": 45}, {"word": "后", "offset": 48}, {"word": "在", "offset": 51}, {"word": "日本", "offset": 54}, {"word": "京都", "offset": 60}, {"word": "大学", "offset": 66}, {"word": "日本京都大学", "offset": 54}, {"word": "深造", "offset": 72}]
[demo] Tagging
我是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。
[我:r, 是:v, 拖拉机:n, 学院:n, 手扶拖拉机:n, 专业:n, 的:uj, 。:x, 不用:v, 多久:m, ,:x, 我:r, 就:d, 会:v, 升职:v, 加薪:nr, ,:x, 当上:t, CEO:eng, ,:x, 走上:v, 人生:n, 巅峰:n, 。:x]
[demo] Keyword Extraction
我是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。
[{"word": "CEO", "offset": [93], "weight": 11.7392}, {"word": "升职", "offset": [72], "weight": 10.8562}, {"word": "加薪", "offset": [78], "weight": 10.6426}, {"word": "手扶拖拉机", "offset": [21], "weight": 10.0089}, {"word": "巅峰", "offset": [111], "weight": 9.49396}]

详细请看 test/demo.cpp.

分词结果示例

MPSegment

Output:

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

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

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

HMMSegment

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

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

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

MixSegment

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

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

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

FullSegment

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

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

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

QuerySegment

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

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

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

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

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

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

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

自定义用户词典

自定义词典示例请看dict/user.dict.utf8

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

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

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

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

关键词抽取

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

详细请见 test/demo.cpp.

词性标注

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

详细请看 test/demo.cpp.

支持自定义词性。 比如在(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"]

其它词典资料分享

应用

线上演示

Web-Demo (建议使用chrome打开)

性能评测

Jieba中文分词系列性能评测

Sponsorship

sponsorship

Contributors

Code Contributors

This project exists thanks to all the people who contribute.

About

"结巴"中文分词的C++版本,使用 darts Double Array Trie 降低内存占用到 1/100

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C++ 98.6%
  • CMake 1.3%
  • Shell 0.1%