python⽂本分析之jieba分词⼯具
⼀年前⽼师给了我⼀个⽂本数据分析的项⽬,所以稍微了解了⼀下中⽂⽂本分析的⾮常浅显的知识,在此做⼀下记录。因为⾃然语⾔处理这⼀块我只是为了完成项⽬⽽做了⼀些了解,所以肯定有不太对的地⽅,谅解⼀下啦~、
---------------------⼀个假的⽬录----------------------
⾃⼰对于⽂本分析的理解
⽂本分析的流程
jieba分词⼯具涉及到的算法原理简介(⾃⼰的浅显理解)
jieba分词⼯具的⽤法
1⾃⼰对于⽂本分析的理解
⽂本分析就是从⼀段⽂字性数据中,阅读理解出作者的意思,⽐如好恶、倾向、情绪等等或是分析⽂本的客观类别(⽐如电影的类型)。使⽤到的领域是⾮常多的,⽐如论⽂打分系统、判断论⽂有没有抄袭的系统、舆情分析、股民情绪分析等等。
我最近接触到的呢就是⽂本按照类型聚类、⽂本相似度分析、从论坛或者新闻中分析出股民的情绪等等课题,需要使⽤到的⽂本数据处理⼯具和算法最多的就是jieba分词⼯具、⼀些词典、TF-IDF、余弦相似度算法,真的是⾃然语⾔处理中最基础的部分啦。(所以我的记录真的是纯菜鸡的记录♪(^∇^*) 嘻嘻)
2⽂本分析的流程
所有⽂本分析课题的流程都逃不开这⼏步:(⾃我感觉哈)
数据收集
数据清洗
⽂本向量化
模型训练
分析结果
这⼏步中的每⼀步⾥⾯涵盖的很多问题都把我整的晕头转向.....数据收集涉及到爬⾍、清洗涉及到分词
、去重、删除或者填补空值和错值、提取关键词汇等步骤,向量化⼜是另⼀个long long long story了...⾥⾯涉及了⽆监督算法、有监督算法、词典之类的东西,模型训练就更别提那么多种机器学习模型和统计模型了.....等做到分析结果的时候,要是结果不如意还得重新来....终于知道⾃⼰头发怎么没有的了,真是苍天告诉我不要认输.......(灬ꈍꈍ灬)
哈哈,内容是不是超级多,不过⽂章篇幅有限(懒),这⾥我只把学习到的数据清洗中的分词和关键词提取⽅法做个简单的介绍~
3jieba分词⼯具涉及到的算法原理简介(⾃⼰的浅显理解)
jieba中⽂分词⼯具,就是把⽂章中的句⼦分成⼀个个的词汇的⼯具(废话!),这个⼯具包可以分词、计算词频、标注词性、计算TF-IDF 值、提取关键词,还⽀持繁体分词,可以加载⾃定义词典,所以对于中⽂⽂本分析来说是⼀个⾮常的实⽤的⼯具包。
它⽀持三种分词模式:
精确模式,试图将句⼦最精确地切开,适合⽂本分析;
全模式,把句⼦中所有的可以成词的词语都扫描出来, 速度⾮常快,但是不能解决歧义;
搜索引擎模式,在精确模式的基础上,对长词再次切分,提⾼召回率,适合⽤于搜索引擎分词。
是不是有点不明⽩这三种模式?没关系,来个例⼦试试看:
# -*- coding: utf-8 -*-
import jieba
s1 = '啊啦啦,今天外⾯下⾬啦,我不去四川博物院了,想吃螺蛳粉和⽕锅。'
result1 = jieba.lcut_for_search(s1,HMM=False)#搜索模式
result2 = jieba.lcut(s1,cut_all=True,HMM=False)#全模式
result3 = jieba.lcut(s1,cut_all=False,HMM=False)#精确模式
print('搜索模式:',' '.join(result1))
print('全模式:',' '.join(result2))
print('精确模式:',' '.join(result3))
结果分别是酱紫的(虽然前天才吃了⽕锅,是我还是想吃,还有臭辣臭辣的螺蛳粉~):
搜索模式: 啊 啦 啦 , 今天 外⾯ 下⾬ 啦 , 我 不 去 四川 博物 博物院 了 , 想 吃 螺蛳 粉 和 ⽕锅 。
全模式: 啊 啦 啦 今天 天外 外⾯ 下⾬ 啦 我 不 去 四川 博物 博物院 了 想 吃 螺蛳 粉 和 ⽕锅
精确模式: 啊 啦 啦 , 今天 外⾯ 下⾬ 啦 , 我 不 去 四川 博物院 了 , 想 吃 螺蛳 粉 和 ⽕锅 。
在搜索模式下,长词⽐如 博物院被进⾏了划分,分成了 博物和博物院,⽽精确模式就没有,全模式把所有可能的词语组合⽐如 天外,外⾯都识别出来了,另外他们三个都没有识别出螺蛳粉这个长词(毫⽆吃货的灵性,螺蛳和螺蛳粉完全不⼀样好不好,这样就会导致出现后续语义分析错误的问题,⽐如外卖买错...)这个怎么解决就后⾯再说啦!
接下来介绍⼀下实现算法:
基于前缀词典实现⾼效的词图扫描,⽣成句⼦中汉字所有可能成词情况所构成的有向⽆环图 (DAG)
采⽤了动态规划查最⼤概率路径, 出基于词频的最⼤切分组合
对于未登录词,采⽤了基于汉字成词能⼒的 HMM 模型,使⽤了 Viterbi 算法
看不懂对不对
我查了查资料+发挥imagenation,翻译⼀下⼈话版本:
jieba⼯具包⾃⼰有个词典,句⼦来了,先把句⼦⾥⾯出现的字能够组成的词汇查出来(⾟苦的⼩学⽣),然后根据词语们出现的次数(词频)来判断该词语在句⼦⾥⾯可能是它出现的概率,选择最⼤概率的词汇输出。如果词典⾥⾯没有这个词,就可以使⽤HMM(隐藏马尔科夫模型),Viterbi 算法⽣成新的词汇输出。
是不是还是不太理解?
你就想想,⼩时候我们学习句⼦,是不是有个新华字典在旁边,遇见了不懂的字和词就查⼀查,发现这个字原来可以这样组词啊,然后判断在这个句⼦⾥⾯应该是这样组词的概率(我们是凭感觉,计算机靠算法),最后确认就是这个词语。字典查不到这个词,我们也能通过思考,觉得嗯,可以这样组词。
懂了吗?我们通过思考和感觉来给理解句⼦,学习⽣词,⽽计算机靠算法。那么HMM和Viterbi 算法⼜是什么东东嘞?查了⼀下别的⼤神的资料,⼤概理解是这样滴:
HMM是隐藏马尔科夫模型,⼀种统计算法,它⽤来描述⼀个含有隐含未知参数的马尔可夫过程。马尔科夫过程就是⼀个随机过程:在已知它所处的状态的条件下,它未来的演变不依赖于它以往的演变。
这种已知“现在”的条件下,“将来”与“过去”独⽴的特性称为马尔可夫性,具有这种性质的随机过程叫做马尔可夫过程。⽐如摸⿇将、掷骰⼦等。
隐藏马尔科夫模型主要有⼏个属性:
隐藏状态
可见状态链
转移概率
我⾃⼰的理解就是: 隐藏状态,⽐如骰⼦投掷结果,123456这种我们是知道的,但是每次投的结果是不知道的叫做隐藏状态,可见状态链就是投掷n次后的观测结果,⽐如投第⼀次是6,第⼆次是5.....转移概率就是从隐藏状态转化为可见状态的概率,对于均匀的六⾯体骰⼦来说每个结果出现的概率就是1/6,所以转换概率就是1/6。(不知道这样理解是不是正确的,⼤佬千万不要骂我,作为⼀个内⼼脆弱的渣渣真的会哭出来的。)
所以对于分词来说,词汇是知道的,存在字典中,但是它将如何出现我是不知道的,所以是隐藏状态,可见状态链就是句⼦被分词的可能结果,句⼦中词汇出现的词频,它被观测到出现的次数越多,那么在这个待分词的句⼦⾥头出现的概率就越⼤,这个概率就是转移概率。jieba 就利⽤了Viterbi 算法
求解HMM上的最短路径(最⼤概率)的算法(也就是某个句⼦应该是这样被分割的概率),本质就是求解最可能的隐状态序列,即就是求解最可能的分词结果。
⽐如:分解 想吃螺蛳粉和⽕锅 这句话。
隐藏状态以及转移概率:想(0.01)、吃(0.02)、想吃(0.4)、螺蛳粉(0)、螺蛳(0.2)、粉(0.1)、和(0.1)、⽕锅
(0.5)、⽕(0.01)、锅(0.05)
可见状态链:
想、吃、螺蛳、粉、和、⽕锅
想吃、螺蛳粉、和、⽕、锅
想、吃、螺蛳、粉、和、⽕锅
想吃、螺蛳、粉、和、⽕、锅.....等等n种
计算出所有可见状态链出现的概率就是把对应词汇的转移概率乘起来就好啦,然后从中选择概率最⼤
的可见状态链作为最后的分词结果。
以上只是个⼈理解,轻喷HMM啥的真的好复杂,其实做项⽬只需要会意+会⽤就好啦,(其实还是要理解深⼊些才最好,可是我真的能⼒有限,哭唧唧)
4jieba分词⼯具的⽤法
1 分词
前⾯介绍了三种分词模式,⽤到的是jieba中的lcut和lcut_for_search⽅法,返回的是list,如果使⽤cut和cut_for_search返回的是含有分词结果的迭代器,可以⽤for循环把结果输出。其中的参数HMM和cut_all是⽅⾯你选择是否使⽤新词开发功能以及全模式的选择。当然分词使⽤的都是默认词典,如果要使⽤其他词典就可以使⽤jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建⾃定义分词器,可⽤于同时使⽤不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
2 加载词典
官⽅⽂档这样讲滴~
开发者可以指定⾃⼰⾃定义的词典,以便包含 jieba 词库⾥没有的词。虽然 jieba 有新词识别能⼒,但是⾃⾏添加新词可以保证更⾼的正确率
⽤法: jieba.load_userdict(file_name) # file_name 为⽂件类对象或⾃定义词典的路径
词典格式和 ⼀样,⼀个词占⼀⾏;每⼀⾏分三部分:词语、词频(可省略)、词性(可省略),⽤空格隔开,顺序不可颠倒。file_name 若为路径或⼆进制⽅式打开的⽂件,则⽂件必须为 UTF-8 编码。
词频省略时使⽤⾃动计算的能保证分出该词的词频。
⽐如螺蛳粉本来识别不出来,但是加⼊⾃定义词库试试看呢?
jieba.load_userdict('')
result =jieba.lcut(s1,cut_all=False,HMM=False)
print(' '.join(result))
<中我添加了螺蛳粉这个词语,结果就ok啦:
啊 啦 啦 , 今天 外⾯ 下⾬ 啦 , 我 不 去 四川 博物院 了 , 想 吃 螺蛳粉 和 ⽕锅 。
另外呢还可以加⼊单个的词汇,去强调这个词汇的重要性,也就是官⽅说的调整词典:
使⽤ add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
使⽤ suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
注意:⾃动计算的词频在使⽤ HMM 新词发现功能时可能⽆效。
简单吧~
3 关键词提取
jieba的关键词提取是通过计算每个词汇的TF-IDF值来衡量词汇的重要性。
TF-IDF是指的词频-逆⽂本频率,TF是这个词语在⼀个⽂档中出现的频率,逆⽂本频率是指的该词语在所有⽂档中出现的概率,词频-逆⽂本频率就是他们相乘的值。词语在某个⽂档中出现的频率越⾼,但是在其他⽂档中出现的越少,就证明该词汇越能够当做某篇⽂档的关键词。
TF-IDF值越⼤该词汇的重要性就越⼤。
代码呢就是酱紫滴:
act_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence 为待提取的⽂本
topK 为返回⼏个 TF/IDF 权重最⼤的关键词,默认值为 20
withWeight 为是否⼀并返回关键词权重值,默认值为 False
allowPOS 仅包括指定词性的词,默认值为空,即不筛选
jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率⽂件
例⼦:(还是螺蛳粉那个句⼦)
import jieba.analyse
s1 = '啊啦啦,今天外⾯下⾬啦,我不去四川博物院了,想吃螺蛳粉和⽕锅。'
jieba.load_userdict('')
result = act_tags(s1,topK=1)
print(result)
结果深得我⼼!
是 ['螺蛳粉'] 啊!
要返回TF-IDF的话,改改参数:
result = act_tags(s1,topK=2,withWeight=True)
结果是:[('螺蛳粉', 1.7078239289857142), ('博物院', 1.4241217170357143)]
并且关键词提取所使⽤逆向⽂件频率(IDF)⽂本语料库可以切换成⾃定义语料库的路径
python中文文档⽤法: jieba.analyse.set_idf_path(file_name) # file_name为⾃定义语料库的路径
关键词提取所使⽤停⽌词(Stop Words)⽂本语料库可以切换成⾃定义语料库的路径
⽤法: jieba.analyse.set_stop_words(file_name) # file_name为⾃定义语料库的路径
还有⼀种⽤法:
基于 TextRank 算法的关键词抽取
ank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使⽤,接⼝相同,注意默认过滤词性。
jieba.analyse.TextRank() 新建⾃定义 TextRank 实例
s1 = '啊啦啦,今天外⾯下⾬啦,我不去四川博物院了,想吃螺蛳粉和⽕锅。'
jieba.load_userdict('')
result = ank(s1, topK=2, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
print(result)
结果就不⼀样了,不知道为什么诶....我是很少⽤这种⽅法的。
['四川', '博物院']
4 词性标注
jieba.posseg.POSTokenizer(tokenizer=None) 新建⾃定义分词器,tokenizer 参数可指定内部使⽤的 jieba.Tokenizer分词
器。jieba.posseg.dt 为默认词性标注分词器。
标注句⼦分词后每个词的词性,采⽤和 ictclas 兼容的标记法。
⽤法⽰例
import jieba.posseg
s1 = '想吃螺蛳粉和⽕锅'
jieba.load_userdict('')
result = jieba.posseg.cut(s1)
for word,tags in result:
print(word,tags)
想 v
吃 v
螺蛳粉 x
和 c
⽕锅 n
以上就是我所理解的jieba分词⼯具的⽤法啦~
另外分词时侯如果有停⽤词,我会把停⽤词加载在⼀个list中,然后判断分词结果有没有在停⽤词表中,如果有就pass掉,这样的⽅法来把停⽤词汇⽐如‘地’,‘的’这类的去掉。
还有其他⽤法,暂时⽤不到,⽽且有点看不懂,⽐如Chinese_analyse搜索引擎不知道是个啥。希望能有⼤神看见解答⼀下下呀 感激不尽!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论