结巴分词

   Python中分分词工具很多,包括盘古分词、Yaha分词、Jieba分词、清华THULAC等,“结巴”中文分词目标是做最好的 Python 中文分词组件。

    jieba分词主要是基于统计词典,构造一个前缀词典;然后利用前缀词典对输入句子进行切分,得到所有的切分可能,根据切分位置,构造一个有向无环图;通过动态规划算法,计算得到最大概率路径,也就得到了最终的切分形式。

  • 基于前缀词典实现高效的词图扫描,生成了句子中汉字所有可能成词情况所构成的有向无环图(DAG)
  • 采用了动态规划查找最大路径概率,找出基于词频的最大切分组合
  • 对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法

以“去北京大学玩”为例,作为待分词的输入文本。

离线统计的词典形式如下,每一行有三列,第一列是词,第二列是词频,第三列是词性。

...
北京大学 2053 nt
大学 20025 n
去 123402 v
玩 4207 v
北京 34488 ns
北 17860 ns
京 6583 ns
大 144099 a
学 17482 n

 1.前缀词典构建:如统计词典中的词“北京大学”的前缀分别是“北”、“北京”、“北京大”;词“大学”的前缀是“大”。

 2.有向无环图构建:然后基于前缀词典,对输入文本进行切分,对于“去”,没有前缀,那么就只有一种划分方式;对于“北”,则有“北”、“北京”、“北京大学”三种划分方式;对于“京”,也只有一种划分方式;对于“大”,则有“大”、“大学”两种划分方式,依次类推,可以得到每个字开始的前缀词的划分方式。

 

一.特点
1、支持三种分词模式

    精确模式,试图将句子最精确的切开;

    全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;

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

2、支持繁体分词

3、支持自定义词典

4、MIT授权协议

二.安装说明
代码对Python 2/3 均兼容

全自动安装:easy_install jieba 或者 pip install jieba / pip3 install jieba
半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install
手动安装:将jieba目录放置于当前目录或者site-packages目录
通过import jieba 来引用

 

三、jieba 分词

结巴中文分词支持的三种分词模式包括: 
(1) 精确模式:试图将句子最精确地切开,适合文本分析; 
(2) 全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义问题; 
(3) 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
1、第一步首先引入 jieba 和语料:

import jieba
import jieba.posseg as psg #通过 jieba.posseg 模块实现词性标注
content = "我在西南石油大学图书馆学习"

2、精确分词

#精确分词:精确模式试图将句子最精确地切开,精确分词也是默认分词。
segs_1 = jieba.cut(content, cut_all=False)
print("/".join(segs_1))

我/在/西南/石油大学/图书馆/学习

3、全模式

#全模式分词:把句子中所有的可能是词语的都扫描出来,速度非常快,但不能解决歧义。
segs_3 = jieba.cut(content, cut_all=True)
print("/".join(segs_3))

我/在/西南/石油/石油大学/大学/图书/图书馆/图书馆学/书馆/学习

4、搜索引擎模式

#搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
segs_4 = jieba.cut_for_search(content)
print("/".join(segs_4))

我/在/西南/石油/大学/石油大学/图书/书馆/图书馆/学习

5、lcut 生成 list

segs_5 = jieba.lcut(content)
print(segs_5)
print([(x.word,x.flag) for x in psg.lcut(content)])

['我', '在', '西南', '石油大学', '图书馆', '学习']
 

6、获取词性

print([(x.word,x.flag) for x in psg.lcut(content)])

[('我', 'r'), ('在', 'p'), ('西南', 'ns'), ('石油大学', 'nt'), ('图书馆', 'n'), ('学习', 'v')]

7、自定义添加词和字典

默认情况下,使用默认分词,是识别不出这句话中的“犀利哥”这个新词,这里使用用户字典提高分词准确性。

  content = "犀利哥在西南石油大学图书馆学习"
   
结果为:

犀利/哥/在/西南/石油大学/图书馆/学习
犀利/哥/在/西南/石油/石油大学/大学/图书/图书馆/图书馆学/书馆/学习
犀利/哥/在/西南/石油/大学/石油大学/图书/书馆/图书馆/学习

如果添加一个词到字典,看结果就不一样了。

import jieba
import jieba.posseg as psg#通过 jieba.posseg 模块实现词性标注
jieba.add_word("犀利哥")
content = "犀利哥在西南石油大学图书馆学习"
#精确分词:精确模式试图将句子最精确地切开,精确分词也是默认分词。
segs_1 = jieba.cut(content, cut_all=False)
print("/".join(segs_1))
#全模式分词:把句子中所有的可能是词语的都扫描出来,速度非常快,但不能解决歧义。
segs_3 = jieba.cut(content, cut_all=True)
print("/".join(segs_3))
#搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
segs_4 = jieba.cut_for_search(content)
print("/".join(segs_4))
segs_5 = jieba.lcut(content)
print(segs_5)
print([(x.word,x.flag) for x in psg.lcut(content)])

结果为:

犀利哥/在/西南/石油大学/图书馆/学习
犀利/犀利哥/在/西南/石油/石油大学/大学/图书/图书馆/图书馆学/书馆/学习
犀利/犀利哥/在/西南/石油/大学/石油大学/图书/书馆/图书馆/学习
['犀利哥', '在', '西南', '石油大学', '图书馆', '学习']
[('犀利哥', 'x'), ('在', 'p'), ('西南', 'ns'), ('石油大学', 'nt'), ('图书馆', 'n'), ('学习', 'v')]

但是,如果要添加很多个词,一个个添加效率就不够高了,这时候可以定义一个文件,然后通过 load_userdict()函数,加载自定义词典,如下:

    jieba.load_userdict('user_dict.txt')
    print(jieba.lcut(txt))

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值