分词提取关键词基本操作详解

概述

从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁.

编辑

关键词

关键词 (keywords), 即关键词语. 关键词能描述文章的本质, 在文献检索, 自动文摘, 文本聚类 / 分类等方面有着重要的应用.

编辑

关键词抽取的方法

  1. 关键词提取: 针对新文档, 通过算法分析. 提取文档中一些词语作为该文档的关键词

  1. 关键词分配: 给定已有的关键词库, 对于新来的文档从该词库里面分配几个词语作为这篇文档的关键词

TF-IDF 关键词提取

TF-IDF (Term Frequency-Inverse Document Frequency), 即词频-逆文件频率是一种用于信息检索与数据挖掘的常用加权技术. TF-IDF 可以帮助我们挖掘文章中的关键词. 通过数值统计, 反映一个词对于语料库中某篇文章的重要性.

TF

TF (Term Frequency), 即词频. 表示词在文本中出现的频率.

公式:

编辑

IDF

IDF (Inverse Document Frequency), 即逆文档频率. 表示语料库中包含词的文档的数目的倒数.

公式:

编辑

TF-IDF

公式:

编辑

TF-IDF = (词的频率 / 句子总字数) × (总文档数 / 包含该词的文档数)

如果一个词非常常见, 那么 IDF 就会很低, 反之就会很高. TF-IDF 可以帮助我们过滤常见词语, 提取关键词.

jieba TF-IDF 关键词抽取

格式:

  1. jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())

参数:

  • sentence: 待提取的文本语料

  • topK: 返回的关键词个数, 默认为 20

  • withWeight: 是否需要返回关键词权重, 默认为 False

  • allowPOS: 仅包括指定词性的词, 默认为空, 即不筛选

jieba 词性

编号

词性

描述

Ag

形语素

形容词性语素。形容词代码为 a,语素代码g前面置以A。

a

形容词

取英语形容词 adjective的第1个字母。

ad

副形词

直接作状语的形容词。形容词代码 a和副词代码d并在一起。

an

名形词

具有名词功能的形容词。形容词代码 a和名词代码n并在一起。

b

区别词

取汉字“别”的声母。

c

连词

取英语连词 conjunction的第1个字母。

dg

副语素

副词性语素。副词代码为 d,语素代码g前面置以D。

d

副词

取 adverb的第2个字母,因其第1个字母已用于形容词。

e

叹词

取英语叹词 exclamation的第1个字母。

f

方位词

取汉字“方”

g

语素

绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。

h

前接成分

取英语 head的第1个字母。

i

成语

取英语成语 idiom的第1个字母。

j

简称略语

取汉字“简”的声母。

k

后接成分

l

习用语

习用语尚未成为成语,有点“临时性”,取“临”的声母。

m

数词

取英语 numeral的第3个字母,n,u已有他用。

Ng

名语素

名词性语素。名词代码为 n,语素代码g前面置以N。

n

名词

取英语名词 noun的第1个字母。

nr

人名

名词代码 n和“人(ren)”的声母并在一起。

ns

地名

名词代码 n和处所词代码s并在一起。

nt

机构团体

“团”的声母为 t,名词代码n和t并在一起。

nz

其他专名

“专”的声母的第 1个字母为z,名词代码n和z并在一起。

o

拟声词

取英语拟声词 onomatopoeia的第1个字母。

p

介词

取英语介词 prepositional的第1个字母。

q

量词

取英语 quantity的第1个字母。

r

代词

取英语代词 pronoun的第2个字母,因p已用于介词。

s

处所词

取英语 space的第1个字母。

tg

时语素

时间词性语素。时间词代码为 t,在语素的代码g前面置以T。

t

时间词

取英语 time的第1个字母。

u

助词

取英语助词 auxiliary

vg

动语素

动词性语素。动词代码为 v。在语素的代码g前面置以V。

v

动词

取英语动词 verb的第一个字母。

vd

副动词

直接作状语的动词。动词和副词的代码并在一起。

vn

名动词

指具有名词功能的动词。动词和名词的代码并在一起。

w

标点符号

x

非语素字

非语素字只是一个符号,字母 x通常用于代表未知数、符号。

y

语气词

取汉字“语”的声母。

z

状态词

取汉字“状”的声母的前一个字母。

un

未知词

不带关键词权重

例子:

  1. import jieba.analyse

  1. # 定义文本

  1. text = "自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。" \

  1. "它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。" \

  1. "自然语言处理是一门融语言学、计算机科学、数学于一体的科学。" \

  1. "因此,这一领域的研究将涉及自然语言,即人们日常使用的语言," \

  1. "所以它与语言学的研究有着密切的联系,但又有重要的区别。" \

  1. "自然语言处理并不是一般地研究自然语言," \

  1. "而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。" \

  1. "因而它是计算机科学的一部分"

  1. # 提取关键词

  1. keywords = jieba.analyse.extract_tags(text, topK=20, withWeight=False)

  1. # 调试输出

  1. print([i for i in keywords])

输出结果:

  1. Building prefix dict from the default dictionary ...

  1. Loading model from cache C:\Users\Windows\AppData\Local\Temp\jieba.cache

  1. Loading model cost 0.890 seconds.

  1. Prefix dict has been built successfully.

  1. ['自然语言', '计算机科学', '语言学', '研究', '领域', '处理', '通信', '有效', '软件系统', '人工智能', '实现', '计算机系统', '重要', '一体', '一门', '日常', '计算机', '密切', '数学', '研制']

附带关键词权重

  1. import jieba.analyse

  1. # 定义文本

  1. content = "自然语言处理是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言处理包括多方面和步骤,基本有认知、理解、生成等部分。"

  1. # 定义文本

  1. text = "自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。" \

  1. "它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。" \

  1. "自然语言处理是一门融语言学、计算机科学、数学于一体的科学。" \

  1. "因此,这一领域的研究将涉及自然语言,即人们日常使用的语言," \

  1. "所以它与语言学的研究有着密切的联系,但又有重要的区别。" \

  1. "自然语言处理并不是一般地研究自然语言," \

  1. "而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。" \

  1. "因而它是计算机科学的一部分"

  1. # 提取关键词 (带权重)

  1. keywords = jieba.analyse.extract_tags(text, topK=20, withWeight=True)

  1. # 调试输出

  1. print([i for i in keywords])

输出结果:

  1. Building prefix dict from the default dictionary ...

  1. Loading model from cache C:\Users\Windows\AppData\Local\Temp\jieba.cache

  1. Loading model cost 1.110 seconds.

  1. Prefix dict has been built successfully.

  1. [('自然语言', 1.1237629576061539), ('计算机科学', 0.4503481350267692), ('语言学', 0.27566262244215384), ('研究', 0.2660770221507693), ('领域', 0.24979825580353845), ('处理', 0.24973179957046154), ('通信', 0.2043557391963077), ('有效', 0.16296019853692306), ('软件系统', 0.16102600688461538), ('人工智能', 0.14550809839215384), ('实现', 0.14389939312584615), ('计算机系统', 0.1402028601413846), ('重要', 0.12347581087876922), ('一体', 0.11349408224353846), ('一门', 0.11300493477184616), ('日常', 0.10913612756276922), ('计算机', 0.1046889912443077), ('密切', 0.10181409957492307), ('数学', 0.10166677655076924), ('研制', 0.09868653898630769)]

TextRank

TextRank 通过词之间的相邻关系构建网络,然后用PageRank 迭代计算每个节点的 rank 值. 排序 rank值即可得到关键词.

  1. import jieba.analyse

  1. # 定义文本

  1. content = "自然语言处理是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言处理包括多方面和步骤,基本有认知、理解、生成等部分。"

  1. # 定义文本

  1. text = "自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。" \

  1. "它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。" \

  1. "自然语言处理是一门融语言学、计算机科学、数学于一体的科学。" \

  1. "因此,这一领域的研究将涉及自然语言,即人们日常使用的语言," \

  1. "所以它与语言学的研究有着密切的联系,但又有重要的区别。" \

  1. "自然语言处理并不是一般地研究自然语言," \

  1. "而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。" \

  1. "因而它是计算机科学的一部分"

  1. # TextRank提取关键词

  1. keywords = jieba.analyse.textrank(text, topK=20, withWeight=False)

  1. # 调试输出

  1. print([i for i in keywords])

调试输出:

  1. Building prefix dict from the default dictionary ...

  1. Loading model from cache C:\Users\Windows\AppData\Local\Temp\jieba.cache

  1. ['研究', '领域', '计算机科学', '实现', '处理', '语言学', '数学', '人们', '计算机', '涉及', '有着', '一体', '方法', '语言', '研制', '使用', '人工智能', '在于', '联系', '科学']

  1. Loading model cost 1.062 seconds.

  1. Prefix dict has been built successfully.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很抱歉,jieba分词器是Python中的中文分词工具,Java中并没有直接使用jieba的方法。不过Java中也有很多优秀的中文分词工具,比如ansj、HanLP等。这里以ansj为例,介绍如何在Java中使用中文分词工具提取关键词。 首先,需要在Java项目中引入ansj分词器的jar包。然后,可以按照以下步骤使用ansj分词提取关键词: 1. 导入ansj分词器的相关类: ```java import org.ansj.domain.Result; import org.ansj.splitWord.analysis.ToAnalysis; import org.ansj.util.FilterModifWord; ``` 2. 调用ToAnalysis.parse()方法对文本进行分词: ```java String text = "这是一段待分词的文本"; Result result = ToAnalysis.parse(text); ``` 3. 调用FilterModifWord.insertStopWords()方法添加停用词(可选): ```java FilterModifWord.insertStopWords(Arrays.asList("的", "是", "一", "段")); ``` 4. 调用FilterModifWord.modifResult()方法过滤分词结果: ```java result = FilterModifWord.modifResult(result); ``` 5. 遍历分词结果,提取关键词: ```java List<String> keywords = new ArrayList<>();for (int i = 0; i < result.size(); i++) { String word = result.get(i).getName(); String natureStr = result.get(i).getNatureStr(); if (!natureStr.startsWith("w")) { // 过滤掉标点符号 keywords.add(word); } } ``` 以上就是使用ansj分词器在Java中提取关键词的步骤。需要注意的是,ansj分词器默认使用的是基于词典的分词方式,对于一些新词或专有名词可能无法很好地识别,需要手动添加词典或调整分词规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚爱吃大蒜的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值