关于jieba

今天想谈谈jieba。别误会,不是说话断断续续不那么连贯的同学,它可能是目前最好的Python中文分词组件。

缘起

软件工程的大作业要求我们运用软件工程中的知识设计一个软件,我们组的idea是做一个匿名日记软件,日记软件很容易理解,但如果能够匿名的将你与另一个和你心情相同的同学联系到一起,分享你们的心情,那可能是一个比较不错的事情。

一个比较不错的匹配方式是对每个用户的文章进行分析,按照一定的规则选取关键词,对于关键词相似的文章进行匹配。于是搜集NLP中关于关键词提取的算法,TF-IDF算法出镜率颇高。虽然有诸多缺点(对词之间的关系忽略较多等),我还是去找了与其相关的资料和实现方法,显然,算法本身比较简单,但随之而来的问题便是,要统计一篇文章中的词频,是不是首先需要将文章本身进行分词呢?

观察了其他几个算法(TextRank等)之后,发现它们在统计学上基本都是要统计词汇频率的,于是思路很自然的就转向了文章分词的方向。简单搜索之后,找到了jieba。

jieba

jieba是是一款Python中文分词组件,作者来自百度,功能简单却强大,推荐大家学习使用。

功能简介

  1. 分词:作为一款“中文分词组件”,主打功能当然是分词了,简单实用,几个命令即可完美分词。
  2. 添加自定义词典:jieba自带的词库来源主要有两个,“一个是网上能下载到的1998人民日报的切分语料还有一个msr的切分语料。还有作者自己收集的一些txt小说,用ictclas(中科院计算所的分词系统)切分,然后用python脚本统计词频。 故对于某些词的识别率依然不是很高,用户可以根据自己的需求来添加词库等。
  3. 关键词提取:这就是我目前比较需要的功能了,它基于TF-IDF或者TextRank算法,效果很好。
  4. 词性标注:标注词性,与ictclas兼容。
  5. 并行分词:可以将各行文本分配给多个Python进程并行分词,然后归并结果,获得分词速度的可观提升。目前此功能基于 python 自带的 multiprocessing模块,暂不支持Windows
  6. Tokenize:返回词语在原文的起止位置
  7. ChineseAnalyzer for Whoosh 搜索引擎:这个功能个人不是很理解
  8. 命令行分词:从命令行中即可调用jieba进行分词任务

用法简介

分词

最简单的分词调用方法如下:

结果如下:

其中jieba.cut()方法返回的是一个generator,它的文档如下:

其中第一个参数是要分割的句子,第二个参数代表使用哪种分词模式,第三个参数代表是否使用隐马尔可夫模型发现新词。

jieba中的分词模式有三种,分别为

  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词

三种模式的使用方式如下:

输出结果如下

可以看到全模式中,所有可能的词汇都被找了出来,三种模式各有千秋,须根据自己本身需求使用。

关于停用词,网络上有通过比对分词结果和停用词库来删除部分停用词结果的方法,也有直接通过修改词典删除词汇的方法,再次不一一赘述。

添加自定义词典

大家可能看到,刚刚的分词结果是有问题的,我们熟悉的龙族主角路明非变成了“路明”和“非”,这种情况的出现是由于路明非在词库中的feq比较小,我们在命令行中输入命令:

我们可以发现它的返回值为1,很小,所以分词倾向于feq更高的‘路明’和‘非’

解决方法也很简单,这里偷懒,我就直接复制官方文档了:

使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。

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

注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。

代码示例:

 

再附一份之前在其他博客学习时使用的代码:
import jieba

还有一些导入词库的功能,我自己还没使用,感兴趣的话可以去查官方文档。

关键词提取

如刚刚讲过的,jieba的关键词提取主要基于TF-IDF算法和TextRank算法实现,使用两个不同的命令可以简单对其进行调用,这是我对之前自己的“关于美赛”博文的分析。

结果如下

其中analyse.extract_tags()这个函数返回的是一个list。

总结

由于我也是刚刚接触jieba,它还有一些这篇文章可能没有覆盖的功能,在jieba的文档里对其功能都介绍的很清楚,大家可以去点点star ^^.也有很多人写了jieba分词的其他版本,在github上均有相关资料。

发表评论

电子邮件地址不会被公开。 必填项已用*标注