jieba_rb 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Gem Version](https://badge.fury.io/rb/jieba_rb.svg)](http://badge.fury.io/rb/jieba_rb)
|
4
|
+
|
5
|
+
[![Build Status](https://travis-ci.org/altkatz/jieba_rb.png?branch=master)](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 [![Build Status](https://travis-ci.org/aszxqw/cppjieba.png?branch=master)](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)
|