作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明。谢谢!

0 起因

由于博主之前做了一些文本挖掘的项目,在项目中或多或少的用到了分词模块,对于中文分词,博主一般使用Python开发的jieba分词组件。最近,博主想阅读一些开源系统,就先从jieba开始,一是因为jieba实现了NLP的一些基础技术,例如分词、词性标注;二是因为想学习学习大神们的编码规范。

1 jieba系统简介

"结巴"中文分词:做最好的Python中文分词组件。

特点:

  1. 支持三种分词模式
  2. 支持繁体分词
  3. 支持自定义词典
  4. MIT授权协议

涉及算法:

  1. 基于前缀词典实现词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG),采用动态规划查找最大概率路径,找出基于词频的最大切分组合;
  2. 对于未登录词,采用了基于汉字成词能力的 HMM模型,采用Viterbi算法进行计算;
  3. 基于Viterbi算法的词性标注;
  4. 分别基于tfidf和textrank模型抽取关键词;

2 jieba系统框架

jieba分词系统,主要实现三个模块,

  1. 分词
  2. 词性标注
  3. 关键词抽取

其中,分词有三种模式,默认是精确模式,

  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词;

如下为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分词系统的总体代码量,

G:\zhb7627\Code\Eclipse WorkSpace>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文件),

G:\zhb7627\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目录,主要用于功能测试),

G:\zhb7627\Code\Eclipse WorkSpace>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--关键词抽取

4 Reference

1.对Python中文分词模块结巴分词算法过程的理解和分析

2.jieba中文分词源码分析(一)

3.annotated_jieba

4.隐马尔可夫模型(HMM)攻略

5.HMM相关文章索引

12-16 14:49