由于中文文本中的单词不是通过空格或者标点符号分割,所以中文及类似语言存在一个重要的“分词” 问题,jieba、SnowNLP(MIT)、pynlpir等都可以完成对中文的分词处理,该文章采用 jieba进行中文分词。
  使用之前,我们需要先下载jieba库,而在Windows下使用pip安装python第三方库的时候,经常会因为墙的原因下载不上第三方的库文件,所以下载方法见我之前文章 Anaconda3安装jieba库和NLTK库

1、jieba库基本介绍
1.1 jieba库概述

jieba 是一个python实现的分词库,对中文有着很强大的分词能力,我们在使用时通过import jieba 导入 jieba库:

  • 中文文本需要通过分词获得单个的词语;
  • jieba是优秀的中文分词第三方库,需要额外安装;
  • jieba库提供三种分词模式,最简单只需掌握一个函数。
1.2 jieba分词的原理

Jieba分词依靠中文词库:

  • 利用一个中文词库,确定汉字之间的关联概率;
  • 汉字间概率大的组成词组,形成分词结果;
  • 除了分词,用户还可以添加自定义的词组。
1.3 jieba库使用说明

(1)、jieba分词的三种模式

精确模式、全模式、搜索引擎模式:

  • 精确模式:把文本精确的切分开,不存在冗余单词。
  • 全模式:把文本中所有可能的词语都扫描出来,有冗余。
  • 搜索引擎模式:在精确模式基础上,对长词再次切分。

(2)、jieba库常用函数

函数描述
jieba.cut(txt)精确模式,返回一个可迭代的数据类型
jieba.lcut(txt)精确模式,返回一个列表类型,建议使用
jieba.cut(txt,cut_all = True)全模式,输出文本txt中所有可能单词
jieba.lcut(txt,cut_all = True)全模式,返回一个列表类型,建议使用
jieba.cut_for_search(txt)搜索引擎模式
jieba.lcut_for_search(txt)搜索引擎模式,返回一个列表类型,建议使用
jieba.add_word(txt)向分词词典中增加新词
2、分词实例
2.1 三种模式实例对比

精确模式:

import jieba
messages = jieba.cut("万里长城是中国古代劳动人民血汗的结晶和中国古代文化的象征和中华民族的骄傲",cut_all=False)   #精确模式
print ( '【精确模式下的分词:】'+"/ ".join(messages)) 

运行结果:

【精确模式下的分词:】万里长城/ 是/ 中国/ 古代/ 劳动/ 人民/ 血汗/ 的/ 结晶/ 和/ 中国/ 古代/ 文化/ 的/ 象征/ 和/ 中华民族/ 的/ 骄傲

  这里我们需要注意的是,jieba默认模式即为精确模式,所以使用下列表达也是同样的效果,即省略cut_all=False:

import jieba
messages = jieba.cut("万里长城是中国古代劳动人民血汗的结晶和中国古代文化的象征和中华民族的骄傲")   #默认精确模式
print ( '【精确模式下的分词:】'+"/ ".join(messages)) 

全模式:

import jieba
messages = jieba.cut("万里长城是中国古代劳动人民血汗的结晶和中国古代文化的象征和中华民族的骄傲",cut_all=True)   #全模式
print ( '【全模式下的分词:】'+"/ ".join(messages)) 

运行结果:

【全模式下的分词:】万里/ 万里长城/ 里长/ 长城/ 是/ 中国/ 古代/ 代劳/ 劳动/ 动人/ 人民/ 血汗/ 的/ 结晶/ 和/ 中国/ 古代/ 文化/ 的/ 象征/ 和/ 中华/ 中华民族/ 民族/ 的/ 骄傲

可以明显看到文本存在冗余单词。

搜索引擎模式:

import jieba
messages = jieba.cut_for_search("万里长城是中国古代劳动人民血汗的结晶和中国古代文化的象征和中华民族的骄傲")   #搜索引擎模式
print ( '【搜索引擎模式下的分词:】'+"/ ".join(messages)) 

运行结果:

【搜索引擎模式下的分词:】万里/ 里长/ 长城/ 万里长城/ 是/ 中国/ 古代/ 劳动/ 人民/ 血汗/ 的/ 结晶/ 和/ 中国/ 古代/ 文化/ 的/ 象征/ 和/ 中华/ 民族/ 中华民族/ 的/ 骄傲
2.2 调整词频

  有的时候,如果按照jieba正常分词,会把我们不希望分开的词语给分开,这个时候就会改变句子的意思。就如以下例子,我们希望 不喜欢 是一个词,不被分开:

import jieba
messages = jieba.cut("我不喜欢下雨天刮风")   #默认精确模式
print ( "/ ".join(messages)) 

运行结果:

我/ 不/ 喜欢/ 下雨天/ 刮风

  这个时候,我们可以使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来:

import jieba
messages = jieba.cut("我不喜欢下雨天刮风")   #默认精确模式
jieba.suggest_freq(('不喜欢'),tune=True)
print ( "/ ".join(messages)) 

运行结果:

我/ 不喜欢/ 下雨天/ 刮风
2.3 分词后词性标注

  分词成功以后,我们通常需要提取关键词,而关键词通常是名词、动名词或者名词的词组,所以在提取关键词之前,我们可以先对提取出来的词语做一下词性标注,以便于后续分类。

import jieba.posseg as contents    #词性标注
messages = contents.cut('万里长城是中国古代劳动人民血汗的结晶')
for message in messages:    #使用for循环逐一获取划分后的词语
    print(message.word,message.flag)

运行结果:

万里长城 ns
是 v
中国 ns
古代 t
劳动 vn
人民 n
血汗 n
的 uj
结晶 n
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐