您的位置:首页 > 汽车 > 新车 > TF/IDF算法

TF/IDF算法

2024/7/4 5:57:17 来源:https://blog.csdn.net/ros275229/article/details/140019542  浏览:    关键词:TF/IDF算法

第1关:去除停用词

任务描述

本关任务:根据本关所学有关停用词的知识,编写使用停用词表去除停用词的程序并通过测试用例。

相关知识

为了完成本关任务,你需要掌握:

  1. 停用词的意义;

  2. 去除停用词的步骤。

停用词简介

停用词是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为 Stop Words(停用词)。这些停用词都是人工输入、非自动化生成的,生成后的停用词会形成一个停用词表。

但是,并没有一个明确的停用词表能够适用于所有的工具。甚至有一些工具是明确地避免使用停用词来支持短语搜索的。

停用词的类别

对于一个给定的目的,任何一类的词语都可以被选作停用词。通常意义上,停用词大致分为两类:

1、人类语言中包含的功能词:这些功能词极其普遍,与其他词相比,功能词没有什么实际含义,比如 the、is、at、which、on 等。但是对于搜索引擎来说,当所要搜索的短语包含功能词,特别是像 The Who、Take That 等复合名词时,停用词的使用就会导致问题。

2、词汇词:比如 want 等,这些词应用十分广泛,但是对这样的词搜索引擎无法保证能够给出真正相关的搜索结果,难以帮助缩小搜索范围,同时还会降低搜索的效率,所以通常会把这些词从问题中移去,从而提高搜索性能。

停用词的功能

文档中如果大量使用 Stop words 容易对页面中的有效信息造成噪音干扰,所以搜索引擎在运算之前都要对所索引的信息进行消除噪音的处理。了解了 Stop Words ,在网页内容中适当地减少停用词出现的频率,可以有效地帮助我们提高关键词密度,在网页标题标签中避免出现停用词能够让所优化的关键词更集中、更突出。

因此,我们在进行自然语言处理的过程中,经常会使用停用词表去除文本中的停用词,以提高文本处理效率。常见步骤有:

  1. 找到一个合适的停用词表;

  2. 对文本内容进行遍历,去除文本中的停用词并保存。

编程要求

在右侧编辑器中的 Begin-End 之间补充 Python 代码,使用已编写好的停用词表加载函数去除所输入文本中的停用词,并输出去掉文本停用词后的结果。其中文本内容通过 input 从后台获取。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。

测试输入: 统帅一声令下,全军迅疾行动。除夕逆行武汉,挺进抗疫一线,党员率先垂范,军地共克时艰。从接手地方医院病区到进驻武汉火神山医院、武汉市泰康同济医院、湖北省妇幼保健院光谷院区,不论是传染病防控专家还是一线医务人员,面对疫情,人民军队始终与人民紧密团结在一起,誓死不退,英勇奋战,展现了人民子弟兵忠于党、忠于人民的政治品格。。

预期输出: 统帅声令下全军迅疾行动夕逆行武汉挺进抗疫线党员率先垂范军共克时艰接手方医院病区进驻武汉火神山医院武汉市泰康济医院湖北省妇幼保健院光谷院区不传染病防控专家还线医务人员面疫情人民军队始终人民紧密团结誓死不退英勇奋战展现人民子弟兵忠党忠人民政治品格

# 停用词表加载方法
def get_stopword_list():# 停用词表存储路径,每一行为一个词,按行读取进行加载# 进行编码转换确保匹配准确率stop_word_path = './stopword.txt'stopword_list = [sw.replace('\n', '') for sw in open(stop_word_path,encoding='utf-8').readlines()]return stopword_listif __name__ == '__main__':text=input()result=""list = []# 任务:使用停用词表去掉text文本中的停用词,并将结果保存至result变量# ********** Begin *********#stopwords = get_stopword_list()list = [word for word in text if word not in stopwords]for word in list:result+=word# ********** End **********#print(result,end="")

第2关:TF/IDF 算法

任务描述

本关任务:根据本关所学有关 TF/IDF 算法的知识,编写 TF/IDF 算法程序并通过所有测试用例。

相关知识

为了完成本关任务,你需要掌握:

  1. 关键词提取技术的思想;

  2. TF/IDF 算法的含义与使用方法。

关键词提取技术概述

在信息爆炸的时代,很多信息我们无法全面接收,我们需要从中筛选出一些我们感兴趣的或者说对我们有用的信息进行接收。怎么选择呢,关键词提取就是其中一个很好的方法。如果我们可以准确地将所有文档都用几个简单的关键词描述出来,单看几个关键词就可以了解一篇文章,这样会大大提高我们的信息获取效率。

类似于其他的机器学习方法,关键词提取算法一般也可以分为有监督和无监督两类:

  1. 有监督

主要通过分类的方式进行,通过构建一个丰富和完善的词表,然后通过判断每个文档与词表中每个词的匹配程度,以类似打标签的方式,从而达到关键词提取的效果。能够获得较高精度,但是需要大批量的标注数据,人工成本较高;

  1. 无监督

这种方式无需人工生成、维护的词表,同时也不需要人工标注语料辅助进行训练,这类方法目前主要有 TF-IDF 算法、 TextRank 算法和主题模型算法( LSA 、 LSI 、 LDA 等);

TF/IDF 算法

TF/IDF 算法(Term Frequency-Inverse Document Frequency ,词频-逆文档频次算法)是一种基于统计的计算方法,常用于评估在一个文档集中一个词对某份文档的重要程度。这种作用显然很符合关键词抽取的需求,一个词对文档越重要,那就越可能是文档的关键词,因此,人们常将 TF/IDF 算法应用于关键词提取中。

图1

TF-IDF 的主要思想是:如果某个单词在一篇文章中出现的频率(TF)高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

1、TF 是词频( Term Frequency )

词频( TF )表示词条(关键字)在文本中出现的频率。这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。计算公式为: TFw​=该类中所有词条数目在某一类中词条w出现的次数​

2、IDF 是逆向文件频率( Inverse Document Frequency )

某一特定词语的 IDF ,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。计算公式为:

idfi​=log∣j:ti​∈dj​∣∣D∣​

3、TF-IDF 实际上是:TF * IDF

某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的 TF-IDF 。因此,TF-IDF 倾向于过滤掉常见的词语,保留重要的词语。计算公式为: TF-IDF=TF∗IDF

如何训练关键词提取算法

我们训练一个关键词提取算法需要以下几个步骤:

  • 加载已有的文档数据集;

  • 加载停用词表;

  • 对数据集中的文档进行分词;

  • 根据停用词表,过滤干扰词;

  • 根据数据集训练算法。

在根据训练好的关键词提取算法对新文档进行关键词提取要经过对新文档进行分词;根据停用词表,过滤干扰词;提取关键词这个几个环节。

编程要求

在右侧编辑器中的 Begin-End 之间补充 Python 代码,完成 TF/IDF 算法,提取所输入文本中的关键词,并输出关键词提取结果。其中文本内容通过 input 从后台获取。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。

测试输入: 疫情面前,时间就是生命!高效、便捷一直是民航的优势。这一次,中国民航再次挺身而出,发挥着不可替代的作用,彰显着民航担当。这样的担当体现在中国民航坚决打赢疫情防控阻击战的决心里,体现在一个又一个航班任务执行中。关键时刻,民航领域各单位各企业快速反应、积极应对,尽全力保障医疗救护人员和物资的运输工作,为战“疫”抢出时间、抢出希望。

预期输出:

 
  1. Building prefix dict from the default dictionary ...
  2. Dumping model to file cache /tmp/jieba.cache
  3. Loading model cost 0.738 seconds.
  4. Prefix dict has been built successfully. # 接口调用的附加信息
  5. 疫情/ 中国民航/ 阻击战/ 航班/ 替代/ 快速反应/ 关键时刻/ 优势/ 领域/ 任务/

#本程序的作用是通过TF/IDF算法完成对文本的关键词提取,输出前十个关键词。
import math
import jieba
import jieba.posseg as psg
from gensim import corpora, models
from jieba import analyse
import functoolsclass TfIdf(object):# 四个参数分别是:训练好的idf字典,默认idf值,处理后的待提取文本,关键词数量def __init__(self, idf_dic, default_idf, word_list, keyword_num):self.word_list = word_listself.idf_dic, self.default_idf = idf_dic, default_idfself.tf_dic = self.get_tf_dic()self.keyword_num = keyword_numdef get_tf_dic(self):tf_dic = {}# 任务:完成word_list的tf值的统计函数,将结果存储到tf_dic变量中# ********** Begin *********#for w in self.word_list:tf_dic[w] = tf_dic.get(w,0.0)+1.0tf_cnt = len(self.word_list)for k,v in tf_dic.items():tf_dic[k] = float(v) / tf_cnt			# ********** End **********#return tf_dic# 按公式计算tf-idfdef get_tfidf(self):tfidf_dic = {}for word in self.word_list:idf = self.idf_dic.get(word, self.default_idf)tf = self.tf_dic.get(word, 0)tfidf = tf * idftfidf_dic[word] = tfidftfidf_dic.items()# 根据tf-idf排序,去排名前keyword_num的词作为关键词for k, v in sorted(tfidf_dic.items(), key=functools.cmp_to_key(cmp), reverse=True)[:self.keyword_num]:print(k + "/ ", end='')print()#排序函数,用于topK关键词的按值排序
def cmp(e1, e2):import numpy as npres = np.sign(e1[1] - e2[1])if res != 0:return reselse:a = e1[0] + e2[0]b = e2[0] + e1[0]if a > b:return 1elif a == b:return 0else:return -1

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com