python中使用jieba进行中文分词

源码下载的地址:https://github.com/fxsjy/jieba

演示地址:http://jiebademo.ap01.aws.af.cm/

 一   “结巴”中文分词:做最好的 Python 中文分词组件  。

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

 二    Jieba中文分词组件,可用于中文句子/词性分割、词性标注、未登录词识别,支持用户词典等功能。该组件的分词精度达到了97%以上。下载介绍在Python里安装Jieba。 

1. 安装方式一: 

   1)下载Jieba  。官网地址:http://pypi.python.org/pypi/jieba/   并解压。

   2)安装      D:\>cd D:\Download\jieba-0.39

D:\Download\jieba-0.39>python setup.py install

2. 安装方式二:

三 原理及算法

1)基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG) 
2)采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合 

3)对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法

4)从源代码的角度分为三部分对jieba中文分词进行分析,

第一部分 Jieba分词的初始化,包括核心词典和用户词典的加载,这一部分涉及最基础的数据结构,有:

trie又称前缀树或字典树,jieba中的具体实现是一个嵌套的dict,它用于存储词典;

  FREQ在jieba中的具体实现是一个dict,它存储词和词频的对应关系;

  min_freq存储最小的词频;

  total存储所有词的词频的总和。

第二部分 DAG和动态规划算法

第三部分 介绍 jieba 中文分词组件中的HMM模型和Viterbi算法应用

四 实践例子

1. example 1:分词

#encoding=utf-8
import jieba

seg_list = jieba.cut("伟大的北京天安门",cut_all=True)
print("Full Mode:", "/ ".join(seg_list)  )    #全模式

seg_list = jieba.cut("伟大的北京天安门",cut_all=False)
print("Default Mode:", "/ ".join(seg_list)  ) #精确模式

seg_list = jieba.cut("这里是伟大的北京天安门")    #默认是精确模式
print(", ".join(seg_list)  )

seg_list = jieba.cut_for_search("这里是伟大的北京天安门,伟大的中华人民共和国!") #搜索引擎模式
print(", ".join(seg_list) )

 jieba.cut方法接受两个输入参数: 1) 第一个参数为需要分词的字符串 2)cut_all参数用来控制是否采用全模式 
    jieba.cut_for_search方法接受一个参数:需要分词的字符串,该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细 
   注意:待分词的字符串可以是gbk字符串、utf-8字符串或者unicode 

    jieba.cut以及jieba.cut_for_search返回的结构都是一个可迭代的generator,可以用list(jieba.cut(...))转化为list ,

可以使用for循环来获得分词后得到的每一个词语(unicode)。


2. example 2:使用字定义词典

可以指定自己自定义的词典,以便包含jieba词库里没有的词。

虽然jieba有新词识别能力,但是自行添加新词可以保证更高的正确率 。

注意: 自定义词典不要用Windows记事本保存,这样会加入BOM标志,导致第一行的词被误读。

  1. jieba.load_userdict(file_name) # file_name为自定义词典的路径 

词典格式:一个词占一行;每一行分三部分,一部分为词语,一部分为词频,最后为词性(可省略),用空格隔开

验证下来,这里词典里面的词频主要是是为解决歧义而设置的,用于计算成词的组合概率

 ,如下userdict.txt


[python]  view plain  copy
  1. 云计算 5  
  2. 李小福 2 nr  
  3. 创新办 3 i  
  4. easy_install 3 eng  
  5. 好用 300  
  6. 韩玉赏鉴 3 nz  

具体代码:

#encoding=utf-8  
import sys  
sys.path.append("../")  
import jieba   
import jieba.posseg as pseg  
  
test_sent = "李小福是创新办主任也是云计算方面的专家;"  
test_sent += "例如我输入一个带“韩玉赏鉴”的标题,在自定义词库中也增加了此词为N类型,python 的正则表达式是好用的"  
print("\n====下面结果未自定义词典====")
words = jieba.cut(test_sent) 
print("Result words:", "/ ".join(words)  )    
print("\n====下面是自定义userdict分词====")
jieba.load_userdict("userdict.txt")
words = jieba.cut(test_sent) 
print("Result words:", "/ ".join(words)  )    

输出结果如下,可以看到使用自定义字典的前后差异:


这方面的参考有: "通过用户自定义词典来增强歧义纠错能力" --- https://github.com/fxsjy/jieba/issues/14

3. 词性标注

标注句子分词后每个词的词性,采用和ictclas兼容的标记法

ICTCLAS 汉语词性标注集   详细参考     https://blog.csdn.net/ebzxw/article/details/80306463

用法示例:

import jieba.posseg as pseg  
test_sent = "李小福是创新办主任也是云计算方面的专家;"  
test_sent += "例如我输入一个带“韩玉赏鉴”的标题,在自定义词库中也增加了此词为N类型,python 的正则表达式是好用的"  
result = pseg.cut(test_sent)  
for w in result:  
    print(w.word, "/", w.flag, ", ",)  
print("\n========")    

4. 关键词提取

  核心调用方法:jieba.analyse.extract_tags(sentence,topK)  #需要先import jieba.analyse 

sentence为待提取的文本 , topK为返回几个TF/IDF权重最大的关键词,默认值为20 

  用法代码示例:
#encoding=utf-8  
import sys  
sys.path.append('../')  
import jieba  
import jieba.analyse  
from optparse import OptionParser  
USAGE = "usage: python extract_tags.py [file name] -k [top k]"  
parser = OptionParser(USAGE)  
parser.add_option("-k", dest="topK")  
opt, args = parser.parse_args()  
#'''
if len(args) < 1:  
    print(USAGE)  
    sys.exit(1)  
#'''   
file_name = args[0]
#file_name=u"story.txt"  
if opt.topK is None:  
    topK = 10  
else:  
    topK = int(opt.topK)   
content = open(file_name, 'rb').read()  
tags = jieba.analyse.extract_tags(content, topK=topK)  
print(",".join(tags) )

5. 并行分词

原理:将目标文本按行分隔后,把各行文本分配到多个python进程并行分词,然后归并结果,从而获得分词速度的可观提升 

基于python自带的multiprocessing模块,目前暂不支持windows 

  1. jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数  
  2. jieba.disable_parallel() # 关闭并行分词模式 

实验结果:在4核3.4GHz Linux机器上,对金庸全集进行精确分词,获得了1MB/s的速度,是单进程版的3.3倍。

import urllib2  
import sys,time  
import sys  
sys.path.append("../../")  
import jieba  
jieba.enable_parallel(4)  
  
url = sys.argv[1]  
content = open(url,"rb").read()  
t1 = time.time()  
words = list(jieba.cut(content))  
  
t2 = time.time()  
tm_cost = t2-t1  
  
log_f = open("1.log","wb")  
for w in words:  
print >> log_f, w.encode("utf-8"), "/" ,  
  
print 'speed' , len(content)/tm_cost, " bytes/second" 

6.  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]) 

#搜索模式
result = jieba.tokenize(u'永和服装饰品有限公司',mode='search')
for tk in result:
    print "word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]) 

7. ChineseAnalyzer for Whoosh搜索引擎

引用: from jieba.analyse import ChineseAnalyzer
用法示例:https://github.com/fxsjy/jieba/blob/master/test/test_whoosh.py

8. 命令行分词

使用示例:python -m jieba news.txt > cut_result.txt

命令行选项(翻译):

使用: python -m jieba [options] filename

结巴命令行界面。

固定参数:
  filename              输入文件

可选参数:
  -h, --help            显示此帮助信息并退出
  -d [DELIM], --delimiter [DELIM]
                        使用 DELIM 分隔词语,而不是用默认的' / '。
                        若不指定 DELIM,则使用一个空格分隔。
  -p [DELIM], --pos [DELIM]
                        启用词性标注;如果指定 DELIM,词语和词性之间
                        用它分隔,否则用 _ 分隔
  -D DICT, --dict DICT  使用 DICT 代替默认词典
  -u USER_DICT, --user-dict USER_DICT
                        使用 USER_DICT 作为附加词典,与默认词典或自定义词典配合使用
  -a, --cut-all         全模式分词(不支持词性标注)
  -n, --no-hmm          不使用隐含马尔可夫模型
  -q, --quiet           不输出载入信息到 STDERR
  -V, --version         显示版本信息并退出

如果没有指定文件名,则使用标准输入。

--help 选项输出:

$> python -m jieba --help
Jieba command line interface.

positional arguments:
  filename              input file

optional arguments:
  -h, --help            show this help message and exit
  -d [DELIM], --delimiter [DELIM]
                        use DELIM instead of ' / ' for word delimiter; or a
                        space if it is used without DELIM
  -p [DELIM], --pos [DELIM]
                        enable POS tagging; if DELIM is specified, use DELIM
                        instead of '_' for POS delimiter
  -D DICT, --dict DICT  use DICT as dictionary
  -u USER_DICT, --user-dict USER_DICT
                        use USER_DICT together with the default dictionary or
                        DICT (if specified)
  -a, --cut-all         full pattern cutting (ignored with POS tagging)
  -n, --no-hmm          don't use the Hidden Markov Model
  -q, --quiet           don't print loading messages to stderr
  -V, --version         show program's version number and exit

If no filename specified, use STDIN instead.

9.延迟加载机制

jieba 采用延迟加载,import jieba 和 jieba.Tokenizer() 不会立即触发词典的加载,一旦有必要才开始加载词典构建前缀字典。如果你想手工初始 jieba,也可以手动初始化。

import jieba
jieba.initialize()  # 手动初始化(可选)

在 0.28 之前的版本是不能指定主词典的路径的,有了延迟加载机制后,你可以改变主词典的路径:

jieba.set_dictionary('data/dict.txt.big')

例子: https://github.com/fxsjy/jieba/blob/master/test/test_change_dictpath.py

其他词典:

  1. 占用内存较小的词典文件 https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small

  2. 支持繁体分词更好的词典文件 https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big

下载你所需要的词典,然后覆盖 jieba/dict.txt 即可;或者用 jieba.set_dictionary('data/dict.txt.big')

五 遗留问题

1.  使用 jieba.load_userdict() 自定义词典,每一行为词语、词频、词性。 这里词频在代码里怎么使用,什么变量来表示。词频一般设多大。


  • 17
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值