分词技术可以分为英文分词和中文分词:
对于英文分词而言,由于英文单词之间以空格来分隔,所以在进行英文分词的过程中,只需要针对空格进行划分就可以了。
对于中文分词而言,中文单词之间没有英文单词天然的空格来划分,所以就需要对中文进行处理;主要有三种方式:一个是基于字典匹配的分词方法,一个是基于语义分析的分词算法,还有一个是基于概率统计模型的分词方法。
以下介绍的是python中文分词jieba分词
首先是jieba分词语法:
# -*--coding:utf-8*-
import jieba
import jieba.analyse
stopwords = {}.fromkeys([line.rstrip() for line in open('stopkey_zh.txt')])
"""
jieba 中文分词:
支持三种分词模式:
精确模式:将句子最精确的分开,适合文本分析
全模式:把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义
搜索引擎模式:在精确搜索的基础上,对长词进行再次切分,提高召回率,适合用于搜索引擎分词
支持繁体分词:
支持自定义词典:
MIT授权协议
算法:
基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)
采用了动态规划查找最大概率路径,找出基于词频的最大切分组合
对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法
主要功能:
1、分词
jieba.cut():三个参数,分词的字符串;cut_all用来控制是否采用全模式;HMM控制是否使用HMM模型
jieba.cut_for_search():两个参数,分词的字符串;是否使用HMM模型;
上述两个分词方法都可以使用for循环来获取分词后的每个词语。
jieba.lcut():直接返回list
jieba.lcut_for_search():直接返回list
jieba.Tokenizer(dictionary=DEFAULT_DICT):新建自定义分词器
2、添加自定义词典
jieba.load_userdict(file_name):file_name若为打开的文件,文件必须为UTF8格式的
词典格式与dict.txt一样,一个词占一行,每一行分三部分:词语、词频、词性,用空格隔开
jieba.add_word():动态增加词典
jieba.del_word():动态删除词典
jieba.suggeat_freq(segment, tune=True) 调节单个词语的词频,True使其能够分出来, False使其不能分出来
注意jieba默认的dict中的词语,要结合默认dict进行中文分词
3、关键词提取
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=()):
sentence:待提取的文本
topK:返回几个TF-IDF权重最大的关键词,默认值为20
withWeight:是否一并返回关键词权重值,默认值为False
allowPOS:仅包括指定词性的词,默认值为空
jieba.analyse.TFIDF(idf_path=None):
jieba.analyse.set_idf_path(file_name):
jieba.analyse.set_stop_words(file_name):
jieba.analyse.textrank(sentence, topK=20,withWeight=False,allowPOS=()):
jieba.analyse.TextRank():
4、词性标注
jieba.posseg.POSTokenizer(tokenizer=None):
5、并行分词
jieba.enable_parallel(4):开启并行模式
jieba.disable_parallel():关闭并行模式
注意:并行分词不能在windows下运行
6、Tokenize:返回词语在原文的起止位置
jieba.tokenize():
7、ChineseAnalyzer for Whoosh 搜索引擎
8、命令行分词
"""
# 0、读取文本
f = open('sentences.txt')
s = f.read()
print s
print type(s)
print '----------------------------------------------'
final = ''
for st in s:
# st = st.encode('utf8')
if st not in stopwords:
final += st
final += ' '
print final
print type(final)
print '----------------------------------------------'
# 1、分词
seg_list = jieba.cut(s, cut_all=True) # 全模式
print '[01 Full Model]:' + '/'.join(seg_list)
print '--------------'
seg_list = jieba.cut(s, cut_all=False) # 精确模式
print '[02 Accuracy Model:]:' + '/'.join(seg_list)
print '--------------'
seg_list = jieba.cut(s, cut_all=False, HMM=True) # 精确模式,HMM模型
print '[03 Accuracy Model:]:' + '/'.join(seg_list)
print '--------------'
seg_list = jieba.cut(s) # 默认为精确模式
print '[04 Accuracy Model in Default:]:' + '/'.join(seg_list)
print '--------------'
seg_list = jieba.cut_for_search(s) # 搜索引擎模式
print '[05 Search Engine Model:]:' + '/'.join(seg_list)
print '-----------------------------------------------'
# 2、添加自定义词典
jieba.load_userdict('userdict.txt')
jieba.add_word('两国元首') # 添加词典
jieba.del_word('两国元首') # 删除词典
jieba.suggest_freq(('日', '电'), True)
jieba.suggest_freq('日电', False)
words = jieba.cut(s) # 默认方式
print '/'.join(words)
print '-----------------------------------------------'
# 3、关键词提取
# 基于TF-IDF算法的关键词提取
import jieba
import jieba.analyse
# # 关键词提取
tags = jieba.analyse.extract_tags(s, topK=10) # 提取关键词最高的10个词
print ','.join(tags)
print '--------------'
# # 自定义逆向文件频率(IDF)语料库
jieba.analyse.set_idf_path('../extra_dict/idf.txt.big')
tags = jieba.analyse.extract_tags(s, topK=10)
print ','.join(tags)
print '--------------'
# # 自定义停用词(Stop words)文本语料库
jieba.analyse.set_idf_path("../extra_dict/idf.txt.big")
tags = jieba.analyse.extract_tags(s, topK=10)
print ",".join(tags)
print '--------------'
# # 返回关键词权重值
tags = jieba.analyse.extract_tags(s, topK=15, withWeight=True)
for tag in tags:
print 'tag:%s\t\t weight:%f' % (tag[0], tag[1]) # 输出关键词及其权重
print '--------------'
# 基于TextRank算法的关键词抽取
# 基本思想:
# 将待抽取关键词的文本进行分词
# 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
# 计算图中节点的PageRank,注意是无向带权图
tags = jieba.analyse.textrank(s, topK=10)
print ','.join(tags)
print '-----------------------------------------------'
# 4、词性标注
import jieba.posseg as pseg
words = pseg.cut('我爱北京天安门')
for word, flag in words:
print '%s %s' % (word, flag)
print '-----------------------------------------------'
print '-----------------------------------------------'
# 5、并行分词
# file = open('QinCountry.txt') # 大秦帝国六部全集
# ss = file.read()
# print ss
# import time
# jieba.enable_parallel() # windows下不能并行处理
# t1 = time.time()
# seg_list = jieba.cut(ss)
# words = '/'.join(seg_list)
# t2 = time.time()
# cost = t2-t1
# print 'Cost Time:%s' % cost # Cost Time:61.7459998131
print '----------------------------------------------'
# 6、Tokenize 返回词语在原文的起止位置,输入参数只接受unicode
result = jieba.tokenize(s.decode('utf8'))
for t in result:
print 'word:%s\t\tstart:%s\t\tend:%s' % (t[0], t[1], t[2])
print '----------------------------------------------'
# 7、ChineseAnalyzer for Whoosh 搜索引擎
# import jieba
# from jieba.analyse import ChineseAnalyzer
#
# analyser = ChineseAnalyzer()
# for t in analyzer("我的好朋友是李明;我爱北京天安门;IBM和Microsoft; I have a dream. this is intetesting and interested me a lot"):
# print t.text
注意:
jieba分词器在处理中文分词中是非常好的,但是,jieba分词器默认的分词语料库dict.txt确存在问题:
dict.txt中存在许多单字,例如:“大”,“午”,“我”,而且给予单字的词频特别高,都具有万以上的词频数,我们都知道词频与权重是成正比的,那么在分词的过程中就会优先处理这些单词,而与其相关的词语就会被忽略,这就导致分词结果不准确的问题。
为了更好的使用jieba分词,建议将dict.txt中的单字全部去掉,或者将其词频设置非常小。