当前位置:云好站网站目录 » 文章资讯 » 网站运营 » 文章详细

武汉SEO之TF-IDF算法实现文本相似度的seo算法原理

网站运营 109

武汉SEO之TF-IDF算法实现文本相似度的seo算法原理,主要应用于相似文本推荐等场景。通过使用TF-IDF算法,来找出文章的关键词,从我们每天发布的文章中提取一行或者多个关键词进行整理,计算出每篇文章中的关键词量是否相似,也就是我们经常检查飘红,一般检测0都是原创文章。检测值越小相似度越,反之越大就表示越相似,一般伪原创文章就是通过这种算法来避开文章的相似度。

TF-IDF是一种在信息检索与自然语言处理领域常用的加权技术,可用于挖掘文章中的关键词,也可用于比较文本的相似度等。

1.基本概念

TF,词频(term frequency),即一个单词在文档中出现的次数。一般来说,在某个文档中反复出现的单词,往往能够表征文档的主题信息,即TF值越大,越能代表文档所反映的内容,那么应该给予这个单词更大的权值。

IDF,逆文档频率(inverse document frequency),是一个词语普遍重要性的度量。词频因子是与文档密切相关的,说一个单词的TF值,指的是这个单词在某个文档中的出现次数,同一个单词在不同文档中TF值很可能不一样。而逆文档频率因子IDF则与此不同,它代表的是文档集合范围的一种全局因子。给定一个文档集合,那么每个单词的IDF值就唯一确定,跟具体的文档无关。所以IDF考虑的不是文档本身的特征,而是特征单词之间的相对重要性。

规定t表示单词term,d表示文档document,n表示文档集合中总共有多少文档,df(t)表示单词t在其中多少个文档出现过。则TF-IDF的计算公式为

其中,tf(t,d)表示单词t在文档d中出现的次数。具体计算TF的时候,基于不同的出发点,采纳的计算公式也不同,最直接的方式就是直接利用词频数,如上面的公式所示。比如文档中某个单词出现了5次,那么就将这个单词的TF值计为5。考虑到文章有长短之分,为了便于不同文章的比较,通常进行词频标准化,即某个单词t在某个文档d中的出现次数除以该文档d的总词数作为TF值。

与TF一样,IDF的计算公式变体也有很多,上面公式展示的是常用的基本公式。公式中加一是为了做数据平滑。考虑极端的情况,若某一个单词在文档集合所有文档中都出现,那么取log后值将为0,为了避免这种情况,在log计算后采用加一的方式进行平滑。而log计算中分子分母之所以加一,是为了避免某个单词没在文档集中任意文档中出现过,分母为零的情况。IDF的计算公式再次印证了我们上面的说法,IDF的计算与具体的某一文档无关。

从IDF计算公式可以看出,文档频率df(t)越高,则其IDF值越小,即越多的文档包含这个单词t。IDF反映了一个单词在整个文档集合中的分布情况,单词出现在其中的文档数目越多,IDF值越低,这个单词区分不同文档的能力也就越差。比如,中文中的"我们"这个词在中文文档中经常出现,相对而言,"机器学习"这个词在中文文档中就不如"我们"常见,那么"机器学习"这个词在文档集中区分不同文档的能力更强,更适合用于分类文档。

TF和IDF的计算公式变体有很多,大家感兴趣可以自行上网查阅资料。

2.实例

下面我们基于具体的例子讲解TF-IDF的计算。假设我们的语料如下(来源:sklearn文档),一共有4个句子作为文档集合,每个句子表示一个文档,则文档集合中一共有4个文档(单引号内为文档内容)。

我们手工计算TF-IDF过程如下:首先构建document-term矩阵(忽略标点符号)。term为语料中出现的所有单词。

然后按照公式分别计算单词t在文档d中的TF以及单词t的IDF,相乘即为TF-IDF值。

3.代码示例

下面我们使用sklearn库来进行TF-IDF的计算。主要有两种方式。

方法一

第一种方法主要用到两个类:CountVectorizer和TfidfTransformer。代码演示如下:

fromsklearn.feature_extraction.textimportCountVectorizer,TfidfTransformer corpus=[ 'Thisisthefirstdocument.', 'Thisdocumentistheseconddocument.', 'Andthisisthethirdone.', 'Isthisthefirstdocument?', ] vectorizer=CountVectorizer() #根据语料计算词频矩阵 X=vectorizer.fit_transform(corpus) #打印文档集合中所有单词 print(vectorizer.get_feature_names()) #打印词频矩阵 print(X.toarray()) transformer=TfidfTransformer() #根据词频矩阵计算TF-IDF值 tfidf=transformer.fit_transform(X) #打印TF-IDF计算结果 print(tfidf.toarray())

方法二

第二种方法只用到一个类:TfidfVectorizer。代码演示如下:

fromsklearn.feature_extraction.textimportTfidfVectorizer corpus=[ 'Thisisthefirstdocument.', 'Thisdocumentistheseconddocument.', 'Andthisisthethirdone.', 'Isthisthefirstdocument?', ] vectorizer=TfidfVectorizer() #根据原始语料直接计算TF-IDF值 tfidf=vectorizer.fit_transform(corpus) #打印文档集合中所有单词 print(vectorizer.get_feature_names()) #打印TF-IDF计算结果 print(tfidf.toarray())

如果只是计算TF-IDF,两种方法所得结果是一样的,第二种方法相对简洁。大家可以根据自己需要选择。

4注意

1、在机器学习任务中,我们经常会划分训练集和测试集。我们在针对测试集语料计算TF-IDF时,往往是根据训练集获取词典和IDF,然后根据测试集语料内容计算其TF-IDF值。代码示例如下:

fromsklearn.feature_extraction.textimportTfidfVectorizer corpus=[ 'Thisisthefirstdocument.', 'Thisdocumentistheseconddocument.', 'Andthisisthethirdone.', 'Isthisthefirstdocument?', ] test_corpus=['Thisisthefourthdocument.'] vectorizer=TfidfVectorizer() #从训练语料中获取包含所有单词的词典以及IDF值 vectorizer.fit(corpus) #根据测试语料计算TF-IDF tfidf=vectorizer.transform(test_corpus) #打印TF-IDF计算结果 print(tfidf.toarray())

2、sklearn中类的参数设置。比如TfidfVectorizer的其中一个初始化参数默认设置为

token_pattern=’(?u)ww+’

该参数使用正则表达式表明该类选取文档中单词的标准,只有该单词包含两个或者两个以上的字符时才被选入document-term矩阵,比如英文单词"a"只包含一个字母,则其即使出现在语料中也不会被当作term进行TF-IDF的计算。在实际使用中大家要根据自己需要设置正则表达式。文本总结,说白了TF-IDF算法就是使用正则表达式在文章中进行选词,计算出文章的相似度。为了考虑到我们发布的文章有长短差异之分,百度算法呢,就对关键词进行词频标准化。好了今天关于TF-IDF算法就讲到这里。