关键词:windows平台下jieba安装、三种模式比较、自定义词典、停用词语料、词频统计、词云生成
jieba简介
Jieba是一个中文分词组件,可用于中文句子/词性分割、词性标注、未登录词识别,支持用户词典等功能。能较好实现中文分词,同时支持繁体分词。
windows平台上安装jieba组件
- 下载Jieba
官网地址:http://pypi.python.org/pypi/jieba/ -
将其解压到自定义路径,如图所示:
- 使用Doc命令进入jieba所在的文件目录
- 键入命令:
python setup.py install
此时jieba组件已将安装完成了
三种分词模式及比较
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义,存在过度切分的问题;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
代码示例:
from os_file import Readfile
import jieba```
```text = "他是一名本科生,也是信息管理与信息系统的一个学生")```
```seg_list = jieba.cut(text, cut_all = True)
print( "Full Mode:\n" + '/' .join(seg_list)) #全模式```
```seg_list = jieba.cut(text, cut_all = False)
print('Default Mode:\n' + '/' .join(seg_list)) #精确模式```
```seg_list = jieba.cut_for_search(text) #搜索引擎模式
print('Research Mode:\n' + '/'.join(seg_list))```
结果页:
```Full Mode:
他/是/一名/本科/本科生/也/是/信息/信息管理/管理/与/信息/信息系统/系统/的/一个/学生
Default Mode:
他/是/一名/本科生/也/是/信息管理/与/信息系统/的/一个/学生
Research Mode:
他/是/一名/本科/本科生/也/是/信息/管理/信息管理/与/信息/系统/信息系统/的/一个/学生```
粗略的看法:正则分区中英文,根据tire树使用有向无环图得到所有分词,通过动态规划得出最优解,使用HMM解析未登录新词(形成估计链最大概率的估计值)
**原理**:
* [jieba 源码解析][1]
[1]:http://midday.me/article/003023dc3f814bc493b37c50b2a9ee71
* [一文搞懂HMM(隐马尔可夫模型)][2]
[2]:http://www.niubua.com/2015/07/16/%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82hmm%EF%BC%88%E9%9A%90%E9%A9%AC%E5%B0%94%E5%8F%AF%E5%A4%AB%E6%A8%A1%E5%9E%8B%EF%BC%89/
***************
#### 两种方式修改分词方式
* 在线更改词语词频以达到词语切分的目的
代码示例:
```# -*- coding: utf-8 -*-```
```from __future__ import print_function, unicode_literals
import jieba```
```test = "吴国忠臣伍子胥"
print("/".join(jieba.cut(test)))
print(jieba.get_FREQ("吴国忠"))
print(jieba.get_FREQ("臣"))
print(jieba.get_FREQ("吴国"))
print(jieba.get_FREQ("忠臣"))
jieba.add_word('忠臣',456) #更改忠臣词频为456
print("/".join(jieba.cut(test)))```
结果页:
```C:\Python27\python.exe C:/Users/Administrator/Desktop/change_freq.py
Building prefix dict from the default dictionary ...
Loading model from cache c:\users\admini~1\appdata\local\temp\jieba.cache
Loading model cost 1.015 seconds.
Prefix dict has been built succesfully.
吴国忠/臣/伍子胥
14
5666
174
316
吴国/忠臣/伍子胥```
```Process finished with exit code 0```
上面可以看出,在未更改词频前,分词结果```吴国忠/臣/伍子胥```是不正确的,但为什么得到的是这样的结果呢?这里我们通过.get_FREQ(str)函数获取各个词语的词频,这里存在**「P(吴国忠) 乘P(臣) > P(吴国) 乘P(忠臣)」(14乘5666>174乘316)的情形,所以默认选择第一种分词形式,那么要改变这种情况就必须使后者大于前者,这里我们调整“忠臣”一词的词频,即改数大于14乘5666除以174。**
当然,这种写法仅仅对当前文件有效。
* 自定义词库达到更改默认分词的目的
代码示例:
```# -*- coding: utf-8 -*-
import jieba
test = "江州市长江大桥参加了长江大桥的通车仪式"
test = "/".join(jieba.cut(test))
print(test)```
结果页:
江州/市/长江大桥/参加/了/长江大桥/的/通车/仪式
加入字典后:
```# -*- coding: utf-8 -*-
import jieba
jieba.load_userdict('./self_dict.txt')
test = "江州市长江大桥参加了长江大桥的通车仪式"
test = "/".join(jieba.cut(test, HMM = False))
print(test)```
结果页:
江州/市长/江大桥/参加/了/长江大桥/的/通车/仪式
这里我们在**同一目录下自定义字典self_dict.txt,采用词语+词频的方式,对你想要划分的词赋较大的值,同时使用.load_userdict()函数实现对定义的词库进行载入**。
![自定义字典图示](http://upload-images.jianshu.io/upload_images/5871947-8dbe99bd0887f4d7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
************
#### 词频统计与关键词提取
因为之后代码涉及对文件的读操作,这里先建立文件读取类:
代码示例:
```# -*- coding: utf-8 -*-
import os
class Readfile:
def __init__(self, filename):
self.filename = filename
def get_text_file(self, filename):
if not os.path.exists(filename):
print("ERROR: file not exit: %s" % (filename))
return None
if not os.path.isfile(filename):
print("ERROR: %s not a filename." % (filename))
return None
f = open(filename, 'r')
content = f.read()
f.close()
return content```
关键词提取与词频:
代码示例:
```# -*- coding: utf-8 -*-
from jieba import analyse #导入统计分析必要的包
from os_file import Readfile #导入对文件操作的类
emp1 = Readfile("./word.txt") #类的实例化
text = emp1.get_text_file("./word.txt")
findWord = analyse.extract_tags(text, topK=5, withWeight=True) #topK定义权重前5,默认值为20
for wd, weight in findWord: #分别为关键词,权重
print int(weight*10),wd #int(weight*10)使生成的数为整数,根据你的词总数可作调整```
word.txt内容:
![word.txt内容图示](http://upload-images.jianshu.io/upload_images/5871947-ee55d10a5653be99.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
结果页:
12 隔壁家
10 红太狼
9 雷锋
8 勤劳
7 朴实
>关键词说明:用统计学语言表达,就是在词频的基础上,要对每个词分配一个"重要性"权重。最常见的词("的"、"是"、"在")给予最小的权重,较常见的词("中国")给予较小的权重,较少见的词("蜜蜂"、"养殖")给予较大的权重。这个权重叫做"逆文档频率"(Inverse Document Frequency,缩写为IDF),它的大小与一个词的常见程度成反比。
知道了"词频"(TF)和"逆文档频率"(IDF)以后,将这两个值相乘,就得到了一个词的TF-IDF值。某个词对文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的几个词,就是这篇文章的关键词。
**原理**:
* [TF-IDF与余弦相似性的应用(一):自动提取关键词][3]
[3]:http://www.ruanyifeng.com/blog/2013/03/tf-idf.html
****************
#### 定义停用词典
定义停用词原因
代码示例:
```# -*- coding: utf-8 -*-
from jieba import analyse
from os_file import Readfile
analyse.set_stop_words("stop_words.txt") #载入停用词表(上例加入该句)
emp1 = Readfile("./word.txt")
text = emp1.get_text_file("./word.txt")
findWord = analyse.extract_tags(text, topK=10, withWeight=True)
for wd, weight in findWord:
print int(weight*10),wd```
stop_words.txt内容:(注意必须从第二行开始)
![stop_words.txt内容图示](http://upload-images.jianshu.io/upload_images/5871947-fa9fda83d8e7c3de.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
结果页:
13 隔壁家
11 红太狼
8 勤劳
8 朴实
8 善良
******************
#### 对分词进行综合运用(以《红楼梦》为例)
准备阶段:
* 准备《红楼梦》原文txt格式小说
* 准备较齐全的中文停用词词库
* 准备《红楼梦》语意库,推荐搜狗的《红楼梦》专用语句块,这里涉及文件转码,请自行百度,同时词频不宜过高,因为类似句组成词本身词频也不高。
代码示例:
```# -*- coding: utf-8 -*-
from os_file import Readfile
import jieba
import codecs
from jieba import analyse
analyse.set_stop_words("stop_words.data")
jieba.load_userdict('./hlmck.txt')
emp1 = Readfile("./hlm.txt")
text = emp1.get_text_file("./hlm.txt")
seg_list = jieba.cut(text, cut_all = False)
sentence = '/' .join(seg_list)
print('Default Mode:\n' + sentence) #精确模式
f = codecs.open('./4.txt','w','utf-8') #将结果写入文件
f.write(sentence)
f.close()
findWord = analyse.extract_tags(text, topK=200, withWeight=True)#生成前200的关键字与词频
for wd, weight in findWord:
print int(weight*1000),wd```
关键词部分结果:
145 宝玉
57 凤姐
56 贾母
55 黛玉
50 袭人
41 王夫人
38 老太太
35 宝钗
33 太太
32 贾琏
31 姑娘
31 奶奶
28 平儿
28 众人
27 说道
24 李纨
23 丫头
22 贾政
22 自然
21 紫鹃
20 薛姨妈
20 探春
这里我们发现依旧有一些量词,连词,需要你自己对停用词字典再调整,逐步完善。
生成词云:
* 这里借助https://timdream.org/wordcloud2.js/# 在线词云生成工具(注意调节你的词频大小)
![词云图示](http://upload-images.jianshu.io/upload_images/5871947-3d06cea669baaca2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
________
#### 超级注意事项
* 因为涉及到文件的读写,总会碰到中文编码乱码问题,这里我们使用EditPlus编辑器对所有要进行操作的txt文件统一更改为UTF-8格式,去除windows生成记事本时的[BOM][4]头文件,这里可以少走很多弯路。
[4]:http://baike.baidu.com/item/BOM/2790364
![image.png](http://upload-images.jianshu.io/upload_images/5871947-daece5fbda300eff.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)