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

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

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

一、什么是TF-IDF      首先解释下TF-IDF的全称,TF-IDF全称是Term Frequency / Inverse Document Frequency,全称的意思为词频、逆文本频率。       在我们处理文本时,例如,对于一篇文章,文章是由很多的词组成,通过与我们的词库对比,我们可以很容易的过滤掉一些公认的停止词(Stop Word),只保留一些关键词。停止词是指对文章的主题没有任何帮助却在文章中大量出现的一些词,如“的”、“是”等。剩下的关键词也并不是都是同等重要的,我们要确定关键词在文章中的权重,这样我们才能确定文章的主题,此时,我们就可以使用TF-IDF来计算各个关键词的权重。       TF是指一个词在一篇文章中出现的频率。单纯使用TF将会出现一些问题,问题是一些通用的词对于主题并没有太大的作用,反倒是一些出现频率较少的词才能够表达文章的主题。所以权重的设计必须满足:一个词预测主题的能力越强,权重越大,反之,权重越小。 所有统计的文章中,一些词只是在其中很少几篇文章中出现,那么这样的词对文章的主题的作用很大,这些词的权重应该设计的较大。IDF就是在完成这样的工作,如果一个关键词

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

篇文章中出现,那么

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

越大,关键词

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

的权重反倒是越小。最后我们将TF的值和IDF的值综合考虑,便能得到关键词的权重:

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

二、如何计算TF-IDF值      对于一个处理好的词项-文档矩阵:

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF


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

1、TF的计算     TF表示词在一篇文章中出现的频率。这里我们假设每篇文章的词的个数为

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

。则词“ship”在文章d1中的TF值为:

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

。其他的可以依次类比。

2、IDF的计算     IDF的公式为:

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

其中,

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

表示全部的文章数,

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

表示关键词

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

出现的文章数。如关键词“ship”在文章d1和d3中出现,则

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

,而全部的文章数

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

。则

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

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

www.zeeklog.com  - 《数学之美》拾遗——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”。我们可以得到以下的词项-文档矩阵:

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF


最终的结果为:

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF


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、在求解TF时,TF的分母应该是整个文本的长度,可参见维基百科

2、在求解IDF时,取对数的

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

时应该是以2为底,而不是以

www.zeeklog.com  - 《数学之美》拾遗——TF-IDF

为底。

参考文献  1、《数学之美》吴军 著. 第11章 如何确定网页和查询的相关性. P105-110.   2、:a small example

Read more

深入理解 Proxy 和 Object.defineProperty

在JavaScript中,对象是一种核心的数据结构,而对对象的操作也是开发中经常遇到的任务。在这个过程中,我们经常会使用到两个重要的特性:Proxy和Object.defineProperty。这两者都允许我们在对象上进行拦截和自定义操作,但它们在实现方式、应用场景和灵活性等方面存在一些显著的区别。本文将深入比较Proxy和Object.defineProperty,包括它们的基本概念、使用示例以及适用场景,以帮助读者更好地理解和运用这两个特性。 1. Object.defineProperty 1.1 基本概念 Object.defineProperty 是 ECMAScript 5 引入的一个方法,用于直接在对象上定义新属性或修改已有属性。它的基本语法如下: javascript 代码解读复制代码Object.defineProperty(obj, prop, descriptor); 其中,obj是目标对象,prop是要定义或修改的属性名,descriptor是一个描述符对象,用于定义属性的特性。 1.2 使用示例 javascript 代码解读复制代码//

By Ne0inhk

Proxy 和 Object.defineProperty 的区别

Proxy 和 Object.defineProperty 是 JavaScript 中两个不同的特性,它们的作用也不完全相同。 Object.defineProperty 允许你在一个对象上定义一个新属性或者修改一个已有属性。通过这个方法你可以精确地定义属性的特征,比如它是否可写、可枚举、可配置等。该方法的使用场景通常是需要在一个对象上创建一个属性,然后控制这个属性的行为。 Proxy 也可以用来代理一个对象,但是相比于 Object.defineProperty,它提供了更加强大的功能。使用 Proxy 可以截获并重定义对象的基本操作,比如访问属性、赋值、函数调用等等。在这些操作被执行之前,可以通过拦截器函数对这些操作进行拦截和修改。因此,通过 Proxy,你可以完全重写一个对象的默认行为。该方法的使用场景通常是需要对一个对象的行为进行定制化,或者需要在对象上添加额外的功能。 对比 以下是 Proxy 和 Object.defineProperty 的一些区别对比: 方面ProxyObject.defineProperty语法使用 new Proxy(target,

By Ne0inhk