本人这篇文章主要目的就是为了吐槽一下网上可以找到的那些关于jieba
的小文章,它们的内容基本上都是按照github
上jieba
的介绍抄来的,让我的学习毫无半点收获!!!本人会在文章中补充我在学习时碰到的不懂得问题和见解,如果有不对的或者是已经过时的地方,请大家及时指正。
当你看完之后,想来就会有一些心得,我推荐大家接着看这位老哥的内容这位老哥写的内容比我写的好,诚挚推荐!!!(小声逼逼,我和这位老哥不认识,仅仅只是觉得他的内容很好)
1、JIEBA简介
一款中文分词组件,有很多的版本,我现在介绍的呢就是Python实现的jieba中文分词。
在github上可以找到其他语言实现的版本。
在我们的日常生活中就可以看到,如果我们想要对英文文章内容进行分词是十分简单的,因为英文单词之间是有空格进行连接,例如:I love China.
但是对于中文却不是这样,我们人为地对我爱中国
这句话进行分词时很简单的,可以分为我/爱/中国
三个部分,但是如何让计算机来实现这种分词呢?当然这些都不需要我们来操心,因为已经有人为我们准备好了一切----jieba
我们通过下载该组件就可以轻松实现中文分词。
2、安装
安装、配置环境一直都是我个人较为讨厌的事情,总是一折腾就是一整天;当然组件的安装是较为容易的,因为本人使用的一直都是Linux操作系统
并且安装了Anaconda
,所以只需要打开命令行输入:pip install jieba
等待即可完成下载。
其他操作系统的安装方法都是差不多的,打开命令行,基本上都是输入这条语句,如果是想要采用其他方法安装,大家可以参考jieba在github
上的介绍
安装完成之后调用ipython
:
输入import jieba
若没有出现问题就代表已经安装成功了(如下图):
3、对jieba的用法进行介绍
我们依旧是参考官方文档,关于jieba
一个有三种分词模式,使用的主方法是
cut(sentence, cut_all=False, HMM=True, use_paddle=False)
- sentence:表示的是需要进行分词的内容
- cut_all:表示是否使用全模式,默认情况下为False,不使用
- HMM:表示是否使用
隐马尔可夫链
,默认下是开启的 - use_paddle:表示是否使用paddle模式,默认情况下是关闭的
注意:
1、关于paddle模式本人暂时也还没有弄清楚是干嘛的,之后本人会将这部分相关问题添加进来。想要了解的还是那句话,参考github上的官方介绍。
2、HMM,这个隐马尔科夫链到底是干什么用的呢?在默认情况下,这个是开启的,它的作用就在于当对某一句话进行分词时会出现词典中没有出现过的词语
,但是它会自动识别他们能够组成词语的概率对其进行组合。关闭之后就意味着组件不会对陌生词进行识别。
3、三种分词模式分别为全模式
、精确模式(默认模式)
、搜索引擎模式
用法介绍-三种(四种)分词模式
由于paddle模式本人也没搞清楚,所以暂时不介绍
import jieba
# cut方法时jieba分词包中的主方法:cut(sentence, cut_all=False, HMM=True)
# jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用
# jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
# HMM:隐马尔可夫链,默认下是开启的
# 当前为全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))
# 当前为精确模式(默认模式)
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))
# 搜索引擎模式,两个参数cut_for_search(sentence, HMM=True)
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造。")
print(", ".join(seg_list))
# jieba.enable_paddle()
# strs = ["我来到北京清华大学", "乒乓球拍卖完了", "中国科学技术大学"]
# for str in strs:
# seg_list = jieba.cut(str, use_paddle=True)
# print("Paddle Mode: " + "/ ".join(seg_list))
输出结果
Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
Default Mode: 我/ 来到/ 北京/ 清华大学
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造, 。
注意:
1、由此我们可以看到控制全模式与精确模式的开关就在于cut_all
的参数,默认情况下为False
,即表示其为精确模式;设置值为True
时表示为全模式。
2、搜索引擎模式使用的方法为cut_for_search(sentence, HMM=True)
,这个方法也有两个参数,第一个是需要进行分词的一段字符串,第二个参数表示是否使用HMM模型。
3、三种模式的特点各有不同。精确模式
:将句子做最精确的切开,适合做文本分析;全模式
:把句子中所有可以组成词的词语都扫描出来,速度较快,但是不能解决歧义;搜索引擎模式
:在精确模式的基础上对长词再次切分,提高召回率,适用于搜索引擎分词。
4、最后一点是我最最最要吐槽的事情,当读者在学习时,想必已经查看过不少文章,但是有许多文章会对官方文档中给出的例子进行修改,会将
# 当前为全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=True, HMM=False)
#当前为精确模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=False, HMM=True)
作为一组进行对比,会让读者产生理解歧义。我们只需要了解的是,HMM的值是用来影响当前组件是否会自动识别新词的,其他的都可以忽略。
所以在学习新知识的时候,要多看官方文档!多看官方文档!多看官方文档!
用法介绍-载入个人词库
这个部分其实是较为简单的,理解起来也没有什么难度,深度学习之后相信大家很快就能根据官方文档掌握这一部分。下面则是记录本人在学习这一部分时碰到不理解的地方的见解。
下面先贴上代码:
import jieba
jieba.load_userdict("userdict.txt")
import jieba.posseg as pseg
jieba.add_word('石墨烯')
jieba.add_word('凯特琳')
jieba.del_word('自定义词')
test_sent = (
"李小福是创新办主任也是云计算方面的专家; 什么是八一双鹿\n"
"例如我输入一个带“韩玉赏鉴”的标题,在自定义词库中也增加了此词为N类\n"
"「台中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。"
)
words = jieba.cut(test_sent) # 默认模式
print('/'.join(words))
print("=" * 40)
result = pseg.cut(test_sent)
for w in result:
print(w.word, "/", w.flag, ", ", end=" ")
print("\n" + "=" * 40)
terms = jieba.cut('easy_install is great')
print('/'.join(terms))
terms = jieba.cut('python的正则表达式是好用的')
print('/'.join(terms))
print("=" * 40)
testlist = [('今天天气不错', ('今天', '天气')),
('如果放到post中将出错。', ('中', '将')),
('我们中出了一个叛徒', ('中', '出'))]
for sent, seg in testlist:
print('/'.join(jieba.cut(sent, HMM=False))) # 将HMM的值设置为False的原因时让jieba不对没有的词语进行猜测
word = ''.join(seg)
print('%s Before: %s, After: %s' % (word, jieba.get_FREQ(word), jieba.suggest_freq(seg, True)))
print('/'.join(jieba.cut(sent, HMM=False)))
print("-" * 40)
输出结果:
李小福/是/创新办/主任/也/是/云计算/方面/的/专家/;/ /什么/是/八一双鹿/
/例如/我/输入/一个/带/“/韩玉赏鉴/”/的/标题/,/在/自定义/词库/中/也/增加/了/此/词为/N/类/
/「/台中/」/正確/應該/不會/被/切開/。/mac/上/可/分出/「/石墨烯/」/;/此時/又/可以/分出/來/凱特琳/了/。
========================================
李小福 / nr , 是 / v , 创新办 / i , 主任 / b , 也 / d , 是 / v , 云计算 / x , 方面 / n , 的 / uj , 专家 / n , ; / x , / x , 什么 / r , 是 / v , 八一双鹿 / nz ,
/ x , 例如 / v , 我 / r , 输入 / v , 一个 / m , 带 / v , “ / x , 韩玉赏鉴 / nz , ” / x , 的 / uj , 标题 / n , , / x , 在 / p , 自定义 / l , 词库 / n , 中 / f , 也 / d , 增加 / v , 了 / ul , 此 / r , 词 / n , 为 / p , N / eng , 类 / q ,
/ x , 「 / x , 台中 / s , 」 / x , 正確 / ad , 應該 / v , 不 / d , 會 / v , 被 / p , 切開 / ad , 。 / x , mac / eng , 上 / f , 可 / v , 分出 / v , 「 / x , 石墨烯 / x , 」 / x , ; / x , 此時 / c , 又 / d , 可以 / c , 分出 / v , 來 / zg , 凱特琳 / nz , 了 / ul , 。 / x ,
========================================
easy_install/ /is/ /great
python/的/正则表达式/是/好用/的
========================================
今天天气/不错
今天天气 Before: 3, After: 0
今天/天气/不错
----------------------------------------
如果/放到/post/中将/出错/。
中将 Before: 763, After: 494
如果/放到/post/中/将/出错/。
----------------------------------------
我们/中/出/了/一个/叛徒
中出 Before: 3, After: 3
我们/中/出/了/一个/叛徒
----------------------------------------
注意:
1、由上面的例子我们可以看见,云计算
这个名称在我们的日常生活中已经是被大家广泛接受的一个词了,但是呢,在我们的jieba
词库中这个词并没有被添加进去,倘若我们不添加我们自定义的这个词典的话(官方文档中有),云计算
会被拆分为两个部分云
和计算
2、对于接下来一段代码:
for sent, seg in testlist:
print('/'.join(jieba.cut(sent, HMM=False))) # 将HMM的值设置为False的原因时让jieba不对没有的词语进行猜测
word = ''.join(seg)
print('%s Before: %s, After: %s' % (word, jieba.get_FREQ(word), jieba.suggest_freq(seg, True)))
print('/'.join(jieba.cut(sent, HMM=False)))
print("-" * 40)
在不熟悉jieba
之前可能较难理解其中方法的意义。其中get_FREQ
是用来统计当前词的词频的,suggest_freq
则是用来调整词频,让单词能够或不能被分开。因此在测试该方法时需要将HMM
关闭,防止其自动组成新词,影响结果。
后记
本篇文章作为jieba
学习的前一半部分,不理解的东西较多,需要掌握的东西也很多;篇幅过长,大家可能会出现阅读疲劳,所以本人将后面的内容放在下一篇中,欢迎大家关注,并且欢迎大家订阅我的个人博客:http://101.132.119.152/