結巴分詞 java 高性能實現,是 huaban jieba 速度的 2倍

Segment

Segment 是基於結巴分詞詞庫實現的更加靈活,高性能的 java 分詞實現。java

變動日誌

創做目的

分詞是作 NLP 相關工做,很是基礎的一項功能。git

jieba-analysis 做爲一款很是受歡迎的分詞實現,我的實現的 opencc4j 以前一直使用其做爲分詞。github

可是隨着對分詞的瞭解,發現結巴分詞對於一些配置上不夠靈活。算法

有不少功能沒法指定關閉,好比 HMM 對於繁簡體轉換是無用的,由於繁體詞是固定的,不須要預測。框架

最新版本的詞性等功能好像也被移除了,可是這些都是我的很是須要的。maven

因此本身從新實現了一遍,但願實現一套更加靈活,更多特性的分詞框架。性能

並且 jieba-analysis 的更新彷佛停滯了,我的的實現方式差別較大,因此創建了全新的項目。學習

Features 特色

  • 基於 DFA 實現的高性能分詞
  • 容許用戶自定義詞庫
  • 支持返回詞性

默認關閉,惰性加載,不對性能和內存有影響。測試

快速入門

準備

jdk1.7+編碼

maven 3.x+

maven 引入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>segment</artifactId>
    <version>${最新版本}</version>
</dependency>

使用示例

相關代碼參見 SegmentBsTest.java

獲取分詞,下標等信息

暫時沒有實現詞性標註,準備下個版本實現。

final String string = "這是一個伸手不見五指的黑夜。我叫孫悟空,我愛北京,我愛學習。";

List<ISegmentResult> resultList = SegmentBs.newInstance().segment(string);
Assert.assertEquals("[這[0,1), 是[1,2), 一個[2,4), 伸手不見五指[4,10), 的[10,11), 黑夜[11,13), 。[13,14), 我[14,15), 叫[15,16), 孫悟空[16,19), ,[19,20), 我[20,21), 愛[21,22), 北京[22,24), ,[24,25), 我[25,26), 愛[26,27), 學習[27,29), 。[29,30)]", resultList.toString());

只獲取分詞信息

final String string = "這是一個伸手不見五指的黑夜。我叫孫悟空,我愛北京,我愛學習。";

List<String> resultList = SegmentBs.newInstance().segmentWords(string);
Assert.assertEquals("[這, 是, 一個, 伸手不見五指, 的, 黑夜, 。, 我, 叫, 孫悟空, ,, 我, 愛, 北京, ,, 我, 愛, 學習, 。]", resultList.toString());

返回詞性

使用示例

直接指定 wordType 屬性爲真便可。

final String string = "我愛學習";

List<ISegmentResult> resultList = SegmentBs
                .newInstance()
                .wordType(true)
                .segment(string);

Assert.assertEquals("[我[0,1)/r, 愛[1,2)/v, 學習[2,4)/v]", resultList.toString());

詞性說明

r/v 就是詞性,每個表明的含義詳情以下。

編碼 描述
Ag 形語素
a 形容詞
ad 副形詞
an 名形詞
b 區別詞
c 連詞
dg 副語素
d 副詞
e 嘆詞
f 方位詞
g 語素
h 前接成分
i 成語
j 簡稱略語
k 後接成分
l 習用語
m 數詞
Ng 名語素
n 名詞
nr 人名
ns 地名
nt 機構團體
nz 其餘專名
o 擬聲詞
p 介詞
q 量詞
r 代詞
s 處所詞
tg 時語素
t 時間詞
u 助詞
vg 動語素
v 動詞
vd 副動詞
vn 名動詞
w 標點符號
x 非語素字
y 語氣詞
z 狀態詞
un 未知詞

能夠參見對應的枚舉類 WordTypeEnum

Benchmark 性能對比

性能對比

性能對比基於 jieba 1.0.2 版本,測試條件保持一致,保證兩者都作好預熱,而後統一處理。

驗證下來,分詞的性能是 jieba 的兩倍左右

緣由也很簡單,暫時沒有引入詞頻和 HMM。

代碼參見 BenchmarkTest.java

性能對比圖

相同長文本,循環 1W 次。

benchmark.png

後期 Road-Map

核心特性

  • 基於詞頻修正
  • HMM 算法實現新詞預測
  • 常見的分詞模式
  • 停頓詞/人名/地名/機構名/數字... 各類常見的詞性標註

格式處理

  • 全角半角處理
  • 繁簡體處理

創做感謝

感謝 jieba 分詞提供的詞庫,以及 jieba-analysis 的相關實現。

相關文章
相關標籤/搜索