Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Jieba中文分词 (二) ——词性标注与关键词提取

Jieba中文分词 (二) ——词性标注与关键词提取

作者头像
数据STUDIO
发布于 2021-06-24 03:24:56
发布于 2021-06-24 03:24:56
8.2K00
代码可运行
举报
文章被收录于专栏:数据STUDIO数据STUDIO
运行总次数:0
代码可运行

jieba分词

上一篇jieba中文分词(一)分词与自定义字典已介绍了jieba中文分词安装,分词原理,分词方法,自定义字典,添加字典等多种常用分词方法。本篇将继续介绍jieba分词关键词提取、词性标注、及常见问题。

关键词提取

关键词提取,将文本中最能表达文本含义的词语抽取出来,有点类似于论文的关键词或者摘要。关键词抽取可以采取:

  • 有监督学习: 文本作为输入,关键词作为标注,进行训练得到模型。此方法难点在于需要大量人工标注。
  • 无监督学习: 先抽取出候选词,对每个候选词打分,取出前K个分值高的作为最后的关键词。jieba分词实现了基于TF-IDF和基于TextRank的关键词抽取算法。
基于 TF-IDF 算法的关键词抽取

基于TF-IDF的关键词抽取算法,目标是获取文本中词频高,也就是TF大的,且语料库其他文本中词频低的,也就是IDF大的。这样的词可以作为文本的标志,用来区分其他文本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jieba.analyse
jieba.analyse.extract_tags(sentence, 
              topK=20, 
              withWeight=False, 
              allowPOS=())

sentence: 为待提取的文本 topK: 为返回几个 TF/IDF 权重最大的关键词,默认值为 20 withWeight: 为是否一并返回关键词权重值,默认值为 False allowPOS: 仅包括指定词性的词,默认值为空,即不筛选

代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jieba
import jieba.analyse

topK = 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 算法的关键词抽取
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,它表示一个窗口中有多少个词语。
  • 对节点根据入度节点个数以及入度节点权重进行打分,入度节点越多,且入度节点权重大,则打分高。
  • 然后根据打分进行降序排列,输出指定个数的关键词。
代码示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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模式下的词性标注功能。

代码示例:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 x Paddle 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

默认模式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

搜索模式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 jiebajieba.Tokenizer() 不会立即触发词典的加载,一旦有必要才开始加载词典构建前缀字典。如果你想手工初始 jieba,也可以手动初始化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jieba
jieba.initialize()  # 手动初始化(可选)

有了延迟加载机制后,你可以改变主词典的路径:

  • 下载你所需要的词典,然后覆盖 jieba/dict.txt 即可;
  • 或者用:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jieba.set_dictionary('data/dict.txt.big')

常见问题

  1. “台中”总是被切成“台 中”?(以及类似情况)

P(台中) < P(台)×P(中),“台中”词频不够导致其成词概率较低

解决方法:强制调高词频

jieba.add_word('台中') 或者 jieba.suggest_freq('台中', True)

  1. “今天天气 不错”应该被切成“今天 天气 不错”?(以及类似情况)

解决方法:强制调低词频

jieba.suggest_freq(('今天', '天气'), True)

或者直接删除该词 jieba.del_word('今天天气')

  1. 切出了词典中没有的词语,效果不理想?

解决方法:关闭新词发现

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据STUDIO 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自然语言处理NLP(一)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
村雨遥
2019/09/09
1.3K0
自然语言处理NLP(一)
NLP基本工具之jieba:关键词提取、词性标注
jieba除了上一篇介绍的基本功能--分词之外,还可以进行关键词提取以及词性标注。
用户7164815
2020/04/26
3.2K0
基于jieba库实现中文词频统计
要实现中文分词功能,大家基本上都是在使用 jieba 这个库来实现,下面就看看怎样实现一个简单文本分词功能。
kongxx
2018/12/27
2.7K0
python+gensim︱jieba分词、词袋doc2bow、TFIDF文本挖掘
本文主要介绍了如何使用Python的gensim库对中文文本进行分词和建立词袋模型。首先介绍了Gensim库的安装和配置,然后通过一个示例文本展示了如何使用Gensim库对文本进行分词和建立词袋模型。最后介绍了如何使用Gensim库中的TF-IDF模型进行相似性检索。
悟乙己
2018/01/02
7.2K0
中文NLP笔记:3. 关键词提取的几个方法
  TF-IDF :用于反映一个词对于某篇文档的重要性。过滤掉常见的词语,保留重要的词语
杨熹
2019/01/28
3.6K0
中文NLP笔记:3. 关键词提取的几个方法
python jieba分词(结巴分词)、提取词,加载词,修改词频,定义词库
“结巴”中文分词:做最好的 Python 中文分词组件,分词模块jieba,它是python比较好用的分词模块, 支持中文简体,繁体分词,还支持自定义词库。 jieba的分词,提取关键词,自定义词语。 结巴分词的原理 这里写链接内容 一、 基于结巴分词进行分词与关键词提取 1、jieba.cut分词三种模式 jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型 jieba.cut_for
学到老
2018/03/19
20.5K0
python jieba分词(结巴分词)、提取词,加载词,修改词频,定义词库
关于自然语言处理系列-关键词提取
自然语言处理包括中文分词、词性标注、关键词抽取、依存句法分析、文本分类接口情感分析、词义相似度计算、实体标识、文本摘要等等,慢慢来吧,看看一步步能到什么程度。本文实现的是关键词提取。
python与大数据分析
2022/03/11
4890
关于自然语言处理系列-关键词提取
jieba库的用法
“Jieba” (Chinese for “to stutter”) Chinese text segmentation: built to be the best Python Chinese word segmentation module.
全栈程序员站长
2022/09/29
8590
初学者|知否?知否?一文学会Jieba使用方法
我始终觉得,入门学习一件事情最好的方式就是实践,加之现在python如此好用,有越来越多的不错nlp的python库,所以接下来的一段时间里,让我们一起来感受一下这些不错的工具。后面代码我均使用jupyter编辑。先来罗列一波:jieba、hanlp、snownlp、Stanfordcorenlp、spacy、pyltp、nltk、Textblob等等…今天从jieba开始吧,let's begin。
yuquanle
2019/05/29
4670
明月机器学习实践034:基于结巴的关键词提取及优化思路
前几天对一个系统的关键词抽取做了简单的优化,实现方式非常简单,就是使用结巴工具。例如下面一段话(截取实际文本中的一段):
明月AI
2021/10/28
7620
明月机器学习实践034:基于结巴的关键词提取及优化思路
数学建模学习笔记(七)TF-IDF算法提取关键词
TF-IDF算法数学表达: 术语频率(TF)是指给定单词在文档中出现的次数,经过归一化后,我们可以用以下公式表示:
zstar
2022/06/14
3780
【编程课堂】jieba-中文分词利器
0、前言 在之前的文章【编程课堂】词云 wordcloud 中,我们曾使用过 jieba 库,当时并没有深入讲解,所以本次将其单独列出来详细讲解。 jieba库是进行中文分词的利器,根据文档描述,具有以下特点: 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析; 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义; 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词 支持繁体分词 支持自定义词典 本文立足实际需求,提取出部分常用的
Crossin先生
2018/04/17
9010
Python实现jieba对文本分词并写入新的文本文件,然后提取出文本中的关键词
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
村雨遥
2019/09/09
5.2K0
使用python 的结巴(jieba)库进行中文分词
“结巴”中文分词:做最好的 Python 中文分词组件 "Jieba" (Chinese for "to stutter") Chinese text segmentation: built to be the best Python Chinese word segmentation module. 功能参数: jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型 jieba.cut_for_search
机器学习AI算法工程
2018/03/14
1.1K0
Serverless 实战:如何结合 NLP 实现文本摘要和关键词提取?
对文本进行自动摘要的提取和关键词的提取,属于自然语言处理的范畴。提取摘要的一个好处是可以让阅读者通过最少的信息判断出这个文章对自己是否有意义或者价值,是否需要进行更加详细的阅读;而提取关键词的好处是可以让文章与文章之间产生关联,同时也可以让读者通过关键词快速定位到和该关键词相关的文章内容。 文本摘要和关键词提取都可以和传统的 CMS 进行结合,通过对文章 / 新闻等发布功能进行改造,同步提取关键词和摘要,放到 HTML 页面中作为 Description 和 Keyworks。这样做在一定程度上有利于搜索
腾讯云serverless团队
2020/06/06
1.3K0
结巴分词原理及使用「建议收藏」
目前常用的分词工具很多,包括盘古分词、Yaha分词、Jieba分词、清华THULAC等,现在项目使用的分词方法是结巴分词,本次来介绍一下。
全栈程序员站长
2022/07/04
2.4K0
结巴分词原理及使用「建议收藏」
实战关键词提取
关键词是代表文章重要内容的一组词,在文献检索、自动文摘、文本聚类/分类等方面有着重要的应用。现实中大量的文本不包含关键词,这使得便捷获取文本信息更困难,所以自动提取关键词技术具有重要的价值和意义。
伊泽瑞尔
2022/05/31
8400
实战关键词提取
NLP之tfidf与textrank算法细节对比基于结巴分词
-NLP之tfidf与textrank算法细节对比 注:结巴默认在site-packages目录 关于结巴分词的添加停用词以及增加词相关操作可参考之前的博客,这里重点说下结巴关键词提取的两个算法 1.tfidf算法 官方文档如下: extract_tags(sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False) method of jieba.analyse.tfidf.TFIDF instance Extra
学到老
2018/03/19
2.3K0
NLP笔记:中文分词工具简介
不同于英文等语言中天然的以空格为分隔的分词方式,中文的分词本身就需要针对语意进行理解,这使得其分词便成为了一个复杂的问题。
codename_cys
2021/03/28
5.2K0
NLP-结巴分词
结巴分词是有国内程序员(https://github.com/fxsjy/jieba)做的一个分词工具,刚开始是Python版本的,后来由anderscui(https://github.com/anderscui/jieba.NET )移植到.Net上面。
全栈程序员站长
2022/09/12
7150
NLP-结巴分词
推荐阅读
相关推荐
自然语言处理NLP(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验