Skip to content

Instantly share code, notes, and snippets.

@miminus
Created July 21, 2016 12:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save miminus/99e92f815c49163f77de6cb9d9916ec9 to your computer and use it in GitHub Desktop.
Save miminus/99e92f815c49163f77de6cb9d9916ec9 to your computer and use it in GitHub Desktop.
基于Python的分词工具
###<font color=red>Jieba</font>
___
####Features
######1.三种分词模式
>
* 精确模式:试图将句子最精确地切开,适合文本分析;
* 全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
* 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
######2.支持繁体分词
######3.支持自定义词典
######4.MIT 授权协议
___
####算法
* 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
* 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
* 对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法
___
####添加自定义词典
* 虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率
* 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
* 词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码
* 词频省略时使用自动计算的能保证分出该词的词频。
* Example:
```
创新办 3 i
云计算 5
凱特琳 nz
台中
```
* 使用实例:
* [自定义词典](https://github.com/fxsjy/jieba/blob/master/test/userdict.txt)
* [用法示例](https://github.com/fxsjy/jieba/blob/master/test/test_userdict.py)
* 调整词典
* 使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
* 使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
* 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
* ["通过用户自定义词典来增强歧义纠错能力"](https://github.com/fxsjy/jieba/issues/14)
___
####关键词抽取
* 基于 TF-IDF 算法的关键词抽取
* 基于 TextRank 算法的关键词抽取
___
####词性标注
* jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
* 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
___
####并行分词
* **原理** : 将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升
* 基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows
* **用法** :
* ```jieba.enable_parallel(4)``` # 开启并行分词模式,参数为并行进程数
* ```jieba.disable_parallel()``` # 关闭并行分词模式
* [示例](https://github.com/fxsjy/jieba/blob/master/test/parallel/test_file.py)
* **注意**:并行分词仅支持默认分词器 jieba.dt 和 jieba.posseg.dt。
___
####Tokenize:返回词语在原文的起止位置
* 注意,输入参数只接受 unicode
```
result = jieba.tokenize(u'永和服装饰品有限公司')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
```
```
word 永和 start: 0 end:2
word 服装 start: 2 end:4
word 饰品 start: 4 end:6
word 有限公司 start: 6 end:10
```
___
####其他词典
* [占用内存较小的词典文件](https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small)
* [支持繁体分词更好的词典文件](https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big)
* 下载你所需要的词典,然后覆盖 jieba/dict.txt 即可;或者用 ```jieba.set_dictionary('data/dict.txt.big')```
___
####分词内部原理
[分词原理](http://book.51cto.com/art/201106/269032.htm)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment