1.jieba分词的安装
直接在cmd窗口当中pip install即可
2.jieba分词的介绍
jieba分词是目前比较好的中文分词组件之一,jieba分词支持三种模式的分词(精确模式、全模式、搜索引擎模式),并且支持自定义词典(这一点在特定的领域很重要,有时候需要根据领域的需要来添加特定的词典以提高分词结果的质量)、支持繁体字分词。
3.jieba分词三种分词模式及使用例子
jieba分词模块的主要方法是jieba.cut(),精确模式和全模式的区别主要在于其中的参数不同
(1)精确模式:将文本精确地切开,适用于文本分析
jieba.cut()方法里面的CUT_ALL=False
(2)全模式:将文本里面所有可以成词的词语全部提取出来,速度较快,但是不能解决歧义的问题
jieba.cut()方法里面的CUT_ALL=True
(3)搜索引擎模式:在精确模式的基础上,将长词再次切分,供搜索使用
需要调用jieba.cut_for_search()方法
仅仅是看这些东西,看不出个所以然来,接下来对三种分词的模式进行测试:
text='北京邮电大学是教育部直属、工业和信息化部共建、首批进行“211工程”建设的全国重点大学' try_words=jieba.cut(text,cut_all=True) print ('全模式分词结果:'+','.join(try_words)) try_words=jieba.cut(text,cut_all=False) print ('精确模式分词结果:'+','.join(try_words)) try_words=jieba.cut_for_search(text) print ('搜素引擎模式分词结果:'+','.join(try_words))
上述代码运行结果:
全模式分词结果:北京,北京邮电,北京邮电大学,邮电,邮电大学,电大,大学,是,教育,教育部,直属,,,工业,和,信息,信息化,部, 共建,,,首批,进行,,211,工程,,,建设,的,全国,重点,大学 精确模式分词结果:北京邮电大学,是,教育部,直属,、,工业,和,信息化,部,共建,、,首批,进行,“,211,工程,”,建设,的,全国,重点, 大学 搜素引擎模式分词结果:北京,邮电,电大,大学,北京邮电大学,是,教育,教育部,直属,、,工业,和,信息,信息化,部,共建,、,首批,进行, “,211,工程,”,建设,的,全国,重点,大学
分析上述代码得到的结果,我们看出全模式分词是将文本当中所有的词都提取出来,提词的窗口是允许重叠和包含的,词语当中的字眼可以出现多次,但是这种分词模式有可能会出现歧义;精确模式分词是将文本精确地分隔开,成词较长的优先,不存在成词窗口的重叠与重复的情况,这种分词模式出现歧义的概率比较小,但是有可能会出现分词窗口过大,某些重点词不会单独出现在结果当中的情况。综上所述,这两种模式的分词适用于不同的情景,应当酌情选择。
值得一提的是,这个例子当中的“工业和信息化部”也应当是一个独立的名词,但是这三种分词方法当中都没有出现这个词语,这就需要人工添加词库来实现,放在下一部分。
再对文本当中可能出现的歧义情况进行尝试:
text2='南京市长江大桥是一座大桥' try_words=jieba.cut(text2,cut_all=True) print ('全模式分词结果:'+','.join(try_words)) try_words=jieba.cut(text2,cut_all=False) print ('精确模式分词结果:'+','.join(try_words)) try_words=jieba.cut_for_search(text2) print ('搜索引擎模式分词结果:'+','.join(try_words))
这个例子当中的文本为“南京市长江大桥是一座大桥”,我们希望提取出来的分词结果应当为:“南京市长江大桥”,或者说,最次也应该是“南京市”和“长江大桥”两个词语,上述代码的运行结果为:
全模式分词结果:南京,南京市,京市,市长,长江,长江大桥,大桥,是,一座,大桥 精确模式分词结果:南京市,长江大桥,是,一座,大桥 搜索引擎模式分词结果:南京,京市,南京市,长江,大桥,长江大桥,是,一座,大桥
分析结果:三种模式当中都没有出现我们的最佳预期(南京市长江大桥),反而在全模式和搜索引擎模式下的分词结果当中出现了歧义词(市长、京市),这跟我们的语境显然是无关的,这也恰好反映了全模式和搜索引擎模式分词的一个缺陷,也就是容易出现与语境无关的歧义词,而精确模式出现的比较少。
至于为什么会出现上述情况,我在查阅相关资料之后,认为原因如下:
中文分词的方法大致可以分为三类:
基于字典、词库匹配的分词方法;基于词频度统计的分词方法和基于知识理解的分词方法(另外还有逐词遍历法,但是因为不论文本有多么短,词库多么大都要逐词遍历一遍,效率过低,所以说大部分情况不予采用)。一般的中文分词模块使用基于字典、词库的分词方法,全模式使用的策略为(设词典中最长词的长度为n):从字段的第一个字符开始,向后读取1,2,...n个字符,并且到词典当中去对应,如果能对应上,就将其取出来,这样就可以达到将所有可以成词的字段提取出来(并且有重复部分)的目的;而相应的,精确模式的分词策略则可能是尽可能将取词窗口扩大,也就是在可能含有重复的长度从1到n的这些词中,取最长的一个输出。
(上述的“原因”只是我在使用分词模块的各个模式时的一点个人看法,不一定正确,对于项目也没有什么影响,毕竟我也没有去专门研究过源码。。。)
4.jieba分词添加自定义的词典
中文分词常常用于许多特定的语境,相应的也就需要添加一些特定语境下的词典,比如上一部分的“南京市长江大桥”就属于“地标建筑”之类的词典,如果分词将其分为“南京市”和“长江大桥”就有可能不能完全反映出原文本的重点(毕竟南京市的东西很多,长江大桥也不止南京市有),这种时候我们就需要添加自定义的词典来提高分词的质量。
jieba.add_word('工业和信息化部')
使用jieba模块的add_word()方法即可对其加入新的词,插入之后的分词结果如下:
全模式分词结果:北京,北京邮电,北京邮电大学,邮电,邮电大学,电大,大学,是,教育,教育部,直属,,,工业,工业和信息化部,信息, 信息化,部,共建,,,首批,进行,,211,工程,,,建设,的,全国, 重点,大学 精确模式分词结果:北京邮电大学,是,教育部,直属,、,工业和信息化部,共建,、,首批,进行,“,211,工程,”,建设,的,全国,重点, 大学 搜素引擎模式分词结果:北京,邮电,电大,大学,北京邮电大学,是,教育,教育部,直属,、,工业,信息,信息化,工业和信息化部,共建,、 ,首批,进行“,211,工程,”,建设,的,全国,重点,大学 全模式分词结果:南京,南京市,南京市长江大桥,京市,市长,长江,长江大桥,大桥,是,一座,大桥 精确模式分词结果:南京市长江大桥,是,一座,大桥 搜索引擎模式分词结果:南京,京市,市长,长江,大桥,南京市,南京市长江大桥,是,一座,大桥
主要的改变在于全模式和搜索引擎模式直接加入了这个词,而精确模式则是将新加词的子集词(姑且这么称呼)取代了,这也符合上一部分的假设。