R语言自然语言处理:关键词提取(TF-IDF)

本文介绍了如何使用R语言的TF-IDF算法进行关键词提取。通过引入TF-IDF的基本思想,展示了在R环境中实现分词、计算TF-IDF值以及提取关键词的过程,强调了中文分词和IDF词库的重要性。文章还讨论了TF-IDF的局限性,如需要完整语料库支持,并提出了自定义IDF库的建议。
摘要由CSDN通过智能技术生成

640?wx_fmt=png

作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。

邮箱:huang.tian-yuan@qq.com


本文希望诠释如何利用TF-IDF方法对文本中的关键词进行提取。关键词提取的输入是一大段文本材料,输出是少数的关键词。比如我们日常看的论文,会有关键词。但是这些一般都是作者自己根据文章内容,向杂志社提供的关键词。事实上,如果有了正文的文本,我们完全可以利用计算机自动提取关键词(在一些数据库中,这些关键词的名称叫做Index Keywords,即索引关键词,区别于作者关键词Author Keywords)。

从海量的文本文档中,提取少量表征其内容的关键词,这就是关键词提取的主要任务。掌握了这项技能,能够自动化地给文本贴标签,非常有用。根据大部分从业者和学界的实践证明,TF-IDF算法能够解决大部分的关键词抽取场景,简单有效,其实大部分能够做文章的地方不是在算法,而是在中文分词和词性标注的部分。所以,掌握这个简单有效的方法,并利用它来做关键词提取,是非常重要的。本文会首先对TF-IDF算法做简要介绍,然后提供这个算法在R语言中的实现代码。

TF-IDF简介

TF-IDF的基本思想是:词语的重要性与它在文件中出现的次数成正比,但同时会随着它在语料库中出现的频率成反比下降。也就是说,如果在一篇论文或一次演讲中,我们反复提到一些词,那么这些词可能会比其他的词更重要。但是如果这些词,别人也都在用,那么这些词就不能称之为我们文章或者演讲的特色(比如大量的常用词)。为了能够提取出文本中“最具特色”的表征性关键词,需要利用TF-IDF算法,也就是说:如果某个词或者短语在一个文档中出现多次,但是在其他文档中很少出现,就可以认为这个词或短语具有很好的区分性,适合用来对这个文档进行表征。

640?wx_fmt=jpeg

TF(Term Frequency)表示一个词在文档中出现的次数。

DF(Document Frequency)表示整个语料库中含有某个词的文档个数

IDF(Inverse Document Frequency)为逆文档频率,其计算公式为:IDF= log(语料库中文档总数/(包含该词的文档数+1))。如果没有加1,那么分母为零的时候会出错,因此必须加1。图中没有加1,一般认为既然对这个词进行统计,这个词应该至少出现一次。这在训练模型的时候是正确的,但是在运用模型的时候,就不一定了。为了保险,加1没错。

TF-IDF = TF * IDF

由公式可知:一个词在文档中出现的次数越多,其TF值就越大,整个语料库中包含某个词的文档数越少,则IDF值越大,因此某个词的TF-IDF值越大,则这个词是关键词的概率越大。

TF-IDF关键词提取算法的一大缺点是:为了精确的提取一篇文档中的关键词,需要有一整个语料库来提供支持。这个问题的解决方法,通常是在一个通用的语料库上提前计算好所有词的IDF值,jieba就是这么做的。这样的解决方案对于普通文档关键词提取有一定的效果,但是对于专业性稍微强一点的文档,表现就会差很多。因此如果是一个垂直领域,需要自己先对模型进行训练,形成一个IDF的库(里面装的东西就是一个数据框,一列是词语,一列是这个词语的IDF)。jieba是用《人民日报》语料库进行训练的,对新闻类的特征提取有一定效果。但是随着时代的变迁,大家用语习惯的变化,无论是分词库还是IDF词库都需要定期更新,才能够有良好的效果。


R语言中的实现

基本准备

首先安装必要的包。

1library(pacman)
2p_load(tidyverse,tidytext,data.table,rio,jiebaR)


然后,导入数据。数据在我的Github中可以下载,网址为:github.com/hope-data-sc. 我们导入到R环境中

好的,下面是一个简单的Python程序,用于实现TF-IDF提取关键词: ```python import jieba.analyse import jieba import os import codecs from sklearn import feature_extraction from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer from sklearn.metrics.pairwise import cosine_similarity # 加载停用词 def get_stopwords_list(): stopwords_file = os.path.join(os.getcwd(), 'stopwords.txt') stopwords_list = [line.strip() for line in codecs.open(stopwords_file, 'r', encoding='utf-8').readlines()] return stopwords_list # 分词 def cut_words(text): words = jieba.cut(text) stopwords_list = get_stopwords_list() result = '' for word in words: if word not in stopwords_list: result += word + ' ' return result # TF-IDF提取关键词 def tfidf_extract(texts, topK): corpus = [] for text in texts: text = cut_words(text) corpus.append(text) vectorizer = TfidfVectorizer() transformer = TfidfTransformer() tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus)) word = vectorizer.get_feature_names() weight = tfidf.toarray() ids = [] for i in range(len(weight)): ids.append(i) for i in range(len(weight)): cosine_similarities = cosine_similarity(tfidf[i], tfidf).flatten() related_docs_indices = [index for index in cosine_similarities.argsort()[::-1] if index != i] top_k = related_docs_indices[:topK] print("关键词:") for index in top_k: print(word[index], end=" ") print("\n") if __name__ == '__main__': texts = ['中文语料库', '汉语分词', '自然语言处理', '机器学习', '深度学习'] topK = 3 tfidf_extract(texts, topK) ``` 该程序使用了jieba库进行分词,并使用sklearn库中的TfidfVectorizer和TfidfTransformer进行TF-IDF计算和特征转换。在程序中,我们使用了一个停用词表来过滤掉一些无意义的词语,同时在输出关键词时,我们使用余弦相似度来计算相关性,并输出与当前文本最相关的前topK个关键词
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值