jieba_rb 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +51 -0
  8. data/Rakefile +11 -0
  9. data/ext/cppjieba/.gitignore +17 -0
  10. data/ext/cppjieba/.travis.yml +22 -0
  11. data/ext/cppjieba/CMakeLists.txt +27 -0
  12. data/ext/cppjieba/ChangeLog.md +81 -0
  13. data/ext/cppjieba/Dockerfile +11 -0
  14. data/ext/cppjieba/LICENSE +20 -0
  15. data/ext/cppjieba/README.md +359 -0
  16. data/ext/cppjieba/conf/CMakeLists.txt +1 -0
  17. data/ext/cppjieba/conf/server.conf +16 -0
  18. data/ext/cppjieba/dict/CMakeLists.txt +1 -0
  19. data/ext/cppjieba/dict/README.md +31 -0
  20. data/ext/cppjieba/dict/extra_dict/jieba.dict.small.utf8 +109750 -0
  21. data/ext/cppjieba/dict/gbk_dict/hmm_model.gbk +34 -0
  22. data/ext/cppjieba/dict/gbk_dict/jieba.dict.gbk +348982 -0
  23. data/ext/cppjieba/dict/hmm_model.utf8 +34 -0
  24. data/ext/cppjieba/dict/idf.utf8 +258826 -0
  25. data/ext/cppjieba/dict/jieba.dict.utf8 +348982 -0
  26. data/ext/cppjieba/dict/pos_dict/char_state_tab.utf8 +6653 -0
  27. data/ext/cppjieba/dict/pos_dict/prob_emit.utf8 +166 -0
  28. data/ext/cppjieba/dict/pos_dict/prob_start.utf8 +259 -0
  29. data/ext/cppjieba/dict/pos_dict/prob_trans.utf8 +5222 -0
  30. data/ext/cppjieba/dict/stop_words.utf8 +1534 -0
  31. data/ext/cppjieba/dict/user.dict.utf8 +3 -0
  32. data/ext/cppjieba/script/CMakeLists.txt +1 -0
  33. data/ext/cppjieba/script/cjserver.start +12 -0
  34. data/ext/cppjieba/script/cjserver.stop +13 -0
  35. data/ext/cppjieba/server/CMakeLists.txt +9 -0
  36. data/ext/cppjieba/server/Husky/HttpReqInfo.hpp +294 -0
  37. data/ext/cppjieba/server/Husky/IRequestHandler.hpp +18 -0
  38. data/ext/cppjieba/server/Husky/ThreadPoolServer.hpp +108 -0
  39. data/ext/cppjieba/server/Husky/WorkerThread.hpp +133 -0
  40. data/ext/cppjieba/server/server.cpp +91 -0
  41. data/ext/cppjieba/src/DictTrie.hpp +211 -0
  42. data/ext/cppjieba/src/FullSegment.hpp +153 -0
  43. data/ext/cppjieba/src/HMMSegment.hpp +394 -0
  44. data/ext/cppjieba/src/ISegment.hpp +17 -0
  45. data/ext/cppjieba/src/KeywordExtractor.hpp +173 -0
  46. data/ext/cppjieba/src/Limonp/ArgvContext.hpp +84 -0
  47. data/ext/cppjieba/src/Limonp/BlockingQueue.hpp +128 -0
  48. data/ext/cppjieba/src/Limonp/BoundedQueue.hpp +73 -0
  49. data/ext/cppjieba/src/Limonp/CastFloat.hpp +90 -0
  50. data/ext/cppjieba/src/Limonp/Condition.hpp +48 -0
  51. data/ext/cppjieba/src/Limonp/Config.hpp +118 -0
  52. data/ext/cppjieba/src/Limonp/HandyMacro.hpp +31 -0
  53. data/ext/cppjieba/src/Limonp/InitOnOff.hpp +21 -0
  54. data/ext/cppjieba/src/Limonp/LocalVector.hpp +171 -0
  55. data/ext/cppjieba/src/Limonp/Logger.hpp +74 -0
  56. data/ext/cppjieba/src/Limonp/Md5.hpp +432 -0
  57. data/ext/cppjieba/src/Limonp/MutexLock.hpp +57 -0
  58. data/ext/cppjieba/src/Limonp/MysqlClient.hpp +125 -0
  59. data/ext/cppjieba/src/Limonp/NonCopyable.hpp +22 -0
  60. data/ext/cppjieba/src/Limonp/StdExtension.hpp +139 -0
  61. data/ext/cppjieba/src/Limonp/StringUtil.hpp +349 -0
  62. data/ext/cppjieba/src/Limonp/Thread.hpp +50 -0
  63. data/ext/cppjieba/src/Limonp/ThreadPool.hpp +105 -0
  64. data/ext/cppjieba/src/MPSegment.hpp +148 -0
  65. data/ext/cppjieba/src/MixSegment.hpp +121 -0
  66. data/ext/cppjieba/src/PosTagger.hpp +109 -0
  67. data/ext/cppjieba/src/QuerySegment.hpp +123 -0
  68. data/ext/cppjieba/src/SegmentBase.hpp +78 -0
  69. data/ext/cppjieba/src/TransCode.hpp +63 -0
  70. data/ext/cppjieba/src/Trie.hpp +298 -0
  71. data/ext/cppjieba/test/CMakeLists.txt +7 -0
  72. data/ext/cppjieba/test/keyword_demo.cpp +16 -0
  73. data/ext/cppjieba/test/load_test.cpp +56 -0
  74. data/ext/cppjieba/test/segment_demo.cpp +59 -0
  75. data/ext/cppjieba/test/servertest/go_load_test.sh +2 -0
  76. data/ext/cppjieba/test/servertest/load_test.py +91 -0
  77. data/ext/cppjieba/test/servertest/run_curl.sh +11 -0
  78. data/ext/cppjieba/test/tagging_demo.cpp +12 -0
  79. data/ext/cppjieba/test/testdata/curl.res +1 -0
  80. data/ext/cppjieba/test/testdata/jieba.dict.0.1.utf8 +93 -0
  81. data/ext/cppjieba/test/testdata/jieba.dict.0.utf8 +93 -0
  82. data/ext/cppjieba/test/testdata/jieba.dict.1.utf8 +67 -0
  83. data/ext/cppjieba/test/testdata/jieba.dict.2.utf8 +64 -0
  84. data/ext/cppjieba/test/testdata/load_test.urls +2 -0
  85. data/ext/cppjieba/test/testdata/review.100 +100 -0
  86. data/ext/cppjieba/test/testdata/review.100.res +200 -0
  87. data/ext/cppjieba/test/testdata/server.conf +13 -0
  88. data/ext/cppjieba/test/testdata/testlines.gbk +9 -0
  89. data/ext/cppjieba/test/testdata/testlines.utf8 +8 -0
  90. data/ext/cppjieba/test/testdata/userdict.utf8 +6 -0
  91. data/ext/cppjieba/test/testdata/weicheng.utf8 +247 -0
  92. data/ext/cppjieba/test/unittest/CMakeLists.txt +28 -0
  93. data/ext/cppjieba/test/unittest/TKeywordExtractor.cpp +18 -0
  94. data/ext/cppjieba/test/unittest/TPosTagger.cpp +43 -0
  95. data/ext/cppjieba/test/unittest/TSegments.cpp +187 -0
  96. data/ext/cppjieba/test/unittest/TTrie.cpp +80 -0
  97. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-death-test.h +283 -0
  98. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-message.h +230 -0
  99. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-param-test.h +1421 -0
  100. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-param-test.h.pump +487 -0
  101. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-printers.h +796 -0
  102. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-spi.h +232 -0
  103. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-test-part.h +176 -0
  104. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest-typed-test.h +259 -0
  105. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest.h +2155 -0
  106. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest_pred_impl.h +358 -0
  107. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/gtest_prod.h +58 -0
  108. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-death-test-internal.h +308 -0
  109. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-filepath.h +210 -0
  110. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-internal.h +1226 -0
  111. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
  112. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-param-util-generated.h +4822 -0
  113. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
  114. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-param-util.h +619 -0
  115. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-port.h +1788 -0
  116. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-string.h +350 -0
  117. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-tuple.h +968 -0
  118. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-tuple.h.pump +336 -0
  119. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-type-util.h +3330 -0
  120. data/ext/cppjieba/test/unittest/gtest-1.6.0/include/gtest/internal/gtest-type-util.h.pump +296 -0
  121. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/.deps/.dirstamp +0 -0
  122. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/.deps/gtest-all.Plo +681 -0
  123. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/.deps/gtest_main.Plo +509 -0
  124. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/.dirstamp +0 -0
  125. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-all.cc +48 -0
  126. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-death-test.cc +1234 -0
  127. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-filepath.cc +380 -0
  128. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-internal-inl.h +1038 -0
  129. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-port.cc +746 -0
  130. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-printers.cc +356 -0
  131. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-test-part.cc +110 -0
  132. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest-typed-test.cc +110 -0
  133. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest.cc +4898 -0
  134. data/ext/cppjieba/test/unittest/gtest-1.6.0/src/gtest_main.cc +39 -0
  135. data/ext/cppjieba/test/unittest/gtest_main.cpp +39 -0
  136. data/ext/jieba/extconf.rb +26 -0
  137. data/ext/jieba/jieba.c +9 -0
  138. data/ext/jieba/jieba.h +9 -0
  139. data/ext/jieba/segment.cc +88 -0
  140. data/ext/jieba/segment.h +17 -0
  141. data/jieba_rb.gemspec +51 -0
  142. data/lib/jieba_rb/version.rb +3 -0
  143. data/lib/jieba_rb.rb +28 -0
  144. data/test/test_segment.rb +32 -0
  145. 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
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ lib/*.bundle
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "ext/cppjieba"]
2
+ path = ext/cppjieba
3
+ url = https://github.com/aszxqw/cppjieba.git
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.2
6
+ before_script: rake compile
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in jieba_rb.gemspec
4
+ gemspec
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,11 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+ require 'rake/extensiontask'
4
+
5
+ Rake::ExtensionTask.new "jieba"
6
+
7
+ Rake::TestTask.new do |t|
8
+ t.libs << 'test'
9
+ end
10
+
11
+ task :default => :test
@@ -0,0 +1,17 @@
1
+ tags
2
+ *.demo
3
+ *swp
4
+ *.out
5
+ *.o
6
+ *.d
7
+ *.ut
8
+ log
9
+ main
10
+ lib*.a
11
+ *_demo
12
+ segdict*
13
+ prior.gbk
14
+ tmp
15
+ t.*
16
+ *.pid
17
+ build
@@ -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)