小周SEO顾问:百度内部的搜索算法,已经非常复杂了,能全面了解整个搜索算法的人屈指可数,google应该也是同样的情况,普通员工一般只了解自己负责的一小部分,而同时全面了解两个公司算法的人,需要在两个公司搜索部门都干很长时间,而且都做到很高职位,这样的人,还没听说过,即使有这样的人,对两个公司的算法都了如指掌 ,你觉得这种核心的东西,他会在公开场合说出来吗?下面带你详细了解TF-IDF算法及原理
TF-IDF概念
TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。
TF-IDF计算:
TF-IDF反映了在文档集合中一个单词对一个文档的重要性,经常在文本数据挖据与信息提取中用来作为权重因子。在一份给定的文件里,词频(termfrequency-TF)指的是某一个给定的词语在该文件中出现的频率。逆向文件频率(inversedocument frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。
TF-IDF原理
在一份给定的文件里,词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(分子一般小于分母 区别于IDF),以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)
逆向文件频率 (inverse document frequency, IDF) 是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF反文档频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率(另一说:TF词频(Term Frequency)指的是某一个给定的词语在该文件中出现的次数)。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。(另一说:IDF反文档频率(Inverse Document Frequency)是指果包含词条的文档越少,IDF越大,则说明词条具有很好的类别区分能力。)但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处。
TF-IDF向量空间模型Vector Space Model计算
写一个testscikit.py文件,内容如下:
<p># coding:utf-8
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
corpus=["杭州 SEO TF-IDF",
"算法 网站",
"标题 怎么 写 适合 优化 "]
vectorizer=CountVectorizer()
print type(vectorizer.fit_transform(corpus))
print vectorizer.fit_transform(corpus)
print vectorizer.fit_transform(corpus).todense()
这里面CountVectorizer是一个向量计数器
第一个print type(vectorizer.fit_transform(corpus))输出结果如下:
<class 'scipy.sparse.csr.csr_matrix'>
这说明fit_transform把corpus二维数组转成了一个csr_matrix类型(稀疏矩阵)
第二个print vectorizer.fit_transform(corpus)输出结果如下:
(0, 0) 1
(0, 4) 1
(0, 7) 1
(1, 7) 1
(1, 1) 1
(2, 0) 1
(2, 2) 1
(2, 3) 1
(2, 6) 1
(2, 5) 1
这就是稀疏矩阵的表示形式,即把二维数组里的所有词语组成的稀疏矩阵的第几行第几列有值
第三个print vectorizer.fit_transform(corpus).todense()输出如下:
[[1 0 0 0 1 0 0 1]
[0 1 0 0 0 0 0 1]
[1 0 1 1 0 1 1 0]]
这就是把稀疏矩阵输出成真实矩阵
下面我们把代码改成:
# coding:utf-8
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
corpus=["杭州 SEO TF-IDF",
"算法 网站",
"标题 怎么 写 适合 优化 "]
vectorizer=CountVectorizer()
csr_mat = vectorizer.fit_transform(corpus)
transformer=TfidfTransformer()
tfidf=transformer.fit_transform(csr_mat)
print type(tfidf)
print tfidf
print tfidf.todense()
TF-IDF算法输出如下:
<class 'scipy.sparse.csr.csr_matrix'>
(0, 7) 0.517856116168
(0, 4) 0.680918560399
(0, 0) 0.517856116168
(1, 1) 0.795960541568
(1, 7) 0.605348508106
(2, 5) 0.467350981811
(2, 6) 0.467350981811
(2, 3) 0.467350981811
(2, 2) 0.467350981811
(2, 0) 0.35543246785
文章评论 本文章有个评论