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.
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)