[Python] 基于 jieba 的中文分词总结

哆啦梦乐园 2021-02-22 11:29:33
总结 Python 分词 中文 jieba


模块安装

pip install jieba

jieba分词器支持4种分词模式:

  1. 精确模式该模式会试图将句子最精确地切分开,适合在文本分析时使用。
  2. 全模式该模式会将句子中所有可以成词的词语都扫描出来,速度也非常快,缺点是不能解决歧义问题,有歧义的词语也会被扫描出来。
  3. 搜索引擎模式该模式会在精确模式的基础上对长词语再进行切分,将更短的词切分出来。在搜索引擎中,要求输入词语的一部分也能检索到整个词语相关的文档,所以该模式适用于搜索引擎分词。
  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}
版权声明
本文为[哆啦梦乐园]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/feily/p/14415259.html

  1. 27000 stars! The most comprehensive collection of Python design patterns
  2. python day3
  3. python day3
  4. Commonly used data operation functions of Python
  5. (数据科学学习手札108)Python+Dash快速web应用开发——静态部件篇(上)
  6. (learning notes of data science 108) Python + dash rapid web application development -- static components (I)
  7. (数据科学学习手札108)Python+Dash快速web应用开发——静态部件篇(上)
  8. (learning notes of data science 108) Python + dash rapid web application development -- static components (I)
  9. [Python] Matplotlib 图表的绘制和美化技巧
  10. Drawing and beautifying skills of [Python] Matplotlib chart
  11. [Python] Matplotlib 图表的绘制和美化技巧
  12. Drawing and beautifying skills of [Python] Matplotlib chart
  13. Virtual environment of Python project
  14. 翻译:《实用的Python编程》02_01_Datatypes
  15. Translation: practical Python Programming 02_ 01_ Datatypes
  16. 翻译:《实用的Python编程》02_01_Datatypes
  17. 翻译:《实用的Python编程》02_01_Datatypes
  18. Translation: practical Python Programming 02_ 01_ Datatypes
  19. Translation: practical Python Programming 02_ 01_ Datatypes
  20. Python 3 入门,看这篇就够了
  21. Python 3 entry, see this is enough
  22. 华为大佬打造的400集Python视频学起来,学完万物皆可爬
  23. 400 episodes of Python video created by Huawei boss
  24. django之csrf_exempt解决跨域请求的问题
  25. CSRF of Django_ Exempt solves the problem of cross domain requests
  26. 1.7 万 Star!一个简单实用的 Python 进度条库
  27. 17000 stars! A simple and practical Python progress bar library
  28. Python爬虫:设置Cookie解决网站拦截并爬取蚂蚁短租
  29. Python crawler: setting cookie to solve website interception and crawling ant short rent
  30. Python-Net编程
  31. Python net programming
  32. 学习Python数学英语基础重要吗?Python教程!
  33. Is it important to learn the basics of math and English in Python!
  34. Python数据分析常用库有哪些?Python学习!
  35. What are the common libraries for Python data analysis? Learn Python!
  36. win 创建python虚拟环境
  37. Creating Python virtual environment with win
  38. In order to automatically collect B station barrage, I developed a tool in Python
  39. 用Python编程语言来实现阿姆斯特朗数的检查
  40. Using python programming language to check Armstrong number
  41. Python中的解决中文字符编码的问题
  42. Solving the problem of Chinese character coding in Python
  43. Translation: practical Python Programming 02_ 01_ Datatypes
  44. Installation and use of Python and tensorflow in win10 environment (Python version 3.6, tensorflow version 1.6)
  45. Python series 46
  46. Linux安装Python3
  47. 【python接口自动化】- 正则用例参数化
  48. Python RestFul Api 设计
  49. filecmp --- 文件及目录的比较│Python标准库
  50. Installing python3 on Linux
  51. [Python] Matplotlib 圖表的繪製和美化技巧
  52. (資料科學學習手札108)Python+Dash快速web應用開發——靜態部件篇(上)
  53. 翻譯:《實用的Python程式設計》02_01_Datatypes
  54. 【python接口自动化】- 正则用例参数化
  55. 翻译:《实用的Python编程》02_02_Containers
  56. 两年Java,去字节跳动写Python和Go
  57. [Python interface automation] - regular use case parameterization
  58. Python restful API design
  59. 翻译:《实用的Python编程》02_02_Containers
  60. 两年Java,去字节跳动写Python和Go