Tf-idf推导及理解

目录

1 什么是Tf-idf?

2 Tf-idf可以用来做什么?


1 什么是Tf-idf?

TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

百度百科:TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF是词频(Term Frequency),IDF是逆文本频率指数(Inverse Document Frequency)。

顾名思义,Tf-idf由tf和idf两部分组成,tf是指一个词在当前document里面出现的频率,idf是指这个词在全体语料库中出现频率的倒数。根据这个定义,说明一个词对于一个document的重要程度与这个词出现在当前document的频率成正比,与出现在全体语料库中的频率成反比。通俗理解,一个词在一篇文章中出现次数越多,这个词对这篇文章越重要;在全体语料中出现频率越多,说明,这个词只是一个常用词而已,两者乘积就是Tf-idf。注意:这里document不一定是文章,可能是句子之类的,或者是其他的。

公式如下:tfidf(w)=tf(d,w)*idf(w),其中,tf(d,w)是文档d中w的词频,idf(w)=log\frac{N}{N(w)+1},分母加一是为了避免单词未出现在任何文档中从而导致分母为的情况。

  • N:语料中的文档总数
  • N(w):词语w出现在多少个文档中

当某个词在当前文档中出现频率比较高,而且在整体语料库中的出现的概率较小,这样的词会获得较大权重,因此TF-IDF倾向于过滤掉常见的词语,而保留对某一篇文档来说出现频率高的词。

这里需要补充一点,tf是一个词在当前文档中的词频,也就是这个词出现的次数,这里就引出了另外的一个问题,就是如果某篇文档的总词数远大于其他文档,那么不管重要与否它的词通常拥有更高的词频,因此通常对tf进行归一化,也就是用当前文档某个词的词频除以当前文档总词数。

为什么要用Tf-idf,与计数特征相比,tf-idf有明显的优势,如果对一篇文档的词频进行单独计数,很有可能“你、我、他、得、的、地”这类词汇会出现很多次,如果用词频作为每个词的权重,显然不合适。相比Tf-idf在Tf的基础上加上了idf这一因素。idf更像是一个惩罚项,当某个词语在很多文章中都重复出现时,很明显他就不那么重要,因此乘上一个惩罚项来降低这个词的权重就是idf。

2 Tf-idf可以用来做什么?

现在已经知道tf-idf是用来计算某个词在当前文档中的权重值,权重越大表示这个词对于这个文档来说越重要,或者说,权重越大和文章主题越相关,越能代表这篇文章。所以Tf-idf最基本的应用就是从文章中提取出关键词,根据提取出的关键词也可以拓展到其他具体的应用。

例如计算两篇文章的相似性,首先使用Tf-idf计算出两篇文章中的权重最大的几个词语,并将这些词语组成一个集合。然后统计两篇文章中这个集合里面的词的词频。然后每篇文章就可以得到一个向量来代表整篇文章。再通过计算向量的相似性来表示两篇文章的相似性。这里有两个点需要说一下,首先为了避免两篇文章的长度不同导致词频不同,还是使用相对词频,对词频进行归一化处理。其次计算两向量的相似度可以使用余弦相似度或者Pearson相似度,这些不在本篇文章的讨论范围内,可以参考这篇协同过滤,有提到相似度算法。在一些更复杂的应用中也有类似Tf-idf的身影,比如自动摘要生成。首先对文章使用tf-idf计算每个词语的权重,选出权重最大的词语集合,然后使用一些NLG的技术根据这些重要的词,生成摘要。

 

a) 要将文档向量化,我们可以使用TF-IDF(Term Frequency-Inverse Document Frequency)方法。首先,我们需要计算每个文档中每个词的TF和IDF值,然后将它们相乘得到TF-IDF值。 TF(词频)表示某个词在文档中出现的频率,可以使用以下公式计算: TF = (词在文档中出现的次数) / (文档中总词数) IDF(逆文档频率)表示某个词在文档集合中的重要性,可以使用以下公式计算: IDF = log((总文档数) / (包含该词的文档数)) 最后,将TF和IDF相乘得到TF-IDF值。 根据上述方法,计算五篇文档的TF-IDF向量化矩阵的维度如下: ``` from sklearn.feature_extraction.text import TfidfVectorizer train = ["Hello world", "Hello python Hello", "world python Hello", "Hello Hello java", "Hello linux shell"] vectorizer = TfidfVectorizer() tfidf_matrix = vectorizer.fit_transform(train) print(tfidf_matrix.shape) ``` 运行上述代码,输出结果为: ``` (5, 7) ``` 因此,TF-IDF向量化矩阵的维度为5x7。 b) 要计算五篇文档之间的相似度,可以使用`pairwise_distances`函数从`sklearn.metrics.pairwise`模块。该函数可以计算文档集合中的两两文档之间的距离或相似度。 根据上述代码,计算五篇文档之间的相似度矩阵的维度如下: ``` from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import pairwise_distances train = ["Hello world", "Hello python Hello", "world python Hello", "Hello Hello java", "Hello linux shell"] vectorizer = TfidfVectorizer() tfidf_matrix = vectorizer.fit_transform(train) similarity_matrix = pairwise_distances(tfidf_matrix, metric='cosine') print(similarity_matrix.shape) ``` 运行上述代码,输出结果为: ``` (5, 5) ``` 因此,相似度矩阵的维度为5x5。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值