jieba

jieba分词的算法

主要有以下三种:

1、基于统计词典,构造前缀词典,基于前缀词典对句子进行切分,得到所有切分可能,根据切分位置,构造一个有向无环图(DAG);
2、基于DAG图,采用动态规划计算最大概率路径(最有可能的分词结果),根据最大概率路径分词;
3、对于新词(词库中没有的词),采用有汉字成词能力的 HMM 模型进行切分。

jieba分词

接下来我们进行jieba分词练习,第一步首先引入 jieba 和语料:

import jieba    content = "现如今,机器学习和深度学习带动人工智能飞速的发展,并在图片处理、语音识别领域取得巨大成功。"

(1)精确分词
精确分词:精确模式试图将句子最精确地切开,精确分词也是默认分词。

segs_1 = jieba.cut(content, cut_all=False)print("/".join(segs_1))

其结果为:

segs_3 = jieba.cut(content, cut_all=True)    print("/".join(segs_3))

(2)全模式
全模式分词:把句子中所有的可能是词语的都扫描出来,速度非常快,但不能解决歧义。

segs_3 = jieba.cut(content, cut_all=True)    print("/".join(segs_3))

结果为:

现如今/如今///机器/学习/和/深度/学习/带动/动人/人工/人工智能/智能/飞速/的/发展///并/在/图片/处理///语音/识别/领域/取得/巨大/巨大成功/大成/成功//

(3)搜索引擎模式
搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

segs_4 = jieba.cut_for_search(content)    print("/".join(segs_4))

结果为:

如今/现如今/,/机器/学习/和/深度/学习/带动/人工/智能/人工智能/飞速/的/发展/,/并/在/图片/处理/、/语音/识别/领域/取得/巨大/大成/成功/巨大成功/。

(4)用 lcut 生成 list
jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代Generator,可以使用 for 循环来获得分词后得到的每一个词语(Unicode)。jieba.lcut 对 cut 的结果做了封装,l 代表 list,即返回的结果是一个 list 集合。同样的,用 jieba.lcut_for_search 也直接返回 list 集合。

segs_5 = jieba.lcut(content)    print(segs_5)

结果为:

['现如今', ',', '机器', '学习', '和', '深度', '学习', '带动', '人工智能', '飞速', '的', '发展', ',', '并', '在', '图片', '处理', '、', '语音', '识别', '领域', '取得', '巨大成功', '。']

(5)获取词性
jieba 可以很方便地获取中文词性,通过 jieba.posseg 模块实现词性标注。

import jieba.posseg as psg    print([(x.word,x.flag) for x in psg.lcut(content)])

结果为:

[('现如今', 't'), (',', 'x'), ('机器', 'n'), ('学习', 'v'), ('和', 'c'), ('深度', 'ns'), ('学习', 'v'), ('带动', 'v'), ('人工智能', 'n'), ('飞速', 'n'), ('的', 'uj'), ('发展', 'vn'), (',', 'x'), ('并', 'c'), ('在', 'p'), ('图片', 'n'), ('处理', 'v'), ('、', 'x'), ('语音', 'n'), ('识别', 'v'), ('领域', 'n'), ('取得', 'v'), ('巨大成功', 'nr'), ('。', 'x')]

(6)并行分词

并行分词原理为文本按行分隔后,分配到多个 Python 进程并行分词,最后归并结果。

用法:

jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数 。jieba.disable_parallel() # 关闭并行分词模式 。

注意: 并行分词仅支持默认分词器 jieba.dt 和 jieba.posseg.dt。目前暂不支持 Windows。

(7)获取分词结果中词列表的 top n

from collections import Counter
    top5=Counter(segs_5).most_common(5)
    print(top5)

结果为:

[(',', 2), ('学习', 2), ('现如今', 1), ('机器', 1), ('和', 1)]