天天看点

文本分析--jieba中文分词

分词技术可以分为英文分词和中文分词:

      对于英文分词而言,由于英文单词之间以空格来分隔,所以在进行英文分词的过程中,只需要针对空格进行划分就可以了。

      对于中文分词而言,中文单词之间没有英文单词天然的空格来划分,所以就需要对中文进行处理;主要有三种方式:一个是基于字典匹配的分词方法,一个是基于语义分析的分词算法,还有一个是基于概率统计模型的分词方法。

以下介绍的是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中的单字全部去掉,或者将其词频设置非常小。

继续阅读