在上节教程中我们已经对 jieba 库进行了安装,本节教程就对 jieba 库如何分词进行讲解。
jieba 库是一款优秀的 Python 第三方中文分词库,支持 3 种分词模式:精确模式、全模式和搜索引擎模式。这3种模式的特点如下。
精确模式:试图将语句最精确地切分,不存在冗余数据,适合做文本分析。
全模式:将语句中所有可能是词的词语都切分出来,速度很快,但是存在冗余数据,不能解决歧义。
搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
可使用 jieba.lcut() 和 jieba.lcut_for_search() 方法进行分词,这两个方法返回的都是一个 list。jieba.lcut() 接受 3 个参数:需要分词的字符串,是否使用全模式(默认值为 False),以及是否使用 HMM 模型(默认值为 True)。jieba.lcut_for_search() 接受两个参数:需要分词的字符串和是否使用 HMM 模型。
提示:HMM(Hidden Markov Model)模型,又叫作隐马尔科夫模型,是一种基于概率的统计分析模型,读者只需要知道这是一个专有名字即可。
上面的概念可能有些抽象,我们还是通过示例来实际感受一下这 3 种分词模式的效果吧!代码如下。
import jieba
segStr = "江州市长江大桥参加了长江大桥通车仪式"
joinChar=" / "
print("精确模式:" + joinChar.join(jieba.lcut(segStr)))
print("全模式:" + joinChar.join(jieba.lcut(segStr,cut_all=True)))
print("未启用 HMM模式:" + joinChar.join(jieba.lcut(segStr,HMM=False)))
print("搜索引擎模式:" + joinChar.join(jieba.lcut_for_search(segStr)))
得到的结果如图 3 所示。
图 3
执行程序前 jieba 会初始化加载默认词库。如果我们想要加载更全面的词库,可以替换默认的初始化词库。jieba 默认词库是位于模块安装路径下的 dict.txt 文件。
我们创建了一个变量 segStr,用它来表示要进行分词处理的字符串,字符串的内容是:"江州市长江大桥参加了长江大桥通车仪式"。
我们还创建了一个名为 joinChar 的变量,并且将斜杠作为字符串赋值给整个变量。因为我们要使用字符串的 join() 方法,用指定的字符把序列中的元素连接生成一个新的字符串,这里使用斜杠来连接序列中的元素。
join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。join() 方法的语法是:str.join(sequence)。参数 sequence 表示要连接的元素序列。例如,我们要使用横杠将一个元组中的所有元素串联成一个字符串。
>> joinChar="-"
>> seq=("a","b","c")
>> print (joinChar.join(seq))
a-b-c
接下来使用 jieba.lcut() 方法进行分词。我们只传递了一个字符串参数给该方法,因为默认没有使用全模式并且使用了 HMM 模型,所以会返回一个精确模式分词的列表。我们采用 join() 方法把返回的列表用斜杠连接起来,并且输出到屏幕上,输出内容如下所示:
精确模式:江州/ 市/ 长江大桥/ 参加/ 了/ 长江大桥/ 通车/ 仪式
可以看到,拆分出来的词语基本上就是我们日常会使用的词组。
接下来,我们除了为 jieba.lcut() 方法传递了字符串参数,还指定使用全模式分词,这样会返回一个全模式分词的列表,输出内容如下所示:
全模式:江州/ 州市/ 市长/ 长江/ 长江大桥/ 大桥/ 参加/ 了/ 长江/ 长江大桥/ 大桥/ 通车/ 仪式
可以看到,使用全模式分词,“江州市”不仅仅只是可以拆分成“江州市”,还可以拆分成“江州”和“州市”。类似的,“电子游戏”也可以拆分成“电子”“电子游戏”“子游”和“游戏”4 个词组。从结果可以看出,和精确模式相比,全模式会产生不少的歧义。
然后我们不使用 HMM 模型,看看效果。
未启用 HMM模式:江州/ 市/ 长江大桥/ 参加/ 了/ 长江大桥/ 通车/ 仪式
可以看到,对于这个字符串,使用 HMM 模型和不使用 HMM 模型,分拆的结果差不多,只是对名字的分拆有所不同而已。
最后我们使用了搜索引擎模式,也就是使用 jieba.lcut_for_search() 方法而不是 jieba.lcut() 方法,传递的参数仍然是同一个待拆分的字符串,得到的分词结果如下所示。
搜索引擎模式:江州/ 市/ 长江/ 大桥/ 长江大桥/ 参加/ 了/ 长江/ 大桥/ 长江大桥/ 通车/ 仪式