NLP学习总结---jieba分词工具

jieba 是python中自带的一个用于分词的库,是学习NLP最基本的一个知识点和敲门砖,下面对jieba 的用法和参数API进行简单的介绍

最基本的分词语法

jieba.cut 接受三个参数

  • 需要分词的字符串,可以是中文
  • cut_all bollean类型的参数,用来控制是否采用全模式
  • HMM参数用来控制是否采用HMM模型(隐马模型--后续进行相关学习)

下面进行一个简单的例子

import jieba
fc=jieba.cut('我正在学习自然语言处理', cut_all=True)
#print (type(fc))------generator 
print ('full mode:'+'/'.join(fc))
这个小demo 的返回结果如下:
full mode:我/正在/学习/自然/自然语言/语言/处理
可以看到cut_all 一旦设定为True 后即开启了全切片模式,程序会从语句的前面往后进行切片,将可能组合成为一个词的字段摘录出来,所以即有”语言“,又有”自然语言“
如果将cut_all设定为False 的时候,就会有一种精确的结果即为:
full mode:我/正在/学习/自然语言/处理

jieba.cut_for_search 接受两个参数

  • 需要分词的字符串,可以为中文
  • HMM参数用来控制是否采用HMM模型
    它与jieba.cut 的最大区别就在于分词更加细腻,且会将全部的可能性输出,因此没有cut_all 参数

下面进行一个小例子

import jieba
fc=jieba.cut_for_search('我和巾参加ILTES考试,他拉稀了,所以我考试分数比他高')
#print (type(fc))
print ('full mode:'+'/'.join(fc))
返回的结果:
full mode:我/和/巾/参加/ILTES/考试/,/他/拉稀/了/,/所以/我/考试/分数/考试分数/比/他/高
ps:竟然连”拉稀“都能识别,Jieba准确性还算可以吧

而jieba.lcut/jiba.lcut_for_search 返回的是列表

那么问题来了,如过对于一些特定的语境和特殊的一些词语,怎么才能让jieba 知道哪些词是可以分到一起的,而哪些词是不可以的呢?
jieba 为我们提供了一个载入自定义字典的方法

jieba.load_userdict(file_name)

  • 少量的词汇可以手动添加到字典里面,add_word(word,fre=None,tag=None),del_word(word) 可以在程序里面手动的改变字典
  • suggest_freq(segment,tune=True),调节单个词语的词频,让其能(不能)分出来

下面来看一个例子

import jieba
fc=jieba.cut('我们中将有一个人竞选成为班长',cut_all=False)
#print (type(fc))
#jieba.suggest_freq(('中','将'),True)
print ('full mode:'+'/'.join(fc))
当注释掉jieba.suggest_freq 后,如果cut_all=False 输出结过为
full mode:我们/中将/有/一个/人/竞选/成为/班长
”中将”被分到一起了,这显然不是我们想要的结果,当然,将cut_all设定为True后,仍然会有如此的问题,且会有一个/个人/一个人这样的多种可能性,但是加入jieba.suggest_freq 后,结果会大有改善:
full mode:我们/中/将/有/一个/人/竞选/成为/班长

注:利用jieba.suggest_freq 时候,要将HMM设定为False 

进阶--关键词的提取

  • 基于TF-IDF方法的关键词提取
  • 基于TextRank方法的关键词提取

TF-IDF算法介绍
全称为 term_frequency_inverse_document_frequency
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降

原理
在一份给定的文件里,词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(分子一般小于分母 区别于IDF),以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)

逆向文件频率 (inverse document frequency, IDF) 是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到

公式展示
TF:



IDF:


TF-IDF的计算


TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

jieba.analyse
import jieba.analyse as analyse

  • sentence 需要找出关键词的文本
  • topK 指定需要输出的关键词的个数 默认为20
  • withWeight 是否需要加上权种值,默认为False,如果为True,则默认为输出是以元组构成的列表
  • allowPOS() 用于指定输出词的词性,可以指定输出形容词,名词等等

下面是一个简单的例子

import jieba.analyse as analyse
txt=open ('NBA.txt',encoding='utf-8').read()
qzc=analyse.extract_tags(txt,topK=30,withWeight=True,allowPOS=())
print (qzc)#构成多个元组组成的列表
输出的结果为
[('韦少', 0.40006111722303145), ('杜兰特', 0.3557260029055118), ('全明星', 0.30987389050216535), ('全明星赛', 0.28603743738661414), ('MVP', 0.28239608274566924), ('威少', 0.2588630758501968), ('正赛', 0.14119804137283462), ('科尔', 0.11543555039681103), ('投篮', 0.10367501793307088), ('勇士', 0.1036619725106693), ('球员', 0.10148515694374016), ('斯布鲁克', 0.10080366427795276), ('更衣柜', 0.0779972271933071), ('NBA', 0.07059902068641731), ('三连庄', 0.07059902068641731), ('张卫平', 0.07059902068641731), ('西部', 0.0684778171338189), ('指导', 0.06273582766358267), ('雷霆', 0.05725975412940944), ('明星队', 0.051998151462204725), ('推特上', 0.047066013790944876), ('天呐', 0.047066013790944876), ('弗斯', 0.04462885155314961), ('半场', 0.04221505441574803), ('性格', 0.042031608964783466), ('自己', 0.04161069488433071), ('死敌', 0.040729644057086616), ('主教练', 0.04051086511535434), ('传球', 0.040203929912992126), ('玩命', 0.040203929912992126)]

当然 该方法也可以让用户自定义指定添加停用词

jieba.set_stop_words(file_path_name)

TextRank 算法介绍
下面支队TextRank的算法进行一个简单的阐述,至于里面提到的词权重的衡量计算标准,超出本人范围,暂不做介绍
关键词抽取的任务就是从一段给定的文本中自动抽取出若干有意义的词语或词组。TextRank算法是利用局部词汇之间关系(共现窗口)对后续关键词进行排序,直接从文本本身抽取。其主要步骤如下:
  (1)把给定的文本T按照完整句子进行分割,即

(2)对于每个句子

,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词、形容词,即

,其中

是保留后的候选关键词。
  (3)构建候选关键词图G = (V,E),其中V为节点集,由(2)生成的候选关键词组成,然后采用共现关系(co-occurrence)构造任两点之间的边,两个节点之间存在边仅当它们对应的词汇在长度为K的窗口中共现,K表示窗口大小,即最多共现K个单词。
  (4)根据上面公式,迭代传播各节点的权重,直至收敛。
  (5)对节点权重进行倒序排序,从而得到最重要的T个单词,作为候选关键词。
  (6)由(5)得到最重要的T个单词,在原始文本中进行标记,若形成相邻词组,则组合成多词关键词。例如,文本中有句子“Matlab code for plotting ambiguity function”,如果“Matlab”和“code”均属于候选关键词,则组合成“Matlab code”加入关键词序列。

上面所提到的窗口问题,可以进行如下的视图介绍
一个句子

宁波有什么特产能在上海世博会占有一席之地呢?

处理后{宁波 特产 上海 世博会 占有 一席之地},设窗口为5,则如图


import jieba.analyse as analyse
analyse.textrank(sentence,topK=20,withWeight=False,allowPOS())

jieaba 也提供了分析词性的API

import jieba.posseg as pseg

下面是一个demo

import jieba.posseg as psg
words=psg.cut('我爱自然语言处理')
print (type(words))#generator
for i, j in words:
    print (i,j)
运行结果如下:
我 r
爱 v
自然语言 l
处理 v

以上是Jieba库的一些常用的基本API,未完待续。。。。。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • jieba分词,学习,为了全面了解该模块,,预设学习路线:官方文档——优秀博客文章——实践学习 官方文档部分 (文...
    竹林徒儿阅读 4,247评论 1 12
  • 在接下来的分词练习中将使用到四川大学公共管理学院的一篇新闻进行练习,文本如下: 为贯彻落实党的十九大精神,不断提升...
    nicokani阅读 1,293评论 0 4
  • 0 引言   jieba 是目前最好的 Python 中文分词组件,它主要有以下 3 种特性: 支持 3 种分词模...
    Gaius_Yao阅读 118,249评论 3 82
  • 参考:Python 中文分词组件 jiabaPython中文分词 jieba 十五分钟入门与进阶jieba完整文档...
    领悟悟悟阅读 4,381评论 1 1
  • 注:参考文档 一、在线词云图工具# (1)、使用### 在正式使用jieba分词之前,首先尝试用在线分词工具来将自...
    DearIreneLi阅读 6,165评论 1 8