《数学之美》拾遗——TF-IDF

时间:2022-05-04
本文章向大家介绍《数学之美》拾遗——TF-IDF,主要内容包括开篇序、一、什么是TF-IDF、二、如何计算TF-IDF值、2、IDF的计算、3、TF-IDF的值、三、实际的例子、参考文献、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

开篇序

    在学习机器学习的过程中,我写了简单易学的机器学习算法的专题,依然还有很多的算法会陆续写出来。网上已经有很多人分享过类似的材料,我只是通过自己的理解,想尽可能用一种通俗易懂的方式讲出来。在不断学习的过程中,陆陆续续补充了很多的知识点,在学习吴军老师的《数学之美》的过程中,也补充了很多我之前遗漏的知识点,吴军老师已经在《数学之美》上把问题讲得很清楚,我在这里只是再增加一些我对这些问题的认识。专题的顺序与原书不一致,其中的原因是我在学习机器学习的过程中遇到了问题会翻阅一些书,所以,顺序与我学习时遇到的问题是相关的。借此机会,感谢那些默默支持我的人,我会更加努力写出高质量的博文。

一、什么是TF-IDF

    首先解释下TF-IDF的全称,TF-IDF全称是Term Frequency / Inverse Document Frequency,全称的意思为词频、逆文本频率。

    在我们处理文本时,例如,对于一篇文章,文章是由很多的词组成,通过与我们的词库对比,我们可以很容易的过滤掉一些公认的停止词(Stop Word),只保留一些关键词。停止词是指对文章的主题没有任何帮助却在文章中大量出现的一些词,如“的”、“是”等。剩下的关键词也并不是都是同等重要的,我们要确定关键词在文章中的权重,这样我们才能确定文章的主题,此时,我们就可以使用TF-IDF来计算各个关键词的权重。   

二、如何计算TF-IDF值

    对于一个处理好的词项-文档矩阵:

文章有:d1,d2,d3,d4,d5和d6,关键词有:“ship”,“boat”,“ocean”,“wood”和“tree”。矩阵中的数字表示词在对应文章中出现的次数。

1、TF的计算 

2、IDF的计算 

3、TF-IDF的值

   TF-IDF的值即为最终的权重,是将TF值与IDF值相乘,则对于关键词“ship”的TF-IDF值为:

三、实际的例子

    选择了9个标题:(参考文献2)

The Neatest Little Guide to Stock Market Investing

Investing For Dummies, 4th Edition

The Little Book of Common Sense Investing: The Only Way to Guarantee Your Fair Share of Stock Market Returns

The Little Book of Value Investing

Value Investing: From Graham to Buffett and Beyond

Rich Dad's Guide to Investing: What the Rich Invest in, That the Poor and the Middle Class Do Not!

Investing in Real Estate, 5th Edition

Stock Investing For Dummies

Rich Dad's Advisors: The ABC's of Real Estate Investing: The Secrets of Finding Hidden Profits Most Investors Miss

去掉了停止词“and”,“edition”,“for”,“in”,“little”,“of”“the”,“to”。我们可以得到以下的词项-文档矩阵:

最终的结果为:

MATLAB源码

TF_IDF函数

function [ dataMade ] = TFIDF( dataSet )
    [m,n] = size(dataSet);%计算dataSet的大小,m为词的个数,n为标题的个数
    
    %rowSum = sum(dataSet);% 每个标题中关键词的总和
    rowSum = [8,6,19,6,8,19,6,4,18];
    colSum = sum(dataSet,2);% 每个词在不同标题中出现的总和
    
    dataMade = zeros(m,n);% 构造一个一样大小的矩阵,用于存储TF-IDF值
    for i = 1:m
        TempIDF = log2(n./colSum(i,:));
        for j = 1:n
            dataMade(i,j) = (dataSet(i,j)./rowSum(:,j))*TempIDF;
        end
    end
end

主函数

%% TF_IDF

% load data
% 注意每一列为标题,每一行为词
dataSet = [0	0	1	1	0	0	0	0	0
0	0	0	0	0	1	0	0	1
0	1	0	0	0	0	0	1	0
0	0	0	0	0	0	1	0	1
1	0	0	0	0	1	0	0	0
1	1	1	1	1	1	1	1	1
1	0	1	0	0	0	0	0	0
0	0	0	0	0	0	1	0	1
0	0	0	0	0	2	0	0	1
1	0	1	0	0	0	0	1	0
0	0	0	1	1	0	0	0	0
];

% 计算TF-IDF值
data = TFIDF(dataSet);

注意点:在参考文献2中有两个问题:

参考文献

1、《数学之美》吴军 著. 第11章 如何确定网页和查询的相关性. P105-110.

2、http://www.puffinwarellc.com/index.php/news-and-articles/articles/33-latent-semantic-analysis-tutorial.html:a small example

$(".MathJax").remove();