机器学习::文本特征提取(TF-IDF) - 第二部分

阅读本教程的第一部分:文本特征提取(tf-idf) -第一部分

这篇文章是一个延续我们开始学习文本特征提取和矢量空间模型表示的理论和实践的第一部分。我真的推荐你阅读第一部分后一系列以遵循这个第二。

因为很多人喜欢本教程的第一部分,所以第二部分比第一部分稍微长一些。

介绍

在第一篇文章中,我们学会了如何使用术语频率表示向量空间中的文本信息。然而,术语-频率方法的主要问题是,它放大频繁项和缩小比高频项经验更丰富的稀有项。基本的直觉是,在许多文档中经常出现的术语并不是很好的鉴别器,而是真正有意义的(至少在许多实验测试中);这里的重要问题是:为什么你,比如在一个分类问题中,要强调一个几乎在你文档的整个语料库中都存在的术语?

TF-IDF重量来解决这个问题。TF-IDF给出的是一个在集合中的文档中的一个单词,这就是为什么TF-IDF包含本地和全局参数,因为它不仅考虑了孤立的术语,还考虑了文档集合中的术语。什么TF-IDF然后解决这个问题,是在缩放罕见术语时缩小频繁的术语;一个比另一个发生的10倍的术语不是它比它更重要的10倍,这就是为什么TF-IDF使用对数刻度来做到这一点。

让我们回到它的定义\ mathrm {tf}(t,d)哪一个实际上是一个学期的学期计数T.在文件中D..使用这个简单的频率项可能会导致这样的问题滥用关键字,即我们在文件中有一个重复的术语,目的是提高其在IR中的排名(信息检索)系统,甚至对长文档产生偏见,使它们看起来比实际更重要,仅仅因为这个词在文档中出现的频率很高。

为了克服这一问题,采用了频率项\ mathrm {tf}(t,d)对于向量空间上的文档,通常也归一化。我们看看如何对这个向量进行标准化。

矢量归一化

假设我们要对频率向量进行标准化\ vec {v_ {d_4}}我们在本教程的第一部分计算。文件D4本教程的第一部分有这样的文本表示:

D4:我们可以看到闪亮的阳光,明亮的阳光。

使用该文档的非归一化项频率的向量空间表示为:

\ vec {v_ {d_4}} =(0,2,1,0)

对向量进行规格化,就相当于计算单位矢量向量,它们用“帽子”表示法表示:\ hat {v}.单位向量的定义\ hat {v}一个向量的\ vec {v}是:

\ displaystyle \帽子{v} = \压裂vec {v}} {\ vec {v} {\ | \ \ | _p}

那里\ hat {v}是单位矢量,或归一化的矢量,\ vec {v}是矢量将被标准化和\ | \ vec {v} \ | _p向量的模(模,长度)是多少\ vec {v}p L ^空间(别担心,我要解释一下)。

单位向量实际上就是向量的标准化版本,是一个长度为1的向量。

正常化过程(来源:http://processing.org/learning/pvector/)
正常化过程(来源:http://processing.org/learning/pvector/)

但这里的重要问题是如何计算矢量的长度和理解这一点,您必须了解的动机p L ^空间,也叫勒贝格空间

勒贝格空间

这个向量有多长?(来源:资料来源:http://processing.org/learning/pvector/)
这个向量有多长?(来源:资料来源:http://processing.org/learning/pvector/)

通常是向量的长度\ vec {u} =(u_1,u_2,u_3,\ ldots,u_n)是使用欧几里德准则-常态是一个函数,为矢量空间中的所有向量分配严格的正长度或大小-,其定义为:

(来源:http://processing.org/learning/pvector/)
(来源:http://processing.org/learning/pvector/)

\ | \ VEC【U} \ |= \ SQRT【U ^ 2_1 + U ^ 2_2 + U ^ 2_3 + \ ldots + U ^ 2_n}

但这不是定义长度的唯一方法,这就是为什么(有时)你会看到一个数字P.加上规范符号,比如invec{你}\ | \ \ | _p.这是因为它可以被概括为:

\的DisplayStyle \ | \ VEC【U} \ | _p =(\左| U_1 \右| ^ P + \左| U_2 \右| ^ P + \左| U_3 \右| ^ P + \ ldots + \左|u_n \右| ^ p)^ \压裂{1} {p}

并简化为:

vec{你}\ displaystyle \ | \ \ | _p =(\ \和limits_ {i = 1} ^ {n} \左右vec{你}_i | \ \ | ^ p) ^ \压裂{1}{p}

所以当你读到aL2-norm,你正在读关于欧几里德准则规范P = 2.用于测量的矢量的长度的最常用标准,通常称为“大小”;其实,当你有一个不合格的长度测量(不P.号码),你有L2-norm(欧几里得范数)。

当你读到一个L1-NOM,你正在阅读常态p = 1,定义为:

\ displaystyle \ | \ vec {u} \ | _1 =(\ left | u_1 \ light | +左| u_2 \ revent | +左| u_3 \ revent | + \ ldots + \ left | u_n \ left |)

这只不过是载体的组件的简单总和,也称为出租车的距离,也称为曼哈顿距离。

出租车几何与欧几里得距离:在出租车几何所有三个描绘线具有对于相同的路径具有相同的长度(12)。在欧几里德几何,绿色的线有长度,6 \ times \ sqrt {2} \约8.48,是唯一的最短路径。
来源:维基百科::出租车几何

请注意,您还可以使用任何规范来规范向量,但我们将使用最常见的规范,L2-NOM,这也是0.9版本中的默认值scikits.learn.You can also find papers comparing the performance of the two approaches among other methods to normalize the document vector, actually you can use any other method, but you have to be concise, once you’ve used a norm, you have to use it for the whole process directly involving the norm (一个使用l1范数的单位向量的长度不会是1如果你稍后要取它的l2范数的话).

回到向量规范化

既然你知道矢量规范化过程是什么,我们可以尝试一个具体的例子,使用L2-rom的过程(现在我们现在使用正确的术语)来规范化我们的矢量\ vec {v_ {d_4}} =(0,2,1,0)为了得到它的单位向量\ hat {v_ {d_4}}.为了做到这一点,我们将简单地把它代入单位向量的定义中来求值:

\ hat {v} = \ frac {\ vec {v}} {\ | \ vec {v} \ | _p} \\ \\ \\ \ hat {v_ {d_4}} = \ frac {\ vec {v_ {d_4}}} {|| \ vec {v_ {d_4}} || _2} \\ \\ \\ \ hat {v_ {d_4}} = \ frac {(0,2,1,0)} {\ sqrt {0^ 2 + 2 ^ 2 + 1 ^ 2 + 0 ^ 2}} \\ \\ \ hat {v_ {d_4}} = \ frac {(0,2,1,0)} {\ sqrt {5}}} \\\ \ small \ hat {v_ {d_4}} =(0.0,0.89442719,0.4472136,0.0)

那就是它!我们的规范化矢量\ hat {v_ {d_4}}现在有一个l2-norm\ | \ hat {v_ {d_4}} \ | _2 = 1.0

注意,在这里我们已经标准化了术语频率文档向量,但稍后我们将在计算tf-idf之后进行该操作。

术语频率-反文档频率(tf-idf)权重

现在您已经了解了向量规范化在理论和实践中的工作方式,让我们继续本教程。假设你的集合中有以下文档(取自教程的第一部分):

火车文件集:D1:天空是蓝色的。D2:太阳很明亮。测试文件集:D3:天空中的太阳很明亮。D4:我们可以看到闪亮的阳光,明亮的阳光。

您的文档空间可以定义为d = \ {d_1,d_2,\ ldots,d_n \}在哪里N您的语料库中文档的数量,在我们的情况下是多少D_{train} = \{d_1, d_2\}d_ {test} = \ {d_3,d_4 \}.我们的文档空间的基数被定义左\ | {D_{火车}}\ | = 2左\ | {D_{测试}}\ | = 2,因为我们只有两个文档用于培训和测试,但它们显然不需要具有相同的基数。

我们现在看,如何定义IDF(逆文档频率):

\ displaystyle \ mathrm {idf} (t) = \ log{\压裂{\左| D \右|}{1 +左| \ \ {D: t \ D \} \右|}}

在哪里{d: t \in d\}\右|是个文件数其中术语T.出现,当术语频率函数满足时\ mathrm {tf} (t, d) \ neq 0,我们只加1代入公式,以避免零分。

TF-IDF的公式是:

\ mathrm {tf \ mbox { - } IDF}(t)= \ mathrm {tf}(t,d)\ times \ mathrm {idf}(t)

和该公式具有重要的后果:当你有给定文档中高词频(TF)达到TF-IDF计算的高权重(本地参数)和整个集合中的术语的低文档频率(全局参数).

现在让我们用我们在第一个教程中计算的术语频率来计算特征矩阵中每个特征的idf:

M_ {rain} = \ begin {bmatrix} 0&1&1&1 \\ 0&2&1&0 \ END {BMATRIX}

因为我们有4个特点,我们要计算\ mathrm {idf} (t_1)\ mathrm {idf} (t_2)\ mathrm {idf} (t_3)\ mathrm {idf} (t_4)

\ mathrm {idf}(t_1)= \ log {\ frac {\ left | d \ light |} {1+ \ left | \ {d:t_1 \ in d \} \ light |}}} = \ log {\ frac{2} {1}} = 0.69314718

\ mathrm {IDF}(T_2)= \日志{\压裂{\左| d \右|} {1+ \左| \ {d:T_2 \在d \} \右|}} = \日志{\压裂{2} {3}} = -0.40546511

\ mathrm {idf} (t_3) = \ log{\压裂{\左| D \右|}{1 +左| \ \{在D D: t_3 \ \} \右|}}= \ log{\压裂{2}{3}}= -0.40546511

\ mathrm {IDF}(T_4)= \日志{\压裂{\左| d \右|} {1+ \左| \ {d:T_4 \在d \} \右|}} = \日志{\压裂{2} {2}} = 0.0

这些IDF权重可以由向量表示为:

\vec{idf_{train}} = (0.69314718, -0.40546511, -0.40546511, 0.0)

现在我们拥有我们的矩阵,具有术语频率(m_ {火车})和表示矩阵的每个特征的IDF的矢量(\ vec {idf_ {train}}),我们可以计算我们的TF-IDF重量。我们要做的是矩阵中每列的简单乘法m_ {火车}与相应的\ vec {idf_ {train}}向量维度。要做到这一点,我们可以创建一个正方形对角矩阵被称为m_ {idf}竖直方向和水平方向都等于这个向量\ vec {idf_ {train}}尺寸:

M_{idf} = begin{bmatrix} 0.69314718 & 0 & 0 & 0\\ 0 & -0.40546511 & 0\\ 0 & 0\\ 0 & -0.40546511 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\ end{bmatrix}

然后将其乘以term frequency matrix,则最终结果可定义为:

M_{tf\mbox{-}idf} = M_{train} \乘以M_{idf}

请注意,矩阵乘法是不可交换的,结果一个\ times b会不会有不同的结果b \ times a,这就是为什么m_ {idf},以达到将每个idf值乘以其相应特性的预期效果:

\ begin {bmatrix} \ mathrm {tf}(t_1,d_1)&\ mathrm {tf}(t_2,d_1)&\ mathrm {tf}(t_3,d_1)&\ mathrm {tf}(t_4,d_1)\\\ mathrm {tf}(t_1,d_2)&\ mathrm {tf}(t_2,d_2)&\ mathrm {tf}(t_3,d_2)&\ mathrm {tf}(t_4,d_2)\ ent {bmatrix} \ times\ begin {bmatrix} \ mathrm {idf}(t_1)&0&0&0 \\ 0&\ mathrm {idf}(t_2)&0&0&0&0&0 \\ 0&0&\ mathrm {idf}(t_3)&0 \\ 0&0&0&0&\ mathrm {idf}(t_4)\ neg {bmatrix} \\ = \ begin {bmatrix} \ mathrm {tf}(t_1,d_1)\ times \ mathrm {idf}(t_1)&\ mathrm {tf}(t_2,d_1)\ times \ mathrm {idf}(t_2)&\ mathrm {tf}(t_3,d_1)\ times \ mathrm {idf}(t_3)&\ mathrm {tf}(t_4那D._1) \times \mathrm{idf}(t_4)\\   \mathrm{tf}(t_1, d_2) \times \mathrm{idf}(t_1) & \mathrm{tf}(t_2, d_2) \times \mathrm{idf}(t_2) & \mathrm{tf}(t_3, d_2) \times \mathrm{idf}(t_3) & \mathrm{tf}(t_4, d_2) \times \mathrm{idf}(t_4)   \end{bmatrix}

现在让我们看一个具体的乘法例子:

M_ {tf \ mbox {-} idf} = M_ M_ {idf{火车}\倍 } = \\   \ 开始{bmatrix} 0 & 1 & 1 & 1 \ \ 0 & 2 & 1 & 0 \ {bmatrix}结束\ * \ {bmatrix}开始0.69314718 & 0 & 0 & 0 \ \ 0 & -0.40546511 & 0 & 0 \ \ 0 & 0 & -0.40546511 & 0 \ \ & 0 & 0 & 0 \ {bmatrix结束 } \\   =   \ 开始{bmatrix} & -0.40546511 & -0.40546511 & 0 & -0.81093022 & \ \ 0-0.40546511 & 0 \end{bmatrix}

最后,我们可以把L2标准化过程应用到M_ {TF \ MBOX { - }} IDF矩阵。请注意,这种标准化是“逐行”因为我们要处理矩阵的每一行作为一个被标准化的独立向量,而不是矩阵作为一个整体

m_ {tf \ mbox { - } IDF} = \ frac {tf \ mbox { - } IDF}} {\ | m_ {tf \ mbox { - } IDF} \ | _2} = \ begin {bmatrix} 0&-0.70710678&0 \\ 0&-0.89442719&-0.4472136&0 \ end {bmatrix}

这是我们标准化的tf-idf权值我们的测试文档集,它实际上是一个单位向量的集合。如果你取矩阵每一行的l2范数,你会发现它们的l2范数都是1。

Python练习

使用的环境Python v.2.7.2.Numpy 1.6.1Scipy v.0.9.0Sklearn(Scikits.Learn)V.0.9

现在轮到你等待的那部分了!在本节中,我将使用Python来展示tf-idf计算的每一步Scikit.learn特征提取模块。

第一步是创建我们的培训和测试文档集,并计算术语频率矩阵:

来自sklearn.feature_extraction.text导入countvectorizer train_set =(“天空是蓝色的。”,太阳很明亮。“)test_set =(”天空中的太阳很明亮。“,”我们可以看到闪亮的太阳,明亮的太阳。“)count_vectorizer = countvectorizer()count_vectorizer.fit_transform(train_set)打印”词汇表:“,count_vectorizer.vocubulary #ocomabulary:{'blue':0,'sun':1,'亮':2,'sky','sky':3} freq_term_matrix = count_vectorizer.transform(test_set)print freq_term_matrix.todense()#[[0 1 1 1]#[0 2 1 0]]

现在我们有频率术语矩阵(调用freq_term_matrix.),我们可以实例化tfidftransformer.,这将负责计算我们术语频率矩阵的TF-IDF权重:

从sklearn.feature_extraction。T.ext import TfidfTransformer tfidf = TfidfTransformer(norm="l2") tfidf.fit(freq_term_matrix) print "IDF:", tfidf.idf_ # IDF: [ 0.69314718 -0.40546511 -0.40546511 0. ]

注意,我已经指定了L2范数,这是可选的(实际上默认是L2范数),但我已经添加了参数来明确地告诉你它将使用L2范数。还要注意,您可以通过访问调用的内部属性来查看计算出的idf权重idf_.现在符合()方法已经计算出矩阵的idf,让我们转换freq_term_matrix.到TF-IDF权重矩阵:

Tf_idf_matrix = tfidf.transform(freq_term_matrix) print Tf_idf_matrix .todense() # [[0.]-0.70710678 - -0.70710678 0。[0。-0.89442719 - -0.4472136 0。]]

就是这样tf_idf_matrix实际上是我们之前的M_ {TF \ MBOX { - }} IDF矩阵。你可以通过使用矢量化器类Scikit.learn的这是一个矢量器自动结合CountVectorizertfidftransformer.给你。看到这个例子要知道如何将其用于文本分类过程。

我真的希望你喜欢这个帖子,我试图让它尽可能的简单,即使对那些没有必要的数学背景的线性代数等。在下一篇机器学习的文章中,我希望展示如何使用tf-idf来计算余弦相似度。

如果你喜欢它,请随意评论,提出建议,改正,等等。

引用本文为:基督教S. Perone,“机器学习::文本特征提取(TF-IDF) - 第二部分”,在亚洲金博宝Terra Incognita.03/10/2011,//www.cpetem.com/2011/10/machine-learning-text-feature-extraction-tf-idf-part-ii/

参考文献

反文档频率的理解:关于IDF的理论论证

维基百科:: TF-IDF

经典的向量空间模型

Sklearn文本特征提取码

更新

2015年3月13日-格式,固定的图像问题。
2011年10月3日-添加了关于Python示例的环境的信息

103思想“机器学习::文本特征提取(TF-IDF) - 第二部分”

  1. 哇!
    很好的tf-idf介绍,非常感谢!亚洲金博宝亚洲金博宝非常有趣,我一直想研究这个领域很长时间,你的帖子是一个真正的礼物。阅读更多关于该技术用例的亚洲金博宝内容将是非常有趣的。如果有其他的文本语料库表示方法,你可能会感兴趣。
    (对不起英语不好,我正在努力改进它,但还有很多工作要做)

  2. 优秀的工作基督教!我期待着阅读您关于文档分类、聚类和使用朴素贝叶斯提取主题、随机梯度下降、Minibatch-k-Means和非负矩阵分解的下一篇文章

    此外,Scikit-Learn的文档在文本特征提取部分上真正糟糕(我是主要的罪魁祸首......)。如果您想掌握当前情况,请随时加入邮件列表。

    1. 伟大的谢谢奥利维尔。我真的想帮助Sklearn,我只需要更多的时间来做这么做,你们已经做了一个很好的工作,我真的在Lib中已经实施的算法留下了深刻的印象,保持了良好的工作!

  3. 我更喜欢这个教程,因为我在这里学习的新概念的水平。
    那就是说,你用的是哪个版本的scikits-learn ?
    Easy_Install安装的最新似乎有一个不同的模块层次结构(i.e在Sklearn中没有找到Feature_Extraction)。如果您可以提及您使用的版本,我将尝试使用这些示例。

  4. 第3部分在哪里?我必须在4天内提交关于矢量空间建模的作业。任何期待在周末放弃吗?

  5. 谢谢基督徒!在传亚洲金博宝染媒介空间的一个非常好的工作与sklearn。我刚刚有一个问题,假设我已经计算了'tf_idf_matrix',我想计算成对余弦相似度(每个行之间)。我有稀疏矩阵格式的问题,可以请举一个例子吗?我的矩阵也很大,比如25k乘60k。非常感谢!

  6. 伟大的职位......我明白了什么TF-IDF以及如何与一个具体的例子实施。但我发现2周的事情,我不知道:
    1-你叫这个二维矩阵M_train,但是它有D3和D4文档的tf值,所以你应该叫这个矩阵M_test而不是M_train。因为D3和D4是我们的测试文档。
    2-当你计算t2 (sun)的idf值时,它应该是log(2/4)。因为文档的数量是2。D3有1次单词“sun”,D4有2次。它是3,但我们也在这个值上加1来消去除以0的问题。我说的对吗,还是我遗漏了什么?
    谢谢你。

    1. 你是正确的:这些都是非常优秀的博客文章,但是作者真的有义务/责任回去改正错误,比如下面的(或者其他的,比如第一部分;……):缺少训练是重中之重;设置stop_words参数;在我的电脑上,词汇索引也是不同的。

      虽然我们非常感谢作者的努力,但对于那些纠结于原著中那些(未改正的)错误的人来说,这也是一种极大的伤害。

      1. Re:我的'你是正确的评论'(上面),我应该补充说:

        “......注意到Frédériquepossot的评论(下面)关于分母:

        '......我们使用的是,无论在任何给定文件中发生术语的次数,我们都使用的文件数量是术语的次数。在这种情况下,T2的IDF值中的分母确实是2 + 1(2个文件具有“SUN”,+1,以避免潜在的零分裂错误)。'“

    2. 哈立德,
      这是对一个老问题的回答。亚洲金博宝但是,我还是想回应交流我从文章中理解的东西。
      你的问题2:“当你计算t2 (sun)的idf值时,它应该是log(2/4)”
      我的理解是:log term的分母应该是(该term出现的文档数量+ 1),而不是该term出现的频率。术语“Sun”出现的文档数量是2 (D3中出现1次,D4中出现2次——总共在两个文档中出现3次。3为频次,2为文档数量)。因此分母是2 + 1 = 3。

  7. 优秀的帖子!
    我有一些问题。从最后的TF-IDF重量矩阵,我们如何分别获得术语的重要性(例如,这是最重要的术语?)。我们如何使用这个矩阵对文件进行分类

  8. 太感谢了。你在这样一个简单的方法来解释它。这是非常有用的。再次感谢了很多。

  9. 我与杰克一样怀疑(最后的评论)。从最后的TF-IDF重量矩阵,我们如何分别获得术语的重要性(例如,这是最重要的术语?)。我们如何使用此矩阵来对文档进行分类。

  10. 我有个问题..
    在TF-IDF操作后,我们得到与值的numpy的阵列。假设我们需要从阵列中获得最高50个值。我们怎样才能这样做?

    1. F(IDF)的高值表示特定的载体(或文件)具有高局部强度和低的全球强度,在这种情况下,您可以假设它在本地具有高意义并且不能忽略的术语。与Funtion(TF)相比,只有术语重复大量的次数,是更重要的是,大部分时间都不是一个正确的建模技术。

  11. 嘿 ,
    谢谢fr d代码,确实很有帮助!亚洲金博宝

    1.对于文档聚类,在计算倒词频后,是使用Jaccards系数这样的关联系数,然后使用k-means这样的聚类算法,还是在计算倒词频后直接对文档向量应用d k-means ?

    2.如何对文档聚类进行计算文档向量的倒数术语频率如何?

    非常感谢您的回复!

  12. @Khalid:你在1中指出的-也让我困惑了一分钟(M_train vs M_test)。不过,我认为你在第二点上是错误的,因为我们使用的实际上是某个术语出现的文档数量,而不管该术语在任何给定文档中出现的次数。在这种情况下,t2(“sun”)的idf值的分母确实是2+1(2个文档使用术语“sun”,+1以避免潜在的零除法错误)。

    我也喜欢阅读这个系列的第三部分!我特别有兴趣了解更多关于功能选择的更多信息。是否有一种惯用的方法来获得具有最高TF.idf分数的条款的排序列表?您如何确定整体术语?您如何获得最负责高或低余弦的相似性(行按行)?

    谢谢你的精彩帖子!

  13. 优秀文章和一个伟大的介绍TD-IDF正常化。

    您有一个非常明确和结构亚洲金博宝化的方式解释这些困难的概念。

    谢谢!

      1. 亚洲金博宝非常好的和信息丰富的教程....请上传更多文档聚类过程相关的教程。

  14. 你能提供任何参考来使用tfidf做余弦相似度吗我们有tf-idf的矩阵我们如何使用它来计算余弦。谢谢你的精彩文章。

  15. 如果我是wordg,请纠正我
    从“我们在第一个教程中计算过的频率”开始的公式:应该是Mtest而不是Mtrain。这些idf权值可以用向量表示为:"应该是idf_test而不是idf_train。

    顺便说一下,伟大的系列,你能给一个简单的方法如何实现分类吗?

  16. 亚洲金博宝很好的文章。恭喜! !

    为了展示你的成果,我有一个问题:

    我在维基百科读了:
    成比例的TF-IDF值增加到的次数的字出现在文档中,但是通过在语料库中的字,这有助于控制的事实,一些词语通常比另一些更常见的频率偏移。

    当我阅读它的时候,我明白了如果一个单词出现在所有文档中,那么它的重要性要低于只出现在一个文档中的单词:

    然而,在结果中,“太阳”或“明亮”一词比“天空”最重要。

    我不知道的完全地理解它。

  17. 好极了!我以前熟悉tf-idf,但我发现你的scikits的例子很有帮助,因为我正试图学习那个包。

  18. 优秀的帖子!在寻找CountVectorizer的更多信息时偶然发现了这个问题,但我很高兴阅读了您的两篇文章(第1部分和第2部分)。

    现在用书签您的博客

  19. 似乎不像你描述的fit_transform() ..
    任何想法,为什么?
    >>> TS
    ('天空是蓝色','太阳很明亮')
    >>> v7 = CountVectorizer()
    > > > v7.fit_transform (ts)
    <2×2类型稀疏矩阵"
    具有4个存储元素,坐标格式>
    >>>打印v7.vocabulary_
    {u'is’:0,u'the”:1}

    1. 实际上,第一个Python样本中有两个小错误。
      1.CountVectorizer应该像这样实例化:
      count_vectorizer = CountVectorizer(STOP_WORDS = '英语')
      这将确保' is ', ' the '等被删除。

      2.要打印词汇表,必须在末尾加上下划线。
      打印“词汇:”,count_vectorizer.vocabulary_

      很棒的教程,只是一些小事。希望它能帮助别人。

  20. 谢谢你精彩的解释。

    我有一个关于计算IDF(T#)的问题。
    在第一种情况下,你写idf(t1) = log(2/1),因为我们的集合中没有这个项,因此,分母加1。现在,对于t2,你写的是log(2/3)为什么分母是3而不是4 (=1+2+1)对于t3,你写:log(2/3),因此分母等于3(=1+1+1)。我看到这里有点不一致。你能解释一下,分母是怎么计算出来的吗?

    谢谢。

    1. 您遇到了错误的是,在分母中,您没有在每个文档中将术语的总和放在每个文档中,只需总结至少一个术语“术语”的所有文件。

  21. 如果你能提供一种方法来了解如何使用ft-idf对文件进行分类,那就再好不过了。我看到了那个例子(python代码),但如果有算法,那是最好的,因为不是所有人都能理解这种语言。

    谢谢

  22. 好的。解释有助于将事物置于视角。TF-IDF是群集的好方法(例如,使用Jaccard分析或差异与来自已知语料库的平均值)?

    继续写:)

  23. 嗨基督徒,

    能读到这篇文章,我感到非亚洲金博宝常兴奋和幸运。你理解的清晰体现在文件的清晰上。这让我在机器学习领域重拾信心。

    非常感谢美丽的解释。

    想从你身上读到更多。

    谢谢,
    neethu

  24. 非常感谢你非常,非常亚洲金博宝美妙的和有用的。

  25. 谢谢你的良好的收官之作。你提到一些这比较L1和L2规范的论文,我计划研究,多一点深入。你还知道他们的名字?

  26. 我如何能计算TF IDF为自己的文本文件,它位于一些地方在我的电脑?

  27. 才华横溢的文章。

    到目前为止,这是我读过的关于tf-tdf的最简单、最合理的解释。我很喜欢你解释背后的数学原理。

  28. 嗨,好的文章!我使用scikit学习的TfidVectorizer模块来生成范数=l2的tf-idf矩阵。我已经检查了TfidfVectorizer在语料库的fit_transform之后的输出,我称之为tfidf_matrix。我对行求和,但它们的和不是1。代码是vect = TfidfVectorizer(use_idf=True, sublunar_tf=True, norm= " l2)。tfidf_matrix = vect.fit_transform(数据)。当我运行tfidf_matrix.sum(axis=1)时,向量大于1。也许我看错矩阵了,或者我误解了标准化的原理。我希望有人能澄清这一点!谢谢

  29. 请问你在计算IDF的时候,比如log(2/1),你是用log以10 (e)为底还是用其他的值?我得到了不同的计算!

  30. 伟大的教程,刚刚开始一个新的工作在ML和这解释事情非常清楚,因为它应该是。亚洲金博宝

  31. Execellent Post ...... !!!感谢本文的很多。

    但是我需要更多的信息,因为你展示了python的实用性,你能提供JAVA语言吗?

  32. 我有点困惑为什么TF-IDF在这种情况下给出负数?我们如何解释它们?如果我错了,但是当向量具有正值时,它意味着该组件的大小确定了该文档中该词在该文档中的重要性。如果它是否定的,我不知道如何解释它。如果我要用所有阳性组分和一个具有负组件的向量的点产物,那将意味着一些组件即使对载体对特定单词的重要性非常重要,则某些组件可能会产生否定。亚洲金博宝

  33. 你好,
    非常感谢您对此主题的详细说明,真的很棒。无论如何,你能给我一个暗示我继续看到的错误的源泉:

    freq_term_matrix = count_vectorizer.transform (test_set)
    AttributeError: ' matrix ' object has no attribute ' transform '

    我是否使用了一个错误的sklearn版本?

  34. 很棒的简单有效的解释。请在更加令人敬畏的解释中发布更多主题。向前撰写即将到来的文章。
    谢谢

  35. 谢谢克里斯,你是网络上唯一一个关于对角线矩阵的网络。

  36. 我明白了TF-IDF计算处理。不过这是什么矩阵均值,以及我们如何使用TFIDF矩阵计算相似度让我困惑。你能解释一下,我们如何利用TFIDF矩阵.thanks

  37. 最好的解释..非常有帮助。亚洲金博宝你能告诉我如何绘制矢量文本分类的SVM ..我在微博分类工作。我很困惑,请帮助我。

  38. 您好,我很抱歉,如果我有错,但我不明白是怎么|| VD4 || 2 = 1。
    d4的值=(0.0,0.89,0.44,0.0)所以归一化将是=根号(平方(.89)+平方(.44))=根号(.193)= .44
    那我错过了什么?请帮我理解。

  39. 嗨,这是一个伟大的博客!
    如果我需要做双格案例,我如何使用sklearn来完成它?

  40. 它非常伟大。亚洲金博宝我喜欢你的教导。亚洲金博宝非常非常棒

  41. 当我执行相同的脚本时,我没有得到同样的结果。
    print (" IDF: ", tfidf.idf_): IDF: [2.09861229 1. print (" IDF: ", tfidf.idf_);1.40546511 - 1。]

    我的Python版本是:3.5
    Scikit学习版是:o.18.1

    我需要改变什么?可能的错误是什么?

    谢谢,

    1. 可能有很多原因,因为你使用的是不同的Python解释器版本和不同的Scikit-Learn版本,你应该会看到结果的不同,因为它们可能改变了默认参数、算法、舍入等。

  42. 完美的介绍!
    没有的变戏法。清晰而简单,就像技术应该的那样。
    亚洲金博宝很有帮助
    非常感谢。亚洲金博宝
    张贴!
    obrigado

  43. 为什么| D |= 2,在IDF方程中。不应该是4以来| D |表示所考虑的文件数,我们有2个测试,2来自火车。

  44. 嗨,克里斯汀
    你的帖子对我从基础上理解tfd-idf很有帮助。我正在做一个分类项目,我使用向量空间模型,这将决定我的测试文档应该出现的类别。这是机器学习的一部分。如果你能给我一些相关的建议就太好了。我在这一点上卡住了。
    谢谢你

  45. 请参阅此示例了解如何将其用于文本分类过程。“此”链接不再工作。能否提供一个相关的例子链接。

    谢谢

  46. 肯定有很多了解这个主题。我真的很喜欢你所做的一切。

  47. 1vbxlh你已经提出了一个非常精彩的细节,欣赏它的帖子。亚洲金博宝

  48. 我知道这个网站提供高质量的文章或
    评论和其他数据,是否有任何其他网页,它呈现了这些类型的
    信息的质量?

  49. 在第一个例子中。IDF(T1),计算器的日志(2/1)= 0.3010。为什么他们获得0.69 ..请问错误吗?

给…留一个回复Thanuj取消回复

您的电子邮件地址将不会被公布。

这个网站使用Akismet来减少垃圾邮件。了解如何处理评论数据