NLP:jieba中文分词

1,314

本文要点

jieba扩展包有3种分词的算法:
1/普通分词
    缺点:
        需要手工过滤停用词、无意义词、电话号码、符号等。
        也就是说我们需要定义一个停用词列表,然后对切分出来的词进行遍历,
        如果命中了停用词列表,则删除该词。
    优点:
        能较为全面的保留所有关键字(只要不是停用词,任何词性的词都会被保留)
    
    代码:
    import jieba
    
    jieba.cut(string,cut_all=False,HMM=True) # 全模式/精确模式
    jieba.cut_for_search(string,HMM=True) # 搜索引擎模式
    jieba.load_userdict(file_name)  # 加载用户自定义的词库,
    
    jieba.add_word('石墨烯') # 增加自定义词语
    jieba.del_word('自定义词') # 删除自定义词语
    jieba.suggest_freq(segment,tune=True) # 可调节单个词语的词频,使其能(或不能)被分出来。   
    
2/基于TF-IDF算法
    我们只需要告诉组件停用词库,它将自己载入词库并使用它。
    import jieba
    
    jieba扩展包中,有自己的逆向文档语料库和停用词语料库,
    但是如果你在用的时候发现提取关键词的效果并不好,你可以替换成自己的语料库。
    jieba.analyse.set_stop_words('xxxx.txt')
    jieba.analyse.set_idf_path("idf.txt.big")
    
    jieba.analyse.extract_tags(sentence,topK=20,withWeight=False,allowPOS=None)
    
    extract_tags()函数是基于TF-IDF算法进行关键词提取的。
    该函数共有4个参数: 
        <1>sentence:待提取关键词的文本 
        <2>topK:为返回几个 TF-IDF 权重最大的关键词,默认值为20,权重最大的K个词语 
        <3>withWeight:是否一并返回关键词权重值,默认值为 False 
        <4>allowPOS:仅包括指定词性的词,默认值为空

    停用词过滤有限,也需要手工处理部分数字、符号;
    它通过词频抽取关键字,对同一篇文章的词频统计不具有统计意义,多用于宏观上的观测。
    因为在TF-IDF这种算法中,一个词是不是关键词,并不仅仅是由在一篇文章的词频决定的,
    还需要考虑该词在预料库中其他文章中的普遍程度。
    在一篇文章中出现的次数说,并不一定就是关键词。
    
    这就解释了为啥运用TF-IDF算法得到的关键词并不具有词频的统计意义,而是代表该词对于这篇文章的重要程度,是一种宏观上的观测。
    
    
3/基于TextRank算法
    大概效果同TF-IDF,通过限定词性过滤无关字符,能得到较为工整的关键字结果。
    import jieba
    jieba.analyse.set_stop_words('xxxx.txt') # 停用词库
    
    jieba.analyse.textrank(content,
                           topK=20,
                           withWeight=False,
                           allowPOS=['ns','n','vn','v'])
    
    textrank()函数和TF-IDF的extract_tags()函数几乎相同,
    区别在于:extract_tags()函数中的allowPOS参数默认为空,你需要的时候再去添加
             而textrank()函数默认过滤词性,allowPOS=('ns','n','vn','v')

最后:
我们应该根据我们具体的目标去采用合适的分词算法。
1)对某一篇文章进行关键字Map,我们选择普通分词,并自行过滤关键词,或添加自定义词库。
2)对采集的一批样本进行关键字分析,我们可以选择TF-IDF,对所有的关键字进行词频统计,并绘制出关键字云图。
3)如果我们要分析一批样本中用户的分类,用户的行为,用户的目的,我们可以选择TextRank抽取指定词性的关键字进行统计分析。
               
                           

1/前言

参考网址: https://www.jianshu.com/p/883c2171cdb5

在自然语言处理中,为了能更好地处理句子,往往需要把句子拆开分成一个一个的词语,
这样能更好的分析句子的特性,这个过程叫就叫做分词。

中文分词是自然语言处理中经常遇到的场景,比如我们想知道某篇文章的评论中,哪些词出现的比较多。
那么我们就需要进行分词,然后进行词频统计。

由于中文句子不像英文那样天然自带分隔,并且中文存在各种各样的词组,从而使中文分词具有一定的难度。
不过,中文分词并不追求完美,而是通过关键字识别技术,抽取句子中最关键的部分,从而达到理解句子的目的。

也就是说:中文分词并不需要把每个词都完美的切分开,而是通过关键词识别技术,把最关键的部分抽取出来。
   

2/jieba扩展包

jieba是目前最好的python中的中文分词模块(或者称扩展包)。
jieba这个库在中文分词界非常出名,支持简、繁体中文,用户还可以加入自定义词典以提高分词的准确率。
jieba库有自带的语料库和停用词库,
用户可以导入自己的语料库和停用词库,这样可以填充jieba自带的语料库和停用词库的不足。

jieba主要有以下3种切词模式:
<1>全模式
   cut_all=True
   把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
   也就是说:全模式不管三七二十一,把词语全部切分开,它不会试图去理解语句,所以速度很快。
   
   jieba.cut(string,cut_all=True,HMM=True),返回生成器,需要用list()转换成列表。  
   jieba.lcut(string,cut_all=True,HMM=True),直接返回列表
     
<2>精确模式
   cut_all=False
   精确模式:试图将句子最精确地切开,适合文本分析;
   
   jieba.cut(string,cut_all=False,HMM=True),返回生成器,需要用list()转换列表。   
   jieba.lcut(string,cut_all=False,HMM=True),返回列表列表。

<3>搜索引擎模式
   在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词
   jieba.cut_for_search(string,HMM=True)返回生成器,需要用list()转换  
   jieba.lcut_for_search(string,HMM=True)返回列表

3/jieba.cut()函数和jieba.cut_for_search()函数

<1>jieba.cut(str,cut_all=False,HMM=True),函数接受3个参数:
   1)需要分词的字符串str:(unicode 或 UTF-8 字符串、GBK 字符串)
   2)cut_all:是否使用全模式,默认值为False,及精确模式
   3)HMM:用来控制是否使用HMM模型,默认值为True

<2>jieba.cut_for_search(str,HMM=True)函数,搜索引擎模式,函数接受2个参数
   1)需要分词的字符串(unicode 或 UTF-8 字符串、GBK 字符串)
   2)HMM:用来控制是否使用HMM模型,默认值为True

4/全模式&&精确模式

import jieba
jieba.cut(str,cut_all=True,HMM=True)

5/搜索引擎模式

import jieba
jieba.cut_for_search(str,HMM=True)

6/HMM模型

隐马尔可夫模型,是一种基于概率的统计分析模型,用来描述一个系统隐形状态的转移和隐形状态的表现概率,
在jieba中,对于没有收录到jieba词库的词,使用了汉字成词能力的HMM模型和viterbi算法

7/繁体字分词

8/创建自定义词库(这些词是没有收录到jieba自带的词库中的,为了切分词的效果,我们自行加入,二者联合使用)

我们在使用jieba库的时候,默认是使用jieba扩展包自带的词库(收录词库和停用词库)。
如果我们使用jieba自带的词库,传入字符串之后,发现分词效果不是很好,
有的词我们预期要切分开但是没有切分开,或者我们不想切开反而给切开了
 
在这种情况下,我们可以自定义一个补词库,自定义词库和jieba扩展包自带的词库联合使用,
这样分词效果更加。
jieba扩展包会优先使用自定义词库,开发者可以指定自定义的词库,以便包含jieba词库里没有收录的词,
格式如下,一行是一个词,分成3部分,后2部分可以省略,用空格隔开,如下:
       词语 词频(可省略) 词性(可省略)
       创新办 3 i  
       云计算 5
       凱特琳 nz
虽然jieba有新词识别能力(HMM模型的功劳),但自行添加新词可以保证更高的正确率。
词频越高则成词概率越大,但是不宜过大。
具体词频应该设置为多少目前没有公式    

9/载入自定义词库

使用 jieba.load_userdict(file_name) 即可载入自定义词库,file_name是自定义词典文件的路径

10/修改自定义词库,包括添加新的词语,修改词频,词性

使用jieba.add_word(word,freq=None,tag=None)和jieba.del_word(word)可在程序中动态修改词典。
jieba.add_word('石墨烯') # 增加自定义词语
jieba.add_word('凱特琳',freq=42,tag='nz') #设置词频和词性 
jieba.del_word('自定义词') # 删除自定义词语

使用 suggest_freq(segment,tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。   

以上的add_word() del_word() suggest_frq()函数,
只是在执行代码的时候,临时修改而已,并没有修改jieba扩展包的底层数据。