中文分词的算法与实现(结巴分词)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdkyxy2013/article/details/84873428

       声明:代码的运行环境为Python3。Python3与Python2在一些细节上会有所不同,希望广大读者注意。本博客以代码为主,代码中会有详细的注释。相关文章将会发布在我的个人博客专栏《Python自然语言处理》,欢迎大家关注。

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

一、分词

from __future__ import unicode_literals
import sys
import jieba
import jieba.posseg
import jieba.analyse

# 分词,可以使用cut()和lcut()两种方法
seg_list = jieba.lcut("我来到北京清华大学", 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))
Full Mode: 我,来到,北京,清华,清华大学,华大,大学
Default Mode: 我,来到,北京,清华大学
他, 来到, 了, 网易, 杭研, 大厦
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造

二、添加词典

# 添加词典
jieba.load_userdict("d:/data/dict.txt")

三、调整词典

# 调整词典
print(','.join(jieba.cut('如果放到post中将出错。', HMM=False)))
jieba.suggest_freq(('中', '将'), True)
print(','.join(jieba.cut('如果放到post中将出错。', HMM=False)))

print(','.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
jieba.suggest_freq('台中', True)
print(','.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
如果,放到,post,中将,出错,。
如果,放到,post,中,将,出错,。
「,台,中,」,正确,应该,不会,被,切开
「,台中,」,正确,应该,不会,被,切开

四、关键词提取

# 关键词提取
s = '''
此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册
资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。
目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。
'''
# tf-idf
for x, w in jieba.analyse.extract_tags(s, topK=20, withWeight=True):  # topK默认提取多少个关键词,withWeight是否返回关键词的权重值
    print('%s %s' % (x, w))

# textrank
for x, w in jieba.analyse.textrank(s, withWeight=True):
    print('%s %s' % (x, w))
欧亚 0.7148056394033334
吉林 0.6453082221991667
置业 0.478531921956875
万元 0.33220407634875
增资 0.3288276861054167
4.3 0.24905765631041665
7000 0.24905765631041665
2013 0.24905765631041665
139.13 0.24905765631041665
实现 0.19486376152458332
综合体 0.19074469840854166
经营范围 0.18985803977479165
亿元 0.18745378397625
在建 0.17176428835750002
全资 0.16822244884583334
百货 0.163858254571875
注册 0.15190267518354167
零售 0.14443267604520835
子公司 0.14291960962
营业 0.13630174790083333

欧亚 1.0
吉林 0.8789102185873989
置业 0.6632552273555545
实现 0.5594840789490926
收入 0.41421237233070557
增资 0.38649739942877126
子公司 0.3369458567319608
城市 0.3336549476141939
商业 0.3321326523190795
在建 0.30622998871047585
零售 0.2909936174579653
百货 0.290324963335001
资本 0.2884140004696881
营业 0.28780582798670107
全资 0.28655198294847095
综合体 0.2804051042482387
开发 0.27110208243505346
业务 0.2685461768277592
有限公司 0.26500710953857665
经营范围 0.25427993286840744

五、词性标注

# 词性标注
words = jieba.posseg.cut("我爱北京天安门")
for word, flag in words:
    print('%s %s' % (word, flag))
我 r
爱 v
北京 ns
天安门 ns

六、Tokenize

# Tokenize
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]))
word 永和		 start: 0 		 end:2
word 服装		 start: 2 		 end:4
word 饰品		 start: 4 		 end:6
word 有限公司		 start: 6 		 end:10

word 永和		 start: 0 		 end:2
word 服装		 start: 2 		 end:4
word 饰品		 start: 4 		 end:6
word 有限		 start: 6 		 end:8
word 公司		 start: 8 		 end:10
word 有限公司		 start: 6 		 end:10

       此外,结巴分词还可以通过调用jieba.analyse.set_idf_path(file_name)和jieba.analyse.set_stop_words(file_name)两个方法来实现设置idf路径和设置停用词的功能。

猜你喜欢

转载自blog.csdn.net/gdkyxy2013/article/details/84873428