作者: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文件),
CodeEclipse 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--关键词抽取