Jieba中文分词 (二) ——词性标注与关键词提取
jieba分词
上一篇jieba中文分词(一)分词与自定义字典已介绍了jieba中文分词安装,分词原理,分词方法,自定义字典,添加字典等多种常用分词方法。本篇将继续介绍jieba分词关键词提取、词性标注、及常见问题。
关键词提取
关键词提取,将文本中最能表达文本含义的词语抽取出来,有点类似于论文的关键词或者摘要。关键词抽取可以采取:
有监督学习:
文本作为输入,关键词作为标注,进行训练得到模型。此方法难点在于需要大量人工标注。无监督学习:
先抽取出候选词,对每个候选词打分,取出前K个分值高的作为最后的关键词。jieba分词实现了基于TF-IDF和基于TextRank的关键词抽取算法。
基于 TF-IDF 算法的关键词抽取
基于TF-IDF的关键词抽取算法,目标是获取文本中词频高,也就是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
import jieba.analysetopK = 5
file_name = 'test.txt'
"""
test.txt
西三旗硅谷先锋小区半地下室出租,便宜可合租硅谷
工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作
"""
with open(file_name, 'rb') as f:content = f.read()tags = jieba.analyse.extract_tags(content, topK=topK)
print(", ".join(tags))
print('*'*40)# 关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径
jieba.analyse.set_idf_path("../extra_dict/idf.txt.big");
tags = jieba.analyse.extract_tags(content, topK=topK)
print(", ".join(tags))
print('*'*40)# 关键词提取所使用停止词文本语料库可以切换成自定义语料库的路径
jieba.analyse.set_stop_words("../extra_dict/stop_words.txt")
jieba.analyse.set_idf_path("../extra_dict/idf.txt.big");
tags = jieba.analyse.extract_tags(content, topK=topK)
print(", ".join(tags))
print('*'*40)# 关键词一并返回关键词权重值示例
withWeight = True
tags = jieba.analyse.extract_tags(content, topK=topK, withWeight=withWeight)
for tag in tags:print("tag: %s\t\t weight: %f" % (tag[0],tag[1]))
硅谷, 西三旗, 工信处, 女干事, 24
硅谷, 西三旗, 先锋, 小区, 合租
硅谷, 西三旗, 先锋, 小区, 合租tag: 硅谷 weight: 1.039545
tag: 西三旗 weight: 0.519773
tag: 先锋 weight: 0.519773
tag: 小区 weight: 0.519773
tag: 合租 weight: 0.519773
基于 TextRank 算法的关键词抽取
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
sentence: 为待提取的文本
topK: 为返回几个权重最大的关键词,默认值为 20
withWeight: 为是否一并返回关键词权重值,默认值为 False
allowPOS: 仅包括指定词性的词,默认过滤词性
算法论文:TextRank: Bringing Order into Texts[1]
一般步骤:
先将文本进行分词和词性标注,将特定词性的词(比如名词)作为节点添加到图中。
出现在一个窗口中的词语之间形成一条边,窗口大小可设置为2~10之间,默认为5,它表示一个窗口中有多少个词语。
对节点根据入度节点个数以及入度节点权重进行打分,入度节点越多,且入度节点权重大,则打分高。
然后根据打分进行降序排列,输出指定个数的关键词。
代码示例:
tags = jieba.analyse.textrank(content, topK=5, withWeight=True)
for tag in tags:print("tag: %s\t\t weight: %f" % (tag[0],tag[1]))
tag: 硅谷 weight: 1.000000
tag: 女干事 weight: 0.847395
tag: 技术性 weight: 0.800966
tag: 器件 weight: 0.794530
tag: 交换机 weight: 0.766318
词性标注
通过查询字典的方式获取识别词的词性,通过HMM隐马尔科夫模型来获取未登录词的词性,从而完成整个语句的词性标注。但可以看到查询字典的方式不能解决一词多词性的问题,也就是词性歧义问题。故精度上还是有所欠缺的。
标注句子分词后每个词的词性,词性标示兼容ICTCLAS 汉语词性标注集。
除了jieba默认分词模式,提供paddle模式下的词性标注功能。
代码示例:
import jieba
import jieba.posseg as pseg
jieba.add_word('数据STUDIO')words = pseg.cut("我关注了微信公众号数据STUDIO")
print('jieba默认模式')
for word, flag in words:print('%s %s' % (word, flag))
print('+'*10)
jieba.enable_paddle() #启动paddle模式。
words = pseg.cut("我关注了微信公众号数据STUDIO",use_paddle=True) #paddle模式
print('paddle模式')
for word, flag in words:print('%s %s' % (word, flag))
print('+'*10)
jieba默认模式
我 r
关注 v
了 ul
微信 vn
公众 n
号 m
数据STUDIO xPaddle enabled successfully......
paddle模式
我 r
关注 v
了 u
微信公众号数据STUDIO nz
默认模式词性和专名类别标签集合如下表。
(↔️滑动)
标签 | 含义 | 标签 | 含义 | 标签 | 含义 | 标签 | 含义 |
---|---|---|---|---|---|---|---|
n | 名词 | f | 方位词 | al | 形容词性惯用语 | m | 数词 |
nr | 人名 | v | 动词 | b | 区别词 | mq | 数量词 |
nr1 | 汉语姓氏 | vd | 副动词 | bl | 区别词性惯用语 | q | 量词 |
nr2 | 汉语名字 | vn | 名动词 | z | 状态词 | qv | 动量词 |
nrj | 日语人名 | vshi | 动词“是” | r | 代词 | qt | 时量词 |
nrf | 音译人名 | vyou | 动词“有” | rr | 人称代词 | d | 副词 |
ns | 地名 | vf | 趋向动词 | rz | 指示代词 | p | 介词 |
nsf | 音译地名 | vx | 形式动词 | rzt | 时间指示代词 | pba | 介词“把” |
nt | 机构团体名 | vi | 不及物动词(内动词) | rzs | 处所指示代词 | pbei | 介词“被” |
nz | 其它专名 | vl | 动词性惯用语 | rzv | 谓词性指示代词 | c | 连词 |
nl | 名词性惯用语 | vg | 动词性语素 | ry | 疑问代词 | cc | 并列连词 |
ng | 名词性语素 | a | 形容词 | ryt | 时间疑问代词 | cc | 并列连词 |
t | 时间词 | ad | 副形词 | rys | 处所疑问代词 | ||
tg | 时间词性语素 | an | 名形词 | ryv | 谓词性疑问代词 | ||
s | 处所词 | ag | 形容词性语素 | rg | 代词性语素 |
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 | 时间 |
并行分词
原理:将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升。
基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows。
jieba.enable_parallel(4)
开启并行分词模式,参数为并行进程数jieba.disable_parallel()
关闭并行分词模式
Tokenize:返回词语在原文的起止位置
注意,输入参数只接受 unicode
默认模式
import jieba
import jieba.posseg as pseg
from prettytable import PrettyTable
jieba.add_word('数据STUDIO')
jieba.add_word('微信公众号')
result = jieba.tokenize(u'我关注了微信公众号数据STUDIO')x = PrettyTable(["word", "start", "end"])
x.align["word"] = "l"# 左对齐
x.padding_width = 2 # 列边和内容之间有两个空格(默认为一个空格)
for tk in result:x.add_row([tk[0], tk[1], tk[2]])
print(x)
word | start | end |
---|---|---|
我 | 0 | 1 |
关注 | 1 | 3 |
了 | 3 | 4 |
微信公众号 | 4 | 9 |
数据STUDIO | 9 | 17 |
搜索模式
result = jieba.tokenize(u'我关注了微信公众号数据STUDIO', mode='search')
x = PrettyTable(["word", "start", "end"])
x.align["word"] = "l"# 左对齐
x.padding_width = 2 # 列边和内容之间有两个空格(默认为一个空格)
for tk in result:x.add_row([tk[0], tk[1], tk[2]])
print(x)
word | start | end |
---|---|---|
我 | 0 | 1 |
关注 | 1 | 3 |
了 | 3 | 4 |
公众 | 6 | 8 |
微信公众号 | 4 | 9 |
数据 | 9 | 11 |
数据STUDIO | 9 | 17 |
延迟加载机制
jieba 采用延迟加载,import jieba
和 jieba.Tokenizer()
不会立即触发词典的加载,一旦有必要才开始加载词典构建前缀字典。如果你想手工初始 jieba,也可以手动初始化。
import jieba
jieba.initialize() # 手动初始化(可选)
有了延迟加载机制后,你可以改变主词典的路径:
下载你所需要的词典,然后覆盖 jieba/dict.txt 即可;
或者用:
jieba.set_dictionary('data/dict.txt.big')
常见问题
“台中”总是被切成“台 中”?(以及类似情况)
P(台中) < P(台)×P(中),“台中”词频不够导致其成词概率较低
解决方法:强制调高词频
jieba.add_word('台中')
或者 jieba.suggest_freq('台中', True)
“今天天气 不错”应该被切成“今天 天气 不错”?(以及类似情况)
解决方法:强制调低词频
jieba.suggest_freq(('今天', '天气'), True)
或者直接删除该词 jieba.del_word('今天天气')
切出了词典中没有的词语,效果不理想?
解决方法:关闭新词发现
jieba.cut('丰田太省了', HMM=False)
jieba.cut('我们中出了一个叛徒', HMM=False)
更多问题[2]
参考资料
[1]
TextRank算法论文: http://web.eecs.umich.edu/~mihalcea/papers/mihalcea.emnlp04.pdf
[2]
更多问题: https://github.com/fxsjy/jieba/issues?sort=updated&state=closed
-- 数据STUDIO --
Jieba中文分词 (二) ——词性标注与关键词提取相关推荐
- 实现中文分词、词性标注、关键词提取、句法分析等智能预处理
实现中文分词.词性标注.关键词提取.句法分析等智能预处理的一个简单的小实验作业 实验报告 一.实验目的 二.实验环境 三. 实验内容(内容以txt1分析为例) 1.文本素材自动分词 (1)分词初步处理 ...
- 自然语言处理NLP中文分词,词性标注,关键词提取和文本摘要
NLP相关工具包的介绍 1.1 jieba "结巴"中文分词,理念是做最好的 Python 中文分词组件. 支持三种分词模式: (1)精确模式,试图将句子最精确地切开,适合文本分析 ...
- NLP学习笔记 01 分词、词性标注和关键词提取
目录 1.1 准确分词 level1 使用jieba自定义词典 + 正则表达式准确分词 1.2 准确分词 level2 1.3 词性标注 1.4 关键词提取 1.1 准确分词 level1 中文自动分 ...
- python--jieba分词、词性标注、关键词提取、添加自定义词典完整代码示例
jieba 是目前最好的 Python 中文分词组件,它主要有以下 3 种特性: 支持 3 种分词模式:精确模式.全模式.搜索引擎模式 支持繁体分词 支持自定义词典 1 分词 可使用 jieba. ...
- 文本分析--jieba中文分词
分词技术可以分为英文分词和中文分词: 对于英文分词而言,由于英文单词之间以空格来分隔,所以在进行英文分词的过程中,只需要针对空格进行划分就可以了. 对于中文分词而言,中文单词之 ...
- 创新工场提出中文分词和词性标注模型,性能分别刷新五大数据集| ACL 2020
出品 | AI科技大本营(ID:rgznai100) 中文分词和词性标注是中文自然语言处理的两个基本任务.尽管以BERT为代表的预训练模型大行其道,但事实上,中文中基于全词覆盖 (whole word ...
- 自然语言处理(NLP)之pyltp的介绍与使用(中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注)
pyltp的简介 语言技术平台(LTP)经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广, 是国内外最具影响力的中文处理基础平台.它提供的功能包括中文分词.词性标注.命名实体识别.依 ...
- 中文分词最佳记录刷新了,两大模型分别解决中文分词及词性标注问题丨已开源...
伊瓢 发自 中关村 量子位 报道 | 公众号 QbitAI 中文分词的最佳效果又被刷新了. 在今年的ACL 2020上,来自创新工场大湾区人工智能研究院的两篇论文中的模型,刷新了这一领域的成绩. WM ...
- 中文分词_中文分词最佳纪录刷新,两大模型分别解决中文分词及词性标注问题...
伊瓢 发自 中关村 量子位 报道 | 公众号 QbitAI 中文分词的最佳效果又被刷新了. 在今年的ACL 2020上,来自创新工场大湾区人工智能研究院的两篇论文中的模型,刷新了这一领域的成绩. WM ...
- 中文处理工具fastHan 2.0:支持中文分词、词性标注、命名实体识别、依存语法分析、中文AMR的强有力工具
fastHan 简介 fastHan是基于fastNLP与pytorch实现的中文自然语言处理工具,像spacy一样调用方便. 其内核为基于BERT的联合模型,其在15个语料库中进行训练,可处理中文分 ...
最新文章
- 如何参与一个顶级开源项目
- 用Unity快速开发太空飞机大战游戏实战经验分享(上)
- 线程:CountDownLatch同步工具
- python3.6.5怎么下载_windows下如何下载并安装Python 3.6.4 ?
- css伪类元素加在元素前,CSS伪类:before在元素之前 :after 在元素之后实例讲解
- 深入浅出TCPIP之实战篇—用c++开发一个http服务器(二十一)
- java int字母,从Java中获取int,也包含字母
- NeurIPS’20 | 长尾问题太严重?半监督和自监督就可以有效缓解!
- stm32 ISP串口下载
- Saturn分布式调度之系统架构简介
- day6面向对象--继承、多态
- Expected authority at index 7: hdfs://
- bezier 曲线的基本性质包括证明
- Ubuntu系统实现简单c语言编程
- ElasticSearch配合mysql实现同义词热更新
- AutoCAD 2007打开慢
- angularjs1-3,工具方法,bootstrap,多个module,引入jquery
- 狂野飙车8服务器在哪个文件夹,狂野飙车8数据包放哪?安卓版数据包路径介绍
- 使用Python Openssl库解析X509证书信息
- SQL Server 2012 SP1 补丁发布
热门文章
- 63 Defi过后,人生第一次玩DAO----超级君【2020-08-22 2234】
- 下载和安装MyEclipse2014
- 2012百公里毅行——长沙,湘潭,株洲
- c 语言中古括号,上古韵部与中古韵部对照表
- 安装linux ubuntu11系统时,应该如何选择键盘布局,在ubuntu上创建新键盘布局需要哪些步骤?...
- 计算机系统与外部交换信息主要通过显示器,微机系统与外部交换信息主要通过什么设备...
- 小米4c怎么添加语言怎么设置在哪个文件夹,小米4c怎么插卡 小米4c插卡方法【详细步骤】...
- Zookeeper + ActiveMQ 集群整合
- 金盘系统无法连接服务器,西数金盘Gold系列主要面向企业级服务器及存储系统...
- Android 各版本gradle下载地址