[Python] 基于 jieba 的中文分词总结
模块安装
pip install jieba
jieba分词器支持4种分词模式:
- 精确模式该模式会试图将句子最精确地切分开,适合在文本分析时使用。
- 全模式该模式会将句子中所有可以成词的词语都扫描出来,速度也非常快,缺点是不能解决歧义问题,有歧义的词语也会被扫描出来。
- 搜索引擎模式该模式会在精确模式的基础上对长词语再进行切分,将更短的词切分出来。在搜索引擎中,要求输入词语的一部分也能检索到整个词语相关的文档,所以该模式适用于搜索引擎分词。
- Paddle模式该模式利用PaddlePaddle深度学习框架,训练序列标注网络模型实现分词,同时支持词性标注。
该模式在4.0及以上版本的jieba分词器中才能使用。使用该模式需要安装PaddlePaddle模块,安装命令为“pip install paddlepaddle
”。
开源代码
https://github.com/fxsjy/jieba
基本用法
>>> import jieba
>>> str1 = '我来到了成都的西南交通大学犀浦校区,发现这儿真不错'
>>> seg_list = jieba.cut(str1, cut_all=True)
>>> print('全模式分词结果:' + '/'.join(seg_list))
全模式分词结果:我/来到/了/成都/的/西南/交通/大学/犀/浦/校区/,/发现/这儿/真不/真不错/不错
>>> seg_list = jieba.cut(str1, cut_all=False)
>>> print('精确模式分词结果:' + '/'.join(seg_list))
精确模式分词结果:我/来到/了/成都/的/西南/交通/大学/犀浦/校区/,/发现/这儿/真不错
启用Paddle
这里有个坑,首先不能用最新的python版本,我从3.9.1降到了3.8.7才可以。
另外安装后使用一直报错,最终发现需要Microsoft Visible C++ 2017 Redistributable 及其以上版本支持
。
import jieba
import paddle
str1 = '我来到了成都的西南交通大学犀浦校区,发现这儿真不错'
paddle.enable_static()
jieba.enable_paddle()
seg_list = jieba.cut(str1, use_paddle=True)
print('Paddle模式分词结果:' + '/'.join(seg_list))
输出:
Paddle模式分词结果:我/来到/了/成都/的/西南交通大学犀浦校区,/发现/这儿/真不错
词性标注
import jieba
import paddle
# 词性标注分词器
import jieba.posseg as pseg
str1 = '我来到了成都的西南交通大学犀浦校区,发现这儿真不错'
paddle.enable_static()
jieba.enable_paddle()
words = pseg.cut(str1,use_paddle=True)
for seg, flag in words:
print('%s %s' % (seg, flag))
输出:
我 r
来到 v
了 u
成都 LOC
的 u
西南交通大学犀浦校区, ORG
发现 v
这儿 r
真不错 a
注意:pseg.cut 和 jieba.cut 返回的对象是不一样的!
paddle模式词性标注对应表如下:
paddle模式词性和专名类别标签集合如下表,其中词性标签 24 个(小写字母),专名类别标签 4 个(大写字母)。
标签 | 含义 | 标签 | 含义 | 标签 | 含义 | 标签 | 含义 |
---|---|---|---|---|---|---|---|
n | 普通名词 | f | 方位名词 | s | 处所名词 | t | 时间 |
nr | 人名 | ns | 地名 | nt | 机构名 | nw | 作品名 |
nz | 其他专名 | v | 普通动词 | vd | 动副词 | vn | 名动词 |
a | 形容词 | ad | 副形词 | an | 名形词 | d | 副词 |
m | 数量词 | q | 量词 | r | 代词 | p | 介词 |
c | 连词 | u | 助词 | xc | 其他虚词 | w | 标点符号 |
PER | 人名 | LOC | 地名 | ORG | 机构名 | TIME | 时间 |
调整词典
-
使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
-
使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
智能识别新词
将jieba.cut()函数的参数HMM设置为True,即可使用基于汉字成词能力的HMM模型识别新词,即词典中不存在的词。
测试一下,效果一般
搜索引擎模式分词
import jieba
str1 = '我来到了成都的西南交通大学犀浦校区,发现这儿真不错'
seg_list = jieba.cut_for_search(str1)
print('搜索引擎模式分词结果:' + '/'.join(seg_list))
输出:
搜索引擎模式分词结果:我/来到/了/成都/的/西南/交通/大学/犀浦/校区/,/发现/这儿/真不/不错/真不错
使用自定义词典
用户词典.txt 如下
import jieba
str = '心灵感应般地蓦然回首,才能撞见那一低头的温柔;也最是那一低头的温柔,似一朵水莲花不胜凉风的娇羞;也最是那一抹娇羞,才能让两人携手共白首。';
seg_list = jieba.cut(str)
print('未加载自定义词典时的精确模式分词结果:\n', '/'.join(seg_list))
jieba.load_userdict('用户词典.txt')
seg_list = jieba.cut(str)
print('加载自定义词典时的精确模式分词结果:\n', '/'.join(seg_list))
jieba.add_word('最是')
seg_list = jieba.cut(str)
print('添加自定义词时的精确模式分词结果:\n', '/'.join(seg_list))
jieba.del_word('一低头')
seg_list = jieba.cut(str)
print('删除自定义词时的精确模式分词结果:\n', '/'.join(seg_list))
关键词提取
关键词是最能反映文本的主题和意义的词语。关键词提取就是从指定文本中提取出与该文本的主旨最相关的词,它可以应用于文档的检索、分类和摘要自动编写等。
从文本中提取关键词的方法主要有两种:
- 第一种是有监督的学习算法;
这种方法将关键词的提取视为一个二分类问题,先提取出可能是关键词的候选词,再对候选词进行判定,判定结果只有“是关键词”和“不是关键词”两种,基于这一原理设计一个关键词归类器的算法模型,不断地用文本训练该模型,使模型更加成熟,直到模型能准确地对新文本提取关键词; - 第二种是无监督的学习算法;
这种方法是对候选词进行打分,取出打分最高的候选词作为关键词,常见的打分算法有TF-IDF和TextRank。jieba模块提供了使用TF-IDF和TextRank算法提取关键词的函数。
#基于TF-IDF算法的关键词提取
from jieba import analyse
text = '记者日前从中国科学院南京地质古生物研究所获悉,该所早期生命研究团队与美国学者合作,在中国湖北三峡地区的石板滩生物群中,发现了4种形似树叶的远古生物。这些“树叶”实际上是形态奇特的早期动物,它们生活在远古海洋底部。相关研究成果已发表在古生物学国际专业期刊《古生物学杂志》上。'
keywords = analyse.extract_tags(text, topK = 10, withWeight = True, allowPOS = ('n', 'v'))
print(keywords)
#基于TextRank算法的关键词提取
from jieba import analyse
text = '记者日前从中国科学院南京地质古生物研究所获悉,该所早期生命研究团队与美国学者合作,在中国湖北三峡地区的石板滩生物群中,发现了4种形似树叶的远古生物。这些“树叶”实际上是形态奇特的早期动物,它们生活在远古海洋底部。相关研究成果已发表在古生物学国际专业期刊《古生物学杂志》上。'
keywords = analyse.textrank(text, topK = 10, withWeight = True, allowPOS = ('n', 'v'))
print(keywords)
说明:
- extract_tags()
- 参数sentence为待提取关键词的文本;
- 参数topK用于指定需返回的关键词个数,默认值为20;
- 参数withWeight用于指定是否同时返回权重,默认值为False,表示不返回权重,TF或IDF权重越高,返回的优先级越高;
- 参数allowPOS用于指定返回的关键词的词性,以对返回的关键词进行筛选,默认值为空,表示不进行筛选。
- textrank()
- 和extract_tags()函数的参数基本一致,只有参数allowPOS的默认值不同。
- 由于算法不同,结果可能会有差异。
停用词过滤
停用词是指在每个文档中都会大量出现,但是对于NLP没有太大作用的词,如“你”“我”“的”“在”及标点符号等。在分词完毕后将停用词过滤掉,有助于提高NLP的效率。
···python
import jieba
with open('stopwords.txt', 'r+', encoding = 'utf-8')as fp:
stopwords = fp.read().split('\n')
word_list = []
text = '商务部4月23日发布的数据显示,一季度,全国农产品网络零售额达936.8亿元,增长31.0%;电商直播超过400万场。电商给农民带来了新的机遇。'
seg_list = jieba.cut(text)
for seg in seg_list:
if seg not in stopwords:
word_list.append(seg)
print('启用停用词过滤时的分词结果:\n', '/'.join(word_list))
## 词频统计
词频是NLP中一个很重要的概念,是分词和关键词提取的依据。在构造分词词典时,通常需要为每一个词设置词频。
对分词结果进行词频统计能从客观上反映一段文本的侧重点.
```python
import jieba
text = '蒸馍馍锅锅蒸馍馍,馍馍蒸了一锅锅,馍馍搁上桌桌,桌桌上面有馍馍。'
with open('stopwords.txt', 'r+', encoding = 'utf-8')as fp:
stopwords = fp.read().split('\n')
word_dict = {}
jieba.suggest_freq(('桌桌'), True)
seg_list = jieba.cut(text)
for seg in seg_list:
if seg not in stopwords:
if seg in word_dict.keys():
word_dict[seg] += 1
else:
word_dict[seg] = 1
print(word_dict)
输出:
{'蒸': 3, '馍馍': 5, '锅锅': 1, '一锅': 1, '锅': 1, '搁': 1, '桌桌': 2, '上面': 1}