作者:zhbzz2007 出處:http://www.cnblogs.com/zhbzz2007 歡迎轉載,也請保留這段聲明。謝謝!
0 起因
由於博主之前做了一些文本挖掘的項目,在項目中或多或少的用到了分詞模塊,對於中文分詞,博主一般使用Python開發的jieba分詞組件。最近,博主想閱讀一些開源系統,就先從jieba開始,一是因為jieba實現了NLP的一些基礎技術,例如分詞、詞性標注;二是因為想學習學習大神們的編碼規范。
1 jieba系統簡介
"結巴"中文分詞:做最好的Python中文分詞組件。
特點:
- 支持三種分詞模式
- 支持繁體分詞
- 支持自定義詞典
- MIT授權協議
涉及算法:
- 基於前綴詞典實現詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖(DAG),采用動態規划查找最大概率路徑,找出基於詞頻的最大切分組合;
- 對於未登錄詞,采用了基於漢字成詞能力的 HMM模型,采用Viterbi算法進行計算;
- 基於Viterbi算法的詞性標注;
- 分別基於tfidf和textrank模型抽取關鍵詞;
2 jieba系統框架
jieba分詞系統,主要實現三個模塊,
- 分詞
- 詞性標注
- 關鍵詞抽取
其中,分詞有三種模式,默認是精確模式,
- 精確模式,試圖將句子最精確地切開,適合文本分析;
- 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
- 搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜索引擎分詞;
如下為jieba代碼結構及子目錄與相應功能的對應;
.
├── analyse # 短語抽取模塊
│ ├── analyzer.py
│ ├── idf.txt
│ ├── __init__.py
│ ├── textrank.py # TextRank方法
│ └── tfidf.py # TFIDF方法
├── _compat.py
├── dict.txt
├── finalseg # 基於HMM的切分方法
│ ├── __init__.py
│ ├── prob_emit.p
│ ├── prob_emit.py
│ ├── prob_start.p
│ ├── prob_start.py
│ ├── prob_trans.p
│ └── prob_trans.py
├── __init__.py # 基於DAG的切分方法
├── __main__.py
└── posseg # 詞性標注模塊
├── char_state_tab.p
├── char_state_tab.py
├── __init__.py
├── prob_emit.p
├── prob_emit.py
├── prob_start.p
├── prob_start.py
├── prob_trans.p
├── prob_trans.py
└── viterbi.py
jieba分詞系統的總體代碼量,
cloc-1.64.exe jieba
74 text files.
73 unique files.
23 files ignored.
http://cloc.sourceforge.net v 1.64 T=14.27 s (4.1 files/s, 64392.8 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Pascal 7 0 0 723708
Python 52 475 147 194347
-------------------------------------------------------------------------------
SUM: 59 475 147 918055
-------------------------------------------------------------------------------
jieba分詞系統的代碼量(去除finalseg和posseg目錄下存儲數據的py文件),
Code\Eclipse WorkSpace>cloc-1.64.exe jieba
59 text files.
58 unique files.
22 files ignored.
http://cloc.sourceforge.net v 1.64 T=0.09 s (508.9 files/s, 41989.4 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Python 45 472 147 3094
-------------------------------------------------------------------------------
SUM: 45 472 147 3094
-------------------------------------------------------------------------------
jieba分詞系統去除的代碼量(去除test目錄,主要用於功能測試),
cloc-1.64.exe jieba
22 text files.
21 unique files.
17 files ignored.
http://cloc.sourceforge.net v 1.64 T=0.04 s (295.7 files/s, 40211.7 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Python 11 237 115 1144
-------------------------------------------------------------------------------
SUM: 11 237 115 1144
-------------------------------------------------------------------------------
最終,實現基本功能的代碼量在一千行左右,這個代碼量非常適合初讀開源系統源碼的開發者,另外也說明jieba分詞系統的作者寫的代碼非常簡潔。
3 jieba分詞源碼閱讀系列
jieba分詞源碼閱讀系列的相關鏈接如下所示,
1.jieba分詞系統整體介紹,結巴分詞1--結巴分詞系統介紹
2.jieba分詞系統中基於前綴詞典構建有向無環圖,然后利用動態規划求解最大概率路徑,實現分詞,結巴分詞2--基於前綴詞典及動態規划實現分詞
3.jieba分詞系統中基於HMM模型對未登錄詞進行分詞,結巴分詞3--基於漢字成詞能力的HMM模型識別未登錄詞
4.jieba分詞系統中基於有向無環圖及HMM模型實現詞性標注,結巴分詞4--詞性標注
5.jieba分詞系統中基於TF-IDF和TextRank算法實現關鍵詞抽取,結巴分詞5--關鍵詞抽取
