关键词提取就是从文本里面把跟这篇文章意义最相关的一些词语抽取出来。这个可以追溯到文献检索初期,关键词是为了文献标引工作,从报告、论文中选取出来用以表示全文主题内容信息的单词或术语,在现在的报告和论文中,我们依然可以看到关键词这一项。因此,关键词在文献检索、自动文摘、文本聚类/分类等方面有着重要的应用,它不仅是进行这些工作不可或缺的基础和前提,也是互联网上信息建库的一项重要工作。
关键词抽取从方法来说主要有两种:
1、第一种是关键词分配:就是给定一个已有的关键词库,对于新来的文档从该词库里面匹配几个词语作为这篇文档的关键词。
2、第二种是关键词提取:针对新文档,通过算法分析,提取文档中一些词语作为该文档的关键词。
目前大多数应用领域的关键词抽取算法都是基于后者实现的,从逻辑上说,后者比前者在实际应用中更准确。
下面介绍一些关于关键词抽取的常用和经典的算法实现。
在信息检索理论中,TF-IDF 是 Term Frequency - Inverse Document Frequency 的简写。TF-IDF 是一种数值统计,用于反映一个词对于语料中某篇文档的重要性。在信息检索和文本挖掘领域,它经常用于因子加权。TF-IDF 的主要思想就是:如果某个词在一篇文档中出现的频率高,也即 TF 高;并且在语料库中其他文档中很少出现,即 DF 低,也即 IDF 高,则认为这个词具有很好的类别区分能力。
jieba 已经实现了基于 TF-IDF 算法的关键词抽取,通过代码 import jieba.analyse 引入,函数参数解释如下:
sentence:待提取的文本语料;
topK:返回 TF/IDF 权重最大的关键词个数,默认值为 20;
withWeight:是否需要返回关键词权重值,默认值为 False;
allowPOS:仅包括指定词性的词,默认值为空,即不筛选。
接下来看例子,我采用的语料来自于百度百科对人工智能的定义,获取 Top20 关键字,用空格隔开打印:
import jieba.analyse
sentence = "人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。2017年12月,人工智能入选“2017年度中国媒体十大流行语”。"
keywords = " ".join(jieba.analyse.extract_tags(sentence , topK=20, withWeight=False, allowPOS=()))
print(keywords)
执行结果:
人工智能 智能 2017 机器 不同 人类 科学 模拟 一门 技术 计算机 研究 工作 Artificial Intelligence AI 图像识别 12 复杂 流行语
下面只获取 Top10 的关键字,并修改一下词性,只选择名词和动词,看看结果有何不同?
keywords =(jieba.analyse.extract_tags(sentence , topK=10, withWeight=True, allowPOS=(['n','v'])))
print(keywords)
执行结果:
[(‘人工智能’, 0.9750542675762887), (‘智能’, 0.5167124540885567), (‘机器’, 0.20540911929525774), (‘人类’, 0.17414426566082475), (‘科学’, 0.17250169374402063), (‘模拟’, 0.15723537382948452), (‘技术’, 0.14596259315164947), (‘计算机’, 0.14030483362639176), (‘图像识别’, 0.12324502580309278), (‘流行语’, 0.11242211730309279)]
TextRank 是由 PageRank 改进而来,核心思想将文本中的词看作图中的节点,通过边相互连接,不同的节点会有不同的权重,权重高的节点可以作为关键词。
同样 jieba 已经实现了基于 TextRank 算法的关键词抽取,通过代码 import jieba.analyse 引用,函数参数解释如下:
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
直接使用,接口参数同 TF-IDF 相同,注意默认过滤词性。
接下来,我们继续看例子,语料继续使用上例中的句子。
result = " ".join(jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')))
print(result)
执行结果:
智能 人工智能 机器 人类 研究 技术 模拟 包括 科学 工作 领域 理论 计算机 年度 需要 语言 相似 方式 做出 心理学
如果修改一下词性,只需要名词和动词,看看结果有何不同?
result = " ".join(jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('n','v')))
print(result)
执行结果:
智能 人工智能 机器 人类 技术 模拟 包括 科学 理论 计算机 领域 年度 需要 心理学 信息 语言 识别 带来 过程 延伸
除了 jieba,也可以选择使用 HanLP 来完成关键字提取,内部采用 TextRankKeyword 实现,语料继续使用上例中的句子。
from pyhanlp import *
result = HanLP.extractKeyword(sentence, 20)
print(result)
执行结果:
[人工智能, 智能, 领域, 人类, 研究, 不同, 工作, 包括, 模拟, 新的, 机器, 计算机, 门, 科学, 应用, 系统, 理论, 技术, 入选, 复杂]