-
TF-IDF算法介绍及实现
2018-08-07 19:17:451、TF-IDF算法介绍 (1)TF是词频(Term Frequency) (2) IDF是逆向文件频率(Inverse Document Frequency) (3)TF-IDF实际上是:TF * IDF 2、TF-IDF应用 3、Python3实现TF-IDF算法 4、NLTK实现TF-IDF算法 5...目录
(2) IDF是逆向文件频率(Inverse Document Frequency)
1、TF-IDF算法介绍
TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF-IDF的主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
(1)TF是词频(Term Frequency)
词频(TF)表示词条(关键字)在文本中出现的频率。
这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。
公式:
即:
其中 ni,j 是该词在文件 dj 中出现的次数,分母则是文件 dj 中所有词汇出现的次数总和;
(2) IDF是逆向文件频率(Inverse Document Frequency)
逆向文件频率 (IDF) :某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。
如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。
公式:
其中,|D| 是语料库中的文件总数。 |{j:ti∈dj}| 表示包含词语 ti 的文件数目(即 ni,j≠0 的文件数目)。如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用 1+|{j:ti∈dj}|
即:
(3)TF-IDF实际上是:TF * IDF
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
公式:
注: TF-IDF算法非常容易理解,并且很容易实现,但是其简单结构并没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。
2、TF-IDF应用
(1)搜索引擎;(2)关键词提取;(3)文本相似性;(4)文本摘要
3、Python3实现TF-IDF算法
注意:该代码tf计算使用的是整个语料,这里只是举个简单的例子,大家在写的时候按文档计算词频即可!我这里就不做修改了
# -*- coding: utf-8 -*- from collections import defaultdict import math import operator """ 函数说明:创建数据样本 Returns: dataset - 实验样本切分的词条 classVec - 类别标签向量 """ def loadDataSet(): dataset = [ ['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], # 切分的词条 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'], ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'], ['stop', 'posting', 'stupid', 'worthless', 'garbage'], ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'], ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid'] ] classVec = [0, 1, 0, 1, 0, 1] # 类别标签向量,1代表好,0代表不好 return dataset, classVec """ 函数说明:特征选择TF-IDF算法 Parameters: list_words:词列表 Returns: dict_feature_select:特征选择词字典 """ def feature_select(list_words): #总词频统计 doc_frequency=defaultdict(int) for word_list in list_words: for i in word_list: doc_frequency[i]+=1 #计算每个词的TF值 word_tf={} #存储没个词的tf值 for i in doc_frequency: word_tf[i]=doc_frequency[i]/sum(doc_frequency.values()) #计算每个词的IDF值 doc_num=len(list_words) word_idf={} #存储每个词的idf值 word_doc=defaultdict(int) #存储包含该词的文档数 for i in doc_frequency: for j in list_words: if i in j: word_doc[i]+=1 for i in doc_frequency: word_idf[i]=math.log(doc_num/(word_doc[i]+1)) #计算每个词的TF*IDF的值 word_tf_idf={} for i in doc_frequency: word_tf_idf[i]=word_tf[i]*word_idf[i] # 对字典按值由大到小排序 dict_feature_select=sorted(word_tf_idf.items(),key=operator.itemgetter(1),reverse=True) return dict_feature_select if __name__=='__main__': data_list,label_list=loadDataSet() #加载数据 features=feature_select(data_list) #所有词的TF-IDF值 print(features) print(len(features))
运行结果:
4、NLTK实现TF-IDF算法
from nltk.text import TextCollection from nltk.tokenize import word_tokenize #首先,构建语料库corpus sents=['this is sentence one','this is sentence two','this is sentence three'] sents=[word_tokenize(sent) for sent in sents] #对每个句子进行分词 print(sents) #输出分词后的结果 corpus=TextCollection(sents) #构建语料库 print(corpus) #输出语料库 #计算语料库中"one"的tf值 tf=corpus.tf('one',corpus) # 1/12 print(tf) #计算语料库中"one"的idf值 idf=corpus.idf('one') #log(3/1) print(idf) #计算语料库中"one"的tf-idf值 tf_idf=corpus.tf_idf('one',corpus) print(tf_idf)
运行结果:
5、Sklearn实现TF-IDF算法
from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer x_train = ['TF-IDF 主要 思想 是','算法 一个 重要 特点 可以 脱离 语料库 背景', '如果 一个 网页 被 很多 其他 网页 链接 说明 网页 重要'] x_test=['原始 文本 进行 标记','主要 思想'] #该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频 vectorizer = CountVectorizer(max_features=10) #该类会统计每个词语的tf-idf权值 tf_idf_transformer = TfidfTransformer() #将文本转为词频矩阵并计算tf-idf tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train)) #将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重 x_train_weight = tf_idf.toarray() #对测试集进行tf-idf权重计算 tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test)) x_test_weight = tf_idf.toarray() # 测试集TF-IDF权重矩阵 print('输出x_train文本向量:') print(x_train_weight) print('输出x_test文本向量:') print(x_test_weight)
运行结果:
6、Jieba实现TF-IDF算法
import jieba.analyse text='关键词是能够表达文档中心内容的词语,常用于计算机系统标引论文内容特征、 信息检索、系统汇集以供读者检阅。关键词提取是文本挖掘领域的一个分支,是文本检索、 文档比较、摘要生成、文档分类和聚类等文本挖掘研究的基础性工作' keywords=jieba.analyse.extract_tags(text, topK=5, withWeight=False, allowPOS=()) print(keywords)
运行结果:
注:
- jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
- sentence 为待提取的文本
- topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
- withWeight 为是否一并返回关键词权重值,默认值为 False
- allowPOS 仅包括指定词性的词,默认值为空,即不筛选
7、TF-IDF算法的不足
TF-IDF 采用文本逆频率 IDF 对 TF 值加权取权值大的作为关键词,但 IDF 的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以 TF-IDF 算法的精度并不是很高,尤其是当文本集已经分类的情况下。
在本质上 IDF 是一种试图抑制噪音的加权,并且单纯地认为文本频率小的单词就越重要,文本频率大的单词就越无用。这对于大部分文本信息,并不是完全正确的。IDF 的简单结构并不能使提取的关键词, 十分有效地反映单词的重要程度和特征词的分布情 况,使其无法很好地完成对权值调整的功能。尤其是在同类语料库中,这一方法有很大弊端,往往一些同类文本的关键词被盖。
TF-IDF算法实现简单快速,但是仍有许多不足之处:
(1)没有考虑特征词的位置因素对文本的区分度,词条出现在文档的不同位置时,对区分度的贡献大小是不一样的。
(2)按照传统TF-IDF,往往一些生僻词的IDF(反文档频率)会比较高、因此这些生僻词常会被误认为是文档关键词。
(3)传统TF-IDF中的IDF部分只考虑了特征词与它出现的文本数之间的关系,而忽略了特征项在一个类别中不同的类别间的分布情况。
(4)对于文档中出现次数较少的重要人名、地名信息提取效果不佳。
8、TF-IDF算法改进——TF-IWF算法
详细改进方法参看论文:改进的 TF-IDF 关键词提取方法
交流学习资料共享欢迎入QQ群:955817470
-
TF-IDF算法
2020-07-16 22:33:04TF-IDF算法 某个词的TF-IDF值就越大,说明该词对文章的重要性越高,越有可能成为关键词。 TF(Term Frequency)词频 IDF(Inverse Document Frequency)逆文档频率 IDF大小与一个词的常见程度成反比 TF-IDF的计算 ... -
基于TF-IDF算法抽取
2019-04-30 20:56:47实现基于TF-IDF算法抽取,对关键词进行抽取的算法,程序 -
TF-IDF算法介绍
2020-06-06 11:59:37TF-IDF算法介绍 TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。 TF-IDF...TF-IDF算法介绍
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF-IDF的主要思想:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF实际上是:TF * IDF,TF词频(Term Frequency),IDF逆向文件频率(Inverse Document Frequency)。
TF是词频(Term Frequency)
词频(TF)表示词条(关键字)在文本中出现的频率。
这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。
其中 ni,j 是该词在文件 dj 中出现的次数,分母则是文件 dj 中所有词汇出现的次数总和;
IDF是逆向文件频率(Inverse Document Frequency)
逆向文件频率 (IDF) :是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到。
其中
- |D|:语料库中的文件总数
- 包含词语的文件数目(即的文件数目)如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用作为分母。
如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。
TF-IDF实际上是:TF * IDF
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
公式:
注: TF-IDF算法非常容易理解,并且很容易实现,但是其简单结构并没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。
当前,真正在搜索引擎等实际应用中广泛使用的是 tf-idf 模型。tf-idf 模型的主要思想是:如果词w在一篇文档d中出现的频率高,并且在其他文档中很少出现,则认为词w具有很好的区分能力,适合用来把文章d和其他文章区分开来。
TF-IDF算法的不足
TF-IDF 采用文本逆频率 IDF 对 TF 值加权取权值大的作为关键词,但 IDF 的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以 TF-IDF 算法的精度并不是很高,尤其是当文本集已经分类的情况下。在本质上 IDF 是一种试图抑制噪音的加权,并且单纯地认为文本频率小的单词就越重要,文本频率大的单词就越无用。这对于大部分文本信息,并不是完全正确的。IDF 的简单结构并不能使提取的关键词, 十分有效地反映单词的重要程度和特征词的分布情 况,使其无法很好地完成对权值调整的功能。尤其是在同类语料库中,这一方法有很大弊端,往往一些同类文本的关键词被盖。
TF-IDF算法实现简单快速,但是仍有许多不足之处:
(1)没有考虑特征词的位置因素对文本的区分度,词条出现在文档的不同位置时,对区分度的贡献大小是不一样的。
(2)按照传统TF-IDF,往往一些生僻词的IDF(反文档频率)会比较高、因此这些生僻词常会被误认为是文档关键词。
(3)传统TF-IDF中的IDF部分只考虑了特征词与它出现的文本数之间的关系,而忽略了特征项在一个类别中不同的类别间的分布情况。
(4)对于文档中出现次数较少的重要人名、地名信息提取效果不佳。
因此就有了TF-IDF算法改进——TF-IWF算法
参考
百度百科
-
LDA和TF-IDF算法的相关论文
2020-03-10 10:29:50LDA和TF-IDF算法的相关论文; -
TF-IDF算法解析与Python实现方法详解
2020-09-21 01:44:44主要介绍了TF-IDF算法解析与Python实现方法详解,文章介绍了tf-idf算法的主要思想,分享了Python实现tr-idf算法所必要的预处理过程,以及具体实现代码等相关内容,具有一定参考价值,需要的朋友可以了解下。 -
python实现TF-IDF算法解析
2020-09-20 22:22:40本篇文章主要介绍了python实现TF-IDF算法解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
tf-idf算法.zip
2019-10-27 17:18:29采用tf-idf算法计算携程评论中的关键词,并输出前500个关键词,该算法不同于市面上的其他算法,保证了o(n)的时间复杂度,执行速度更快,同时具有更好的移植性和健壮性 -
python TF-IDF算法实现文本关键词提取
2020-09-19 08:47:43主要为大家详细介绍了python TF-IDF算法实现文本关键词提取,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
论文研究-一种基于TF-IDF算法的本体关联度算法 .pdf
2019-08-14 17:42:01一种基于TF-IDF算法的本体关联度算法,高志翔,,本文对语义搜索中的本体关联度算法进行了研究,首先分析了传统TF-IDF算法在本体关联度计算上的不足,然后,针对本体信息的强语义性 -
一种基于TF-IDF算法的本体关联度算法.docx
2019-12-20 01:04:12一种基于TF-IDF算法的本体关联度算法:一种基于TF-IDF算法的本体关联度算法,高志翔,,本文对语义搜索中的本体关联度算法进行了研究,首先分析了传统TF-IDF算法在本体关联度计算上的不足,然后,...|下载前务必先预览,... -
关键词提取TF-IDF算法综述
2018-03-13 10:25:19关键词提取TF-IDF算法综述,TFIDF词频逆文档频率是关键词提取常用算法,本文是对该方法全面的综述 -
TF-IDF算法示例代码
2021-01-20 02:41:15# TF-IDF算法示例 # 0.引入依赖 import numpy as np import pandas as pd import math # 1.定义数据和预处理 docA = The cat sat on my bed docB = The dog sat on my knees bowA = docA.split( ) bowB = docB.split...
-
Glasterfs 分布式网络文件系统
-
沿RF锁相辅助的光纤环路链路上任意中间点的精确时延感测和工作台频率分配
-
FyreString:FyreString是PHP的免费开源字符串实用程序库-源码
-
常用的分布式事务解决方案
-
APPKIT打造稳定、灵活、高效的运营配置平台
-
JMETER 性能测试基础课程
-
leetcode算法第5题
-
2018年上半年 信息系统监理师 上午试卷 综合知识 软考真题【含答案和答案解析】
-
阿里集团八年容器化演进之路
-
白话:java从入门到实战
-
-191-4-源码
-
2021 PHP租车系统 毕业设计 毕设源码 源代码使用教程
-
通过成形InGaN / GaN纳米棒来修改远场辐射图
-
Kettle的使用——Excel输出
-
2019年下半年 信息系统监理师 上午试卷 综合知识 软考真题【含答案和答案解析】
-
元素周期表-three.js实战详解
-
2018年下半年 信息系统监理师 上午试卷 综合知识 软考真题【含答案和答案解析】
-
易意-源码
-
将和声搜索算法与杜鹃搜索混合,以进行全局数值优化
-
2014年上半年 信息系统管理工程师 上午试卷 综合知识 软考真题【含答案和答案解析】