中文文本处理工具库 — jieba

2019-02-10  本文已影响25人  松鼠的读书笔记

网易云课堂AI工程师(自然语言处理)学习笔记,接上一篇英语文本处理工具库2 — spaCy》


1、jieba简介

jieba “结巴”中文分词:做最好的 Python 中文分词组件

2、基本操作

(1)中文分词

a. 什么是分词?

对于中文和日文这样的特殊亚洲语系文本而言,字和字之间是紧密相连的,单纯从文本形态上无法区分具备独立含义的词(拉丁语系纯天然由空格分隔不同的word),而不同的词以不同的方式排布,可以表达不同的内容和情感,因此在很多中文任务中,我们需要做的第一个处理叫做分词

这是一个非常基础的功能,但是会较大程度影响下游任务(机器翻译、情感分析、文本理解)的效果。

目前主流的分词方法主要是基于词典匹配的分词方法(正向最大匹配法、逆向最大匹配法和双向匹配分词法等)基于统计的分词方法(HMM、CRF、和深度学习);主流的分词工具库包括 中科院计算所NLPIR、哈工大LTP、清华大学THULAC、Hanlp分词器、Python jieba工具库等。

关于分词方法和工具库更多内容可以参考知乎讨论有哪些比较好的中文分词方案

b. jieba分词的特点

c. 基本分词函数与用法

jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode)

# encoding=utf-8
import jieba

seg_list = jieba.cut("我在网易云课堂学习自然语言处理", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我在网易云课堂学习自然语言处理", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("他毕业于北京航空航天大学,在百度深度学习研究院进行研究")  # 默认是精确模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在斯坦福大学深造")  # 搜索引擎模式
print(", ".join(seg_list))

输出:
Full Mode: 我/ 在/ 网易/ 云/ 课堂/ 学习/ 自然/ 自然语言/ 语言/ 处理
Default Mode: 我/ 在/ 网易/ 云/ 课堂/ 学习/ 自然语言/ 处理
他, 毕业, 于, 北京航空航天大学, ,, 在, 百度, 深度, 学习, 研究院, 进行, 研究
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 福大, 大学, 斯坦福, 斯坦福大学, 深造

可以使用jieba.lcut以及jieba.lcut_for_search直接返回 list

print(jieba.lcut("我在网易云课堂学习自然语言处理"))
print(jieba.lcut_for_search("小明硕士毕业于中国科学院计算所,后在斯坦福大学深造"))

输出:
['我', '在', '网易', '云', '课堂', '学习', '自然语言', '处理']
['小明', '硕士', '毕业', '于', '中国', '科学', '学院', '科学院', '中国科学院', '计算', '计算所', ',', '后', '在', '福大', '大学', '斯坦福', '斯坦福大学', '深造']

d. 添加用户自定义字典

很多时候我们需要针对自己的场景进行分词,会有一些领域内的专有词汇。

print('/'.join(jieba.cut('如果放到旧字典中将出错。', HMM=False)))
# 输出: 如果/放到/旧/字典/中将/出错/。

jieba.suggest_freq(('中', '将'), True)
print('/'.join(jieba.cut('如果放到旧字典中将出错。', HMM=False)))

输出:如果/放到/旧/字典/中/将/出错/。

(2)词性标注

import jieba.posseg as pseg
words = pseg.cut("我在网易云课堂学习自然语言处理")
for word, flag in words:
    print('%s %s' % (word, flag))

输出:
我 r
在 p
网易 n
云 ns
课堂 n
学习 v
自然语言 l
处理 v

(3)关键词抽取

a. 基于 TF-IDF 算法的关键词抽取

import jieba.analyse as analyse
lines = open('data/NBA.txt', encoding='utf8').read()
print("  ".join(analyse.extract_tags(lines, topK=20, withWeight=False, allowPOS=())))

输出:
韦少 杜兰特 全明星 全明星赛 MVP 威少 正赛 科尔 投篮 勇士 球员 斯布鲁克 更衣柜 NBA 三连庄 张卫平 西部 指导 雷霆 明星队

b. 基于 TextRank 算法的关键词抽取

基本思想:
① 将待抽取关键词的文本进行分词
② 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
③ 计算图中节点的PageRank,注意是无向带权图

import jieba.analyse as analyse
lines = open('data/NBA.txt', encoding='utf8').read()
print("  ".join(analyse.textrank(lines, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))))

输出:
全明星赛 勇士 正赛 指导 对方 投篮 球员 没有 出现 时间 威少 认为 看来 结果 相隔 助攻 现场 三连庄 介绍 嘉宾

关于textrank的一些学习资料:
【1】 TextRank: Bringing Order into Texts
【2】 基于textrank的关键词抽取方法
【3】 pagerank算法核心思想
【4】 浅析PageRank算法


假期结束了,面对新的一年,你准备好了吗?

上一篇 下一篇

猜你喜欢

热点阅读