结巴使用自定义词典

源码下载的地址: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标志,导致第一行的词被误读。

jieba.load_userdict(file_name) # file_name为自定义词典的路径 
词典格式:一个词占一行;每一行分三部分,一部分为词语,一部分为词频,最后为词性(可省略),用空格隔开

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

 ,如下userdict.txt


[python] view plain copy
云计算 5  
李小福 2 nr  
创新办 3 i  
easy_install 3 eng  
好用 300  
韩玉赏鉴 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 

jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数  
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

其他词典:

占用内存较小的词典文件 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')

五 遗留问题

1.  使用 jieba.load_userdict() 自定义词典,每一行为词语、词频、词性。 这里词频在代码里怎么使用,什么变量来表示。词频一般设多大。
---------------------
作者:周雄伟
来源:CSDN
原文:https://blog.csdn.net/ebzxw/article/details/80304761
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-06-19 09:36  交流_QQ_2240410488  阅读(6856)  评论(0编辑  收藏  举报