jieba_rb 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.gitmodules +3 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +51 -0
- data/Rakefile +11 -0
- data/ext/cppjieba/.gitignore +17 -0
- data/ext/cppjieba/.travis.yml +22 -0
- data/ext/cppjieba/CMakeLists.txt +27 -0
- data/ext/cppjieba/ChangeLog.md +81 -0
- data/ext/cppjieba/Dockerfile +11 -0
- data/ext/cppjieba/LICENSE +20 -0
- data/ext/cppjieba/README.md +359 -0
- data/ext/cppjieba/conf/CMakeLists.txt +1 -0
- data/ext/cppjieba/conf/server.conf +16 -0
- data/ext/cppjieba/dict/CMakeLists.txt +1 -0
- data/ext/cppjieba/dict/README.md +31 -0
- data/ext/cppjieba/dict/extra_dict/jieba.dict.small.utf8 +109750 -0
- data/ext/cppjieba/dict/gbk_dict/hmm_model.gbk +34 -0
- data/ext/cppjieba/dict/gbk_dict/jieba.dict.gbk +348982 -0
- data/ext/cppjieba/dict/hmm_model.utf8 +34 -0
- data/ext/cppjieba/dict/idf.utf8 +258826 -0
- data/ext/cppjieba/dict/jieba.dict.utf8 +348982 -0
- data/ext/cppjieba/dict/pos_dict/char_state_tab.utf8 +6653 -0
- data/ext/cppjieba/dict/pos_dict/prob_emit.utf8 +166 -0
- data/ext/cppjieba/dict/pos_dict/prob_start.utf8 +259 -0
- data/ext/cppjieba/dict/pos_dict/prob_trans.utf8 +5222 -0
- data/ext/cppjieba/dict/stop_words.utf8 +1534 -0
- data/ext/cppjieba/dict/user.dict.utf8 +3 -0
- data/ext/cppjieba/script/CMakeLists.txt +1 -0
- data/ext/cppjieba/script/cjserver.start +12 -0
- data/ext/cppjieba/script/cjserver.stop +13 -0
- data/ext/cppjieba/server/CMakeLists.txt +9 -0
- data/ext/cppjieba/server/Husky/HttpReqInfo.hpp +294 -0
- data/ext/cppjieba/server/Husky/IRequestHandler.hpp +18 -0
- data/ext/cppjieba/server/Husky/ThreadPoolServer.hpp +108 -0
- data/ext/cppjieba/server/Husky/WorkerThread.hpp +133 -0
- data/ext/cppjieba/server/server.cpp +91 -0
- data/ext/cppjieba/src/DictTrie.hpp +211 -0
- data/ext/cppjieba/src/FullSegment.hpp +153 -0
- data/ext/cppjieba/src/HMMSegment.hpp +394 -0
- data/ext/cppjieba/src/ISegment.hpp +17 -0
- data/ext/cppjieba/src/KeywordExtractor.hpp +173 -0
- data/ext/cppjieba/src/Limonp/ArgvContext.hpp +84 -0
- data/ext/cppjieba/src/Limonp/BlockingQueue.hpp +128 -0
- data/ext/cppjieba/src/Limonp/BoundedQueue.hpp +73 -0
- data/ext/cppjieba/src/Limonp/CastFloat.hpp +90 -0
- data/ext/cppjieba/src/Limonp/Condition.hpp +48 -0
- data/ext/cppjieba/src/Limonp/Config.hpp +118 -0
- data/ext/cppjieba/src/Limonp/HandyMacro.hpp +31 -0
- data/ext/cppjieba/src/Limonp/InitOnOff.hpp +21 -0
- data/ext/cppjieba/src/Limonp/LocalVector.hpp +171 -0
- data/ext/cppjieba/src/Limonp/Logger.hpp +74 -0
- data/ext/cppjieba/src/Limonp/Md5.hpp +432 -0
- data/ext/cppjieba/src/Limonp/MutexLock.hpp +57 -0
- data/ext/cppjieba/src/Limonp/MysqlClient.hpp +125 -0
- data/ext/cppjieba/src/Limonp/NonCopyable.hpp +22 -0
- data/ext/cppjieba/src/Limonp/StdExtension.hpp +139 -0
- data/ext/cppjieba/src/Limonp/StringUtil.hpp +349 -0
- data/ext/cppjieba/src/Limonp/Thread.hpp +50 -0
- data/ext/cppjieba/src/Limonp/ThreadPool.hpp +105 -0
- data/ext/cppjieba/src/MPSegment.hpp +148 -0
- data/ext/cppjieba/src/MixSegment.hpp +121 -0
- data/ext/cppjieba/src/PosTagger.hpp +109 -0
- data/ext/cppjieba/src/QuerySegment.hpp +123 -0
- data/ext/cppjieba/src/SegmentBase.hpp +78 -0
- data/ext/cppjieba/src/TransCode.hpp +63 -0
- data/ext/cppjieba/src/Trie.hpp +298 -0
- data/ext/cppjieba/test/CMakeLists.txt +7 -0
- data/ext/cppjieba/test/keyword_demo.cpp +16 -0
- data/ext/cppjieba/test/load_test.cpp +56 -0
- data/ext/cppjieba/test/segment_demo.cpp +59 -0
- data/ext/cppjieba/test/servertest/go_load_test.sh +2 -0
- data/ext/cppjieba/test/servertest/load_test.py +91 -0
- data/ext/cppjieba/test/servertest/run_curl.sh +11 -0
- data/ext/cppjieba/test/tagging_demo.cpp +12 -0
- data/ext/cppjieba/test/testdata/curl.res +1 -0
- data/ext/cppjieba/test/testdata/jieba.dict.0.1.utf8 +93 -0
- data/ext/cppjieba/test/testdata/jieba.dict.0.utf8 +93 -0
- data/ext/cppjieba/test/testdata/jieba.dict.1.utf8 +67 -0
- data/ext/cppjieba/test/testdata/jieba.dict.2.utf8 +64 -0
- data/ext/cppjieba/test/testdata/load_test.urls +2 -0
- data/ext/cppjieba/test/testdata/review.100 +100 -0
- data/ext/cppjieba/test/testdata/review.100.res +200 -0
- data/ext/cppjieba/test/testdata/server.conf +13 -0
- data/ext/cppjieba/test/testdata/testlines.gbk +9 -0
- data/ext/cppjieba/test/testdata/testlines.utf8 +8 -0
- data/ext/cppjieba/test/testdata/userdict.utf8 +6 -0
- data/ext/cppjieba/test/testdata/weicheng.utf8 +247 -0
- data/ext/cppjieba/test/unittest/CMakeLists.txt +28 -0
- data/ext/cppjieba/test/unittest/TKeywordExtractor.cpp +18 -0
- data/ext/cppjieba/test/unittest/TPosTagger.cpp +43 -0
- data/ext/cppjieba/test/unittest/TSegments.cpp +187 -0
- data/ext/cppjieba/test/unittest/TTrie.cpp +80 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-death-test.h +283 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-message.h +230 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-param-test.h +1421 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-param-test.h.pump +487 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-printers.h +796 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-spi.h +232 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-test-part.h +176 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-typed-test.h +259 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest.h +2155 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest_pred_impl.h +358 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest_prod.h +58 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-death-test-internal.h +308 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-filepath.h +210 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-internal.h +1226 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-param-util-generated.h +4822 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-param-util.h +619 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-port.h +1788 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-string.h +350 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-tuple.h +968 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-tuple.h.pump +336 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-type-util.h +3330 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-type-util.h.pump +296 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/.deps/.dirstamp +0 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/.deps/gtest-all.Plo +681 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/.deps/gtest_main.Plo +509 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/.dirstamp +0 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-all.cc +48 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-death-test.cc +1234 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-filepath.cc +380 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-internal-inl.h +1038 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-port.cc +746 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-printers.cc +356 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-test-part.cc +110 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-typed-test.cc +110 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest.cc +4898 -0
- data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest_main.cc +39 -0
- data/ext/cppjieba/test/unittest/gtest_main.cpp +39 -0
- data/ext/jieba/extconf.rb +26 -0
- data/ext/jieba/jieba.c +9 -0
- data/ext/jieba/jieba.h +9 -0
- data/ext/jieba/segment.cc +88 -0
- data/ext/jieba/segment.h +17 -0
- data/jieba_rb.gemspec +51 -0
- data/lib/jieba_rb/version.rb +3 -0
- data/lib/jieba_rb.rb +28 -0
- data/test/test_segment.rb +32 -0
- metadata +246 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 122f7b0e8353ea96f9eecc620c894d8dc27b3402
|
|
4
|
+
data.tar.gz: 8ceb3c44c9957f8a080653f091580d6ea24a7e48
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 39f49d5d34221863aab6864465a8671a662e4d94fdb93ffe0439fd2f89d7b63d983002c031abb54e651a5a2f99d220f4ec27b24778774f93497dd9ecf9e788df
|
|
7
|
+
data.tar.gz: 9232b90f160726d296d64c95bbb39545ebb1ed362fef0463fdd30a9d7777dedfe37cbca162cdf31618cf3cc1502c7db5de815866fba80956dc97325bbe881372
|
data/.gitignore
ADDED
data/.gitmodules
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2014 Li Qi
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# JiebaRb
|
|
2
|
+
|
|
3
|
+
[](http://badge.fury.io/rb/jieba_rb)
|
|
4
|
+
|
|
5
|
+
[](https://travis-ci.org/altkatz/jieba_rb)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Ruby extension for [Cppjieba](https://github.com/aszxqw/cppjieba)
|
|
9
|
+
|
|
10
|
+
## Installation
|
|
11
|
+
|
|
12
|
+
Add this line to your application's Gemfile:
|
|
13
|
+
|
|
14
|
+
gem 'jieba_rb'
|
|
15
|
+
|
|
16
|
+
And then execute:
|
|
17
|
+
|
|
18
|
+
$ bundle
|
|
19
|
+
|
|
20
|
+
Or install it yourself as:
|
|
21
|
+
|
|
22
|
+
$ gem install jieba_rb
|
|
23
|
+
|
|
24
|
+
## Word segment Usage
|
|
25
|
+
|
|
26
|
+
Mix Segment (HMM with Max Prob, default):
|
|
27
|
+
|
|
28
|
+
require 'jieba_rb'
|
|
29
|
+
seg = JiebaRb::Segment.new type: :mix
|
|
30
|
+
words = seg.cut "令狐冲是云计算行业的专家"
|
|
31
|
+
# 令狐冲 是 云 计算 行业 的 专家
|
|
32
|
+
|
|
33
|
+
Mix Segment with user-defined dictionary:
|
|
34
|
+
|
|
35
|
+
seg = JiebaRb::Segment.new type: :mix, user_dict: "ext/cppjieba/dict/user.dict.utf8"
|
|
36
|
+
words = seg.cut "令狐冲是云计算行业的专家"
|
|
37
|
+
# 令狐冲 是 云计算 行业 的 专家
|
|
38
|
+
|
|
39
|
+
HMM or Max probability (mp) Segment:
|
|
40
|
+
|
|
41
|
+
seg = JiebaRb::Segment.new type: :hmm # or type: :mp
|
|
42
|
+
words = seg.cut "令狐冲是云计算行业的专家"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
## Contributing
|
|
46
|
+
|
|
47
|
+
1. Fork it ( http://github.com/<my-github-username>/jieba_rb/fork )
|
|
48
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
49
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
50
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
51
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
language: cpp
|
|
2
|
+
before_install:
|
|
3
|
+
- sudo apt-get install cmake
|
|
4
|
+
script:
|
|
5
|
+
- mkdir build
|
|
6
|
+
- cd build
|
|
7
|
+
- cmake ..
|
|
8
|
+
- make
|
|
9
|
+
- ./test/test.run
|
|
10
|
+
- ./load_test
|
|
11
|
+
os:
|
|
12
|
+
- linux
|
|
13
|
+
- osx
|
|
14
|
+
compiler:
|
|
15
|
+
- clang
|
|
16
|
+
- gcc
|
|
17
|
+
notifications:
|
|
18
|
+
recipients:
|
|
19
|
+
- wuyanyi09@foxmail.com
|
|
20
|
+
email:
|
|
21
|
+
on_success: change
|
|
22
|
+
on_failure: always
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
PROJECT(CPPJIEBA)
|
|
2
|
+
|
|
3
|
+
CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
|
|
4
|
+
|
|
5
|
+
if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
|
6
|
+
set (CMAKE_INSTALL_PREFIX "/usr" CACHE PATH "default install path" FORCE )
|
|
7
|
+
endif()
|
|
8
|
+
|
|
9
|
+
ADD_DEFINITIONS(-O3 -Wall -g)
|
|
10
|
+
IF(APPLE) # mac os
|
|
11
|
+
ADD_DEFINITIONS(-std=c++0x)
|
|
12
|
+
endif()
|
|
13
|
+
|
|
14
|
+
# cmake .. -DENC=GBK
|
|
15
|
+
# IF (DEFINED ENC)
|
|
16
|
+
# ADD_DEFINITIONS(-DCPPJIEBA_${ENC})
|
|
17
|
+
# ENDIF()
|
|
18
|
+
|
|
19
|
+
ADD_SUBDIRECTORY(server)
|
|
20
|
+
ADD_SUBDIRECTORY(dict)
|
|
21
|
+
ADD_SUBDIRECTORY(script)
|
|
22
|
+
ADD_SUBDIRECTORY(conf)
|
|
23
|
+
|
|
24
|
+
ADD_SUBDIRECTORY(test)
|
|
25
|
+
|
|
26
|
+
ENABLE_TESTING()
|
|
27
|
+
ADD_TEST(NAME test.run COMMAND test.run)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# CppJieba ChangeLog
|
|
2
|
+
|
|
3
|
+
## v2.4.4 (is coming)
|
|
4
|
+
|
|
5
|
+
1. 修改两条更细粒度的特殊过滤规则,将连续的数字(包括浮点数)和连续的字母单独切分出来(而不会混在一起)。
|
|
6
|
+
2. 修改最大概率法时动态规划过程需要使用的 DAG 数据结构(同时也修改 Trie 的 DAG 查询函数),提高分词速度 8% 。
|
|
7
|
+
3. 使用了 `Aho-Corasick-Automation` 算法提速 Trie 查找的过程等优化,提升性能。
|
|
8
|
+
4. 增加词性标注的两条特殊规则。
|
|
9
|
+
|
|
10
|
+
## v2.4.3
|
|
11
|
+
|
|
12
|
+
1. 更新 [Husky] 服务代码,新 [Husky] 为基于线程池的服务器简易框架。并且修复当 HTTP POST 请求时 body 过长数据可能丢失的问题。
|
|
13
|
+
2. 修改 PosTagger 的参数结构,删除暂时无用的参数。并添加使用自定义字典的参数,也就是支持 **自定义词性**。
|
|
14
|
+
3. 更好的支持 `mac osx` (原谅作者如此屌丝,这么晚才买 `mac` )。
|
|
15
|
+
4. 支持 `Docker` ,具体请见 `Dockerfile` 。
|
|
16
|
+
|
|
17
|
+
## v2.4.2
|
|
18
|
+
|
|
19
|
+
1. 适当使用 `vector`, 的基础上,使用`Limonp/LocalVector.hpp`作为`Unicode`的类型等优化,约提高性能 `30%`。
|
|
20
|
+
2. 使 `cjserver` 支持用户自定义词典,通过在 `conf/server.conf` 里面配置 `user_dict_path` 来实现。
|
|
21
|
+
3. 修复 `MPSegment` 切词时,当句子中含有特殊字符时,切词结果不完整的问题。
|
|
22
|
+
4. 修改 `FullSegment` 减少内存使用。
|
|
23
|
+
5. 修改 `-std=c++0x` 或者 `-std=c++11` 时编译失败的问题。
|
|
24
|
+
|
|
25
|
+
## v2.4.1
|
|
26
|
+
|
|
27
|
+
1. 完善一些特殊字符和字母串的切词效果。
|
|
28
|
+
2. 提高关键词抽取的速度。
|
|
29
|
+
3. 提供用户自定义词典的接口。
|
|
30
|
+
4. 将server相关的代码独立出来,单独放在`server/`目录下。
|
|
31
|
+
5. 修复用户自定义词典中单字会被MixSegment的新词发现功能给忽略的问题。也就是说,现在的词典是用户词典优先级最高,其次是自带的词典,再其次是新词发现出来的词。
|
|
32
|
+
|
|
33
|
+
## v2.4.0
|
|
34
|
+
|
|
35
|
+
1. 适配更低级版本的`g++`和`cmake`,已在`g++ 4.1.2`和`cmake 2.6`上测试通过。
|
|
36
|
+
2. 修改一些测试用例的文件,减少测试时编译的时间。
|
|
37
|
+
3. 修复`make install`相关的问题。
|
|
38
|
+
4. 增加HTTP服务的POST请求接口。
|
|
39
|
+
5. 拆分`Trie.hpp`成`DictTrie.hpp`和`Trie.hpp`,将trie树这个数据结构抽象出来,并且修复Trie这个类潜在的bug并完善单元测试。
|
|
40
|
+
6. 重写cjserver的启动和停止,新启动和停止方法详见README.md。
|
|
41
|
+
|
|
42
|
+
## v2.3.4
|
|
43
|
+
|
|
44
|
+
1. 修改了设计上的问题,删除了`TrieManager`这个类,以避免造成一些可能的隐患。
|
|
45
|
+
2. 增加`stop_words.utf8`词典,并修改`KeywordExtractor`的初始化函数用以使用此词典。
|
|
46
|
+
3. 优化了`Trie`树相关部分代码结构。
|
|
47
|
+
|
|
48
|
+
## v2.3.3
|
|
49
|
+
|
|
50
|
+
1. 修复因为使用unordered_map导致的在不同机器上结果不一致的问题。
|
|
51
|
+
2. 将部分数据结果从unordered_map改为map,提升了差不多1/6的切词速度。(因为unordered_map虽然查找速度快,但是在范围迭代的效率较低。)
|
|
52
|
+
|
|
53
|
+
## v2.3.2
|
|
54
|
+
|
|
55
|
+
1. 修复单元测试的问题,有些case在x84和x64中结果不一致。
|
|
56
|
+
2. merge进词性标注的简单版本。
|
|
57
|
+
|
|
58
|
+
## v2.3.1
|
|
59
|
+
|
|
60
|
+
1. 修复安装时的服务启动问题(不过安装切词服务只是linux下的一个附加功能,不影响核心代码。)
|
|
61
|
+
|
|
62
|
+
## v2.3.0
|
|
63
|
+
|
|
64
|
+
1. 增加`KeywordExtractor.hpp`来进行关键词抽取。
|
|
65
|
+
2. 使用`gtest`来做单元测试。
|
|
66
|
+
|
|
67
|
+
## v2.2.0
|
|
68
|
+
|
|
69
|
+
1. 性能优化,提升切词速度约6倍。
|
|
70
|
+
2. 其他暂时也想不起来了。
|
|
71
|
+
|
|
72
|
+
## v2.1.1 (v2.1.1之前的统统一起写在 v2.1.1里面了)
|
|
73
|
+
|
|
74
|
+
1. 完成__最大概率分词算法__和__HMM分词算法__,并且将他们结合起来成效果最好的`MixSegment`。
|
|
75
|
+
2. 进行大量的代码重构,将主要的功能性代码都写成了hpp文件。
|
|
76
|
+
3. 使用`cmake`工具来管理项目。
|
|
77
|
+
4. 使用 [Limonp]作为工具函数库,比如日志,字符串操作等常用函数。
|
|
78
|
+
5. 使用 [Husky] 搭简易分词服务的服务器框架。
|
|
79
|
+
|
|
80
|
+
[Limonp]:http://github.com/aszxqw/limonp.git
|
|
81
|
+
[Husky]:http://github.com/aszxqw/husky.git
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
FROM ubuntu:14.04
|
|
2
|
+
MAINTAINER yanyiwu <wuyanyi09@foxmail.com>
|
|
3
|
+
RUN apt-get update
|
|
4
|
+
RUN apt-get install -y g++ cmake git
|
|
5
|
+
RUN git clone https://github.com/aszxqw/cppjieba.git
|
|
6
|
+
RUN mkdir cppjieba/build
|
|
7
|
+
WORKDIR /cppjieba/build
|
|
8
|
+
RUN cmake ..
|
|
9
|
+
RUN make
|
|
10
|
+
EXPOSE 11200
|
|
11
|
+
CMD ["./bin/cjserver", "../test/testdata/server.conf"]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2013 Yanyi Wu
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
7
|
+
the Software without restriction, including without limitation the rights to
|
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
10
|
+
subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
# CppJieba [](https://travis-ci.org/aszxqw/cppjieba)
|
|
2
|
+
|
|
3
|
+
## 简介
|
|
4
|
+
|
|
5
|
+
CppJieba是"结巴"中文分词的C++版本
|
|
6
|
+
|
|
7
|
+
代码细节详解请见 [代码详解]
|
|
8
|
+
|
|
9
|
+
## 特性
|
|
10
|
+
|
|
11
|
+
+ 源代码都写进头文件`src/*.hpp`里,`include`即可使用。
|
|
12
|
+
+ 支持`utf-8, gbk`编码,但是推荐使用`utf-8`编码, 因为`gbk`编码缺少严格测试,慎用。
|
|
13
|
+
+ 内置分词服务`server/server.cpp`,在linux环境下可安装使用。
|
|
14
|
+
+ 项目自带较为完善的单元测试,核心功能中文分词(utf8)的稳定性接受过线上环境检验。
|
|
15
|
+
+ 支持载自定义用户词典。
|
|
16
|
+
+ 支持 `linux` , `mac osx` 操作系统。
|
|
17
|
+
+ 支持 `Docker`。
|
|
18
|
+
|
|
19
|
+
## 用法
|
|
20
|
+
|
|
21
|
+
### 依赖软件
|
|
22
|
+
|
|
23
|
+
* `g++ (version >= 4.1 recommended) or clang++`;
|
|
24
|
+
* `cmake (version >= 2.6 recommended)`;
|
|
25
|
+
|
|
26
|
+
### 下载和编译
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
git clone --depth=10 --branch=master git://github.com/aszxqw/cppjieba.git
|
|
30
|
+
cd cppjieba
|
|
31
|
+
mkdir build
|
|
32
|
+
cd build
|
|
33
|
+
cmake ..
|
|
34
|
+
make
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
有兴趣的可以跑跑测试(可选):
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
./test/test.run
|
|
41
|
+
./load_test
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 演示
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
./segment.demo
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
详细请看 `test/segment_demo.cpp`.
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
## 服务使用
|
|
54
|
+
|
|
55
|
+
### 启动服务
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
./bin/cjserver ../test/testdata/server.conf
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 客户端请求示例
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
curl "http://127.0.0.1:11200/?key=南京市长江大桥"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
["南京市", "长江大桥"]
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
curl "http://127.0.0.1:11200/?key=南京市长江大桥&format=simple"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
南京市 长江大桥
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
用 chrome 浏览器打开也行 ( chrome 设置默认编码是`utf-8`):
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
同时,也支持HTTP POST模式,使用如下调用:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
curl -d "南京市长江大桥" "http://127.0.0.1:11200/"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
返回结果如下:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
["南京市", "长江大桥"]
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
如果有需要**安装使用**的,可以按照如下操作:
|
|
95
|
+
|
|
96
|
+
### 安装服务
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
sudo make install
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 服务启动和停止(仅限 linux 系统)
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
/etc/init.d/cjserver.start >> /dev/null 2>&1
|
|
106
|
+
/etc/init.d/cjserver.stop
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 卸载服务(仅限 linux 系统)
|
|
110
|
+
|
|
111
|
+
```sh
|
|
112
|
+
cd build/
|
|
113
|
+
cat install_manifest.txt | sudo xargs rm -rf
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Docker 示例
|
|
117
|
+
|
|
118
|
+
安装和启动
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
sudo docker pull yanyiwu/cppjieba
|
|
122
|
+
sudo docker run -d -P yanyiwu/cppjieba
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
sudo docker ps
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
|
131
|
+
7c29325e9c20 yanyiwu/cppjieba:latest "./bin/cjserver ../t 4 minutes ago Up 4 minutes 0.0.0.0:49160->11200/tcp angry_wilson
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
可以看到正在运行的 Docker 容器(容器内运行着 `cjserver` 服务),并且服务的端口号被映射为 `0.0.0.0:49160` 。
|
|
135
|
+
|
|
136
|
+
所以现在可以来一发测试了:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
curl "http://0.0.0.0:49160/?key=南京市长江大桥"
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
预期结果如下:
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
["南京市", "长江大桥"]
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 分词结果示例
|
|
149
|
+
|
|
150
|
+
**MPSegment**
|
|
151
|
+
|
|
152
|
+
Output:
|
|
153
|
+
```
|
|
154
|
+
我来到北京清华大学
|
|
155
|
+
我/来到/北京/清华大学
|
|
156
|
+
|
|
157
|
+
他来到了网易杭研大厦
|
|
158
|
+
他/来到/了/网易/杭/研/大厦
|
|
159
|
+
|
|
160
|
+
小明硕士毕业于中国科学院计算所,后在日本京都大学深造
|
|
161
|
+
小/明/硕士/毕业/于/中国科学院/计算所/,/后/在/日本京都大学/深造
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**HMMSegment**
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
我来到北京清华大学
|
|
169
|
+
我来/到/北京/清华大学
|
|
170
|
+
|
|
171
|
+
他来到了网易杭研大厦
|
|
172
|
+
他来/到/了/网易/杭/研大厦
|
|
173
|
+
|
|
174
|
+
小明硕士毕业于中国科学院计算所,后在日本京都大学深造
|
|
175
|
+
小明/硕士/毕业于/中国/科学院/计算所/,/后/在/日/本/京/都/大/学/深/造
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**MixSegment**
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
我来到北京清华大学
|
|
183
|
+
我/来到/北京/清华大学
|
|
184
|
+
|
|
185
|
+
他来到了网易杭研大厦
|
|
186
|
+
他/来到/了/网易/杭研/大厦
|
|
187
|
+
|
|
188
|
+
小明硕士毕业于中国科学院计算所,后在日本京都大学深造
|
|
189
|
+
小明/硕士/毕业/于/中国科学院/计算所/,/后/在/日本京都大学/深造
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**FullSegment**
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
我来到北京清华大学
|
|
197
|
+
我/来到/北京/清华/清华大学/华大/大学
|
|
198
|
+
|
|
199
|
+
他来到了网易杭研大厦
|
|
200
|
+
他/来到/了/网易/杭/研/大厦
|
|
201
|
+
|
|
202
|
+
小明硕士毕业于中国科学院计算所,后在日本京都大学深造
|
|
203
|
+
小/明/硕士/毕业/于/中国/中国科学院/科学/科学院/学院/计算/计算所/,/后/在/日本/日本京都大学/京都/京都大学/大学/深造
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**QuerySegment**
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
我来到北京清华大学
|
|
211
|
+
我/来到/北京/清华/清华大学/华大/大学
|
|
212
|
+
|
|
213
|
+
他来到了网易杭研大厦
|
|
214
|
+
他/来到/了/网易/杭研/大厦
|
|
215
|
+
|
|
216
|
+
小明硕士毕业于中国科学院计算所,后在日本京都大学深造
|
|
217
|
+
小明/硕士/毕业/于/中国/中国科学院/科学/科学院/学院/计算所/,/后/在/中国/中国科学院/科学/科学院/学院/日本/日本京都大学/京都/京都大学/大学/深造
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
以上依次是MP,HMM,Mix三种方法的效果。
|
|
222
|
+
|
|
223
|
+
可以看出效果最好的是Mix,也就是融合MP和HMM的切词算法。即可以准确切出词典已有的词,又可以切出像"杭研"这样的未登录词。
|
|
224
|
+
|
|
225
|
+
Full方法切出所有字典里的词语。
|
|
226
|
+
|
|
227
|
+
Query方法先使用Mix方法切词,对于切出来的较长的词再使用Full方法。
|
|
228
|
+
|
|
229
|
+
### 自定义用户词典
|
|
230
|
+
|
|
231
|
+
自定义词典示例请看`test/testdata/userdict.utf8`。
|
|
232
|
+
|
|
233
|
+
载入自定义词典示例请看`test/segment.cpp`,产生的可执行文件示例请见 `build/segment.demo`
|
|
234
|
+
|
|
235
|
+
没有使用自定义用户词典时的结果:
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
令狐冲/是/云/计算/行业/的/专家
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
使用自定义用户词典时的结果:
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
令狐冲/是/云计算/行业/的/专家
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### 关键词抽取
|
|
248
|
+
|
|
249
|
+
```
|
|
250
|
+
make && ./keyword.demo
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
你将看到如下结果:
|
|
254
|
+
|
|
255
|
+
```
|
|
256
|
+
我是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。
|
|
257
|
+
["CEO:11.7392", "升职:10.8562", "加薪:10.6426", "手扶拖拉机:10.0089", "巅峰:9.49396"]
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
详细请见 `test/keyword_demo.cpp`.
|
|
261
|
+
|
|
262
|
+
### 词性标注
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
./tagging.demo
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
详情请看 `test/tagging_demo.cpp`.
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
["我: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"]
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
支持自定义词性。
|
|
275
|
+
比如在(`dict/user.dict.utf8`)增加一行
|
|
276
|
+
|
|
277
|
+
```
|
|
278
|
+
蓝翔 nz
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
结果如下:
|
|
282
|
+
|
|
283
|
+
```
|
|
284
|
+
["我: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"]
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## 其它词典资料分享
|
|
288
|
+
|
|
289
|
+
+ [dict.367W.utf8.tar.gz] iLife(`562193561@qq.com`)
|
|
290
|
+
|
|
291
|
+
## 应用
|
|
292
|
+
|
|
293
|
+
### 关于CppJieba的跨语言包装使用
|
|
294
|
+
|
|
295
|
+
收到邮件询问跨语言包装(ios应用开发)使用的问题,这方面我没有相关的经验,建议参考如下python使用cppjieba的项目:
|
|
296
|
+
|
|
297
|
+
[jannson] 开发的供 python模块调用的项目 [cppjiebapy] , 和相关讨论 [cppjiebapy_discussion] .
|
|
298
|
+
|
|
299
|
+
### NodeJieba
|
|
300
|
+
|
|
301
|
+
如果有需要在`node.js`中使用分词,不妨试一下[NodeJieba]。
|
|
302
|
+
|
|
303
|
+
### simhash
|
|
304
|
+
|
|
305
|
+
如果有需要在处理中文文档的的相似度计算,不妨试一下[simhash]。
|
|
306
|
+
|
|
307
|
+
### exjieba
|
|
308
|
+
|
|
309
|
+
如果有需要在`erlang`中使用分词的话,不妨试一下[exjieba]。
|
|
310
|
+
|
|
311
|
+
### jiebaR
|
|
312
|
+
|
|
313
|
+
如果有需要在`R`中使用分词的话,不妨试一下[jiebaR]。
|
|
314
|
+
|
|
315
|
+
### libcppjieba
|
|
316
|
+
|
|
317
|
+
[libcppjieba] 是最简单易懂的CppJieba头文件库使用示例。
|
|
318
|
+
|
|
319
|
+
### keyword\_server
|
|
320
|
+
|
|
321
|
+
[KeywordServer] 50行搭建一个**中文关键词抽取服务**。
|
|
322
|
+
|
|
323
|
+
### ngx\_http\_cppjieba\_module
|
|
324
|
+
|
|
325
|
+
如果有需要在`Nginx`中使用分词模块的话,不妨试一下[ngx_http_cppjieba_module].
|
|
326
|
+
|
|
327
|
+
## 线上演示
|
|
328
|
+
|
|
329
|
+
http://cppjieba-webdemo.herokuapp.com/
|
|
330
|
+
(建议使用chrome打开)
|
|
331
|
+
|
|
332
|
+
## 客服
|
|
333
|
+
|
|
334
|
+
`wuyanyi09@foxmail.com`
|
|
335
|
+
|
|
336
|
+
## 鸣谢
|
|
337
|
+
|
|
338
|
+
"结巴"中文分词作者: SunJunyi
|
|
339
|
+
https://github.com/fxsjy/jieba
|
|
340
|
+
|
|
341
|
+
## 作者
|
|
342
|
+
|
|
343
|
+
- aszxqw https://github.com/aszxqw wuyanyi09@foxmail.com
|
|
344
|
+
- aholic https://github.com/aholic ruochen.xu@gmail.com
|
|
345
|
+
|
|
346
|
+
[CppJieba]:https://github.com/aszxqw/cppjieba
|
|
347
|
+
[jannson]:https://github.com/jannson
|
|
348
|
+
[cppjiebapy]:https://github.com/jannson/cppjiebapy
|
|
349
|
+
[cppjiebapy_discussion]:https://github.com/aszxqw/cppjieba/issues/1
|
|
350
|
+
[NodeJieba]:https://github.com/aszxqw/nodejieba
|
|
351
|
+
[jiebaR]:https://github.com/qinwf/jiebaR
|
|
352
|
+
[simhash]:https://github.com/aszxqw/simhash
|
|
353
|
+
[代码详解]:https://github.com/aszxqw/cppjieba/wiki/CppJieba%E4%BB%A3%E7%A0%81%E8%AF%A6%E8%A7%A3
|
|
354
|
+
[libcppjieba]:https://github.com/aszxqw/libcppjieba
|
|
355
|
+
[issue25]:https://github.com/aszxqw/cppjieba/issues/25
|
|
356
|
+
[exjieba]:https://github.com/falood/exjieba
|
|
357
|
+
[KeywordServer]:https://github.com/aszxqw/keyword_server
|
|
358
|
+
[ngx_http_cppjieba_module]:https://github.com/aszxqw/ngx_http_cppjieba_module
|
|
359
|
+
[dict.367W.utf8.tar.gz]:http://pan.baidu.com/s/1o6A0BWY
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
INSTALL(FILES server.conf DESTINATION /etc/CppJieba)
|