在本文中,将探讨四种流行的文本关键词提取技术:Rake、Yake、Keybert和Textrank。这些技术各有特点,适用于不同的场景和需求。将通过一个具体的科学文章摘要示例,展示如何应用这些技术来提取关键词。
预备知识
在深入探讨这些技术之前,需要具备一些Python基础知识。关键词提取是自然语言处理(NLP)领域的一个重要分支,它涉及到从文本中自动识别出重要的词汇或短语。
TFIDF方法的局限性
在之前的一篇文章中,介绍了使用TFIDF向量化器从文档中提取关键词的方法。TFIDF方法依赖于语料库统计来加权提取的关键词,因此它不适用于单个文本,这是它的一个缺点。
关键词提取方法
将使用一个已发表的科学文章的摘要,以及指定的关键词,来测试现有的各种方法,并检查哪些方法返回的关键词更接近设定的词汇。在关键词提取任务中,存在所谓的显式关键词和隐式关键词。显式关键词明确出现在文本中,而隐式关键词则是作为关键词提及,但并未在文本中明确出现,而是与领域相关。
准备文本
标题通常与提供的内容结合,因为标题包含了有价值的信息,并且简洁地反映了文章的内容。因此,将标题和文本简单地用加号连接起来:
title = "使用数据挖掘方法对文本进行向量化"
text = "在文本挖掘任务中,文本表示不仅要高效,还要可解释,因为这有助于理解数据挖掘模型背后的操作逻辑。传统的文本向量化方法,如TF-IDF和词袋模型,虽然有效且具有直观的可解释性,但它们受到“维度诅咒”的影响,无法捕捉单词的含义。另一方面,现代的分布式方法有效地捕捉了隐藏的语义,但它们计算密集、耗时且不可解释。本文提出了一种新的文本向量化方法,称为加权概念的词袋模型(BoWC),它根据文档包含的概念信息来呈现文档。该方法通过聚类词向量(即词嵌入)来创建概念,然后使用这些概念聚类的频率来表示文档向量。为了丰富结果文档表示,提出了一种新的修改过的权重函数,用于基于从词嵌入信息中提取的统计数据对概念进行加权。生成的向量具有可解释性、低维度、高准确度和低计算成本的特点,当用于数据挖掘任务时。该方法已在五个不同的基准数据集上进行了测试,并在两个数据挖掘任务中与几个基线进行了比较,包括词袋模型、TF-IDF、平均GloVe、概念袋和VLAC。结果表明,BoWC优于大多数基线,平均准确度提高了7%。"
full_text = title + ", " + text
现在将开始应用上述提到的每种方法来提取关键词。
YAKE!
YAKE!是一种轻量级、无监督的自动关键词提取方法,它依赖于从单个文档中提取的统计文本特征来识别文本中最相关的关键词。该系统不需要在特定文档集上进行训练,也不依赖于词典、文本大小、领域或语言。Yake定义了一组五个特征来捕捉关键词特征,这些特征通过启发式方法组合,为每个关键词分配一个单一的分数。分数越低,关键词越重要。
# 安装Yake!
pip install git+https://github.com/LIAAD/yake
import yake
kw_extractor = yake.KeywordExtractor(top=10,兰guage='en', stopwords=None)
keywords = kw_extractor.extract_keywords(full_text)
for kw, v in keywords:
print("Keyphrase: ",kw, ": score", v)
注意到有三个关键词与提供的词汇相同,分别是文本挖掘、数据挖掘和文本向量化方法。有趣的是,YAKE!关注大写字母,并给予以大写字母开头的词汇更多的重要性。
Rake
Rake是快速自动关键词提取的缩写,它是一种从单个文档中提取关键词的方法。它也可以很容易地应用于新领域,并且在处理需要特定语法约定的多种类型的文档时非常有效。Rake通过分析文本中单词的出现频率及其与其他单词的兼容性(共现)来识别文本中的关键短语。
# 安装multi_rake
pip install multi_rake
from multi_rake import Rake
rake = Rake()
keywords = rake.apply(full_text)
print(keywords[:10])
注意到有两个相关的关键词,即文本挖掘和数据挖掘。
# 安装summa
pip install summa
from summa import keywords
TR_keywords = keywords.keywords(full_text, scores=True)
print(TR_keywords[0:10])
# 安装keybert
pip install keybert
from keybert import KeyBERT
kw_model = KeyBERT(model='all-mpnet-base-v2')
keywords = kw_model.extract_keywords(full_text, keyphrase_ngram_range=(1, 3), stop_words='english', highlight=False, top_n=10)
keywords_list= list(dict(keywords).keys())
print(keywords_list)