网易云课堂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)
jieba.cut 方法接受三个输入参数:
① 需要分词的字符串
② cut_all 参数用来控制是否采用全模式
③ HMM 参数用来控制是否使用 HMM 模型jieba.cut_for_search 方法接受两个参数:
① 需要分词的字符串
② 是否使用 HMM 模型。
该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。
# 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. 添加用户自定义字典
很多时候我们需要针对自己的场景进行分词,会有一些领域内的专有词汇。
- 可以用jieba.load_userdict(file_name)加载用户字典
- 少量的词汇可以自己用下面方法手动添加:
① 用 add_word(word, freq=None, tag=None) 和 del_word(word) 在程序中动态修改词典
② 用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
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
- jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
- sentence 为待提取的文本
- topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
- withWeight 为是否一并返回关键词权重值,默认值为 False
- allowPOS 仅包括指定词性的词,默认值为空,即不筛选
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,注意是无向带权图
- jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。
- jieba.analyse.TextRank() 新建自定义 TextRank 实例
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算法
假期结束了,面对新的一年,你准备好了吗?