机器学习::文本特征提取(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本教程的第一部分有这样的文本表示:

我们可以看到灿烂的太阳,明亮的太阳。

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

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

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

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

在哪里帽子\ {v}是单位向量,或标准化向量\向量{v}向量是标准化的吗\|\向量是矢量的常态(幅度,长度)\向量{v}l ^ p.空间(别担心,我要解释一下)。

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

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

但这里重要的问题是如何计算向量的长度,要理解这一点,你必须理解向量的动机l ^ p.空间,也称为Lebesgue空间

Lebesgue空间

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

通常,矢量的长度\向量{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.这是因为它可以被概括为:

\显示样式“\vec{u}”p=(\left | u|u 1\right | p+\left | u|u 2\right | p+\left | u|u 3\right | p+\ldots+\left | u n\right | p)^\frac{1}p}

并简化为:

\ displaystyle \ | \ vec {u} \ | _p =(\ sum \ limits_ {i = 1} ^ left | \ vec {u} _i \ light | ^ p)^ \ frac {1} {p}

所以当你读到一个L2-norm,你正在读的欧几里德范数,常态p=2,用于测量向量长度的最常见范数,通常称为“量值”;实际上,当您有一个不合格的长度度量值(没有P号码),你有L2-norm(欧几里德范数)。

当你读到一篇关于L1-NOM,你在读关于标准的书p=1,定义为:

vec{你}\ displaystyle \ | \ \ | _1 =(左\ | u_1 \右| + \左| u_2 \右| + \左| u_3 \右| + \ ldots + \左| u_n \ |)

它只不过是向量各分量的简单和,也称为出租车的距离,也称为曼哈顿距离。

出租车几何图形与欧几里得距离:在出租车几何图形中,同一路线的所有三条图线具有相同的长度(12)。在欧几里得几何图形中,绿线具有相同的长度6次\sqrt{2}\大约8.48,是独特的最短路径。
资料来源:维基百科::出租车几何

请注意,您还可以使用任何规范来规范向量,但我们将使用最常见的规范,L2-NOM,这也是0.9版本中的默认值scikits.learn.你还可以找到论文比较两种方法的性能等规范化文档向量的方法,实际上你可以用其他的方法,但你必须简洁,一旦你使用了一个标准,你必须用它来直接涉及常态(整个过程一个使用l1范数的单位向量的长度不会是1如果你稍后要取它的l2范数的话)。

回到向量规范化

现在您知道了向量的规范化过程是什么,我们可以尝试一个具体的例子,即使用l2范数(我们现在将使用正确的术语)来规范化向量的过程vec {v_ \ {d_4}} =(0、2、1、0)为了得到它的单位向量帽子\ {v_ {d_4}}.为此,我们将简单地将其插入单位向量的定义以评估它:

\{{v}{{{{v}{{{{{{{{{{v}}{{{{{{v}{{{{v}}{{{{{{{v}{{{{{{{{{{v}{{{{{{{{{{{{{{{{{{{{{{{{{{v}}{{{{{{{{{{{5 5 5}{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}}}{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}{{{{{{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}}}}}}}}}}}}}^2+1^2+0^2}\\\\\\hat{v{d{u 4}=\frac{(0,2,1,0)}{\sqrt{5}\\\\\\small\hat{v{d{u 4}=(0.0,0.89442719,0.4472136,0.0)

就这样!我们的归一化向量帽子\ {v_ {d_4}}现在有了L2规范帽子\ | \ {v_ {d_4}} \ | _2 = 1.0

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

术语频率 - 逆文档频率(TF-IDF)重量

现在,您已经了解了矢量规范化如何在理论和实践中工作,让我们继续我们的教程。假设您的收藏中有以下文件(从教程的第一部分中获取):

火车文档集:d1:天空是蓝色的。d2:太阳很明亮。测试文档集:d3:天空中的太阳是明亮的。我们可以看到灿烂的太阳,明亮的太阳。

您的文档空间可以定义为D=\{D\u 1,D\u 2,\ldots,D\u n\}在哪里N是你的语料库中的文件数量,以及我们的案件d_ {train} = \ {d_1,d_2 \}D_{test} = \{d_3, d_4\}.文档空间的基数由\ left | {d_ {train}} \右手|= 2\ left | {d_ {test}} \右|= 2,因为我们只有两个文档用于培训和测试,但它们显然不需要具有相同的基数。

现在让我们看看idf(反向文档频率)是如何定义的:

\ displaystyle \ mathrm {idf}(t)= \ log {\ frac {\ left | d \ light |} {1+ \ left | \ {d:t \ in d \} \ light |}}

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

则tf-idf的公式为:

特遣部队\ \ mathrm {mbox {-} idf} (t) = \ mathrm {tf} (t, d) \ * \ mathrm {idf} (t)

这个公式有一个重要的结果:当给定文档中有一个高项频率(tf)时,tf-idf计算的权重会很高(局部参数)整个集合中该术语的文档频率较低(全局参数)。

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

M{train}=\begin{bmatrix}0&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)=\log{\frac{\left}D\right}{1+\left}{D:t|2\in D\}\right}}=\log{\frac{2}{3}=-0.40546511

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

\mathrm{idf}(t|4)=\log{\frac{\left}D\right}{1+\left}{D:t|4\in D\}\right}}=\log{\frac{2}{2}=0.0

这些idf权重可以用向量表示为:

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

现在我们有了以频率为项的矩阵(M{train})和矩阵中每个特征的idf向量(\ vec {idf_ {train}}),我们可以计算我们的tf idf权重。我们要做的是矩阵每列的简单乘法M{train}与相应的\ 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}

然后将其乘以术语频率矩阵,因此最终结果可以定义为:

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

请注意,矩阵乘法不是可交换的,它是A \ B会不会有不同的结果b \ times a,这就是M{idf}位于乘法的右侧,以实现将每个IDF值乘以其对应功能的所需效果:

{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) \ {bmatrix} {bmatrix} \ \ * \开始mathrm {idf} (t_1) & 0 & 0 & 0 & \ \ \ 0 mathrm {idf} (t_2) & 0 & 0 \ \ 0 & 0 & \ mathrm {idf} (t_3) & 0 \ \ 0 & 0 & 0 & \ mathrm {idf} (t_4) \ {bmatrix结束 }   \\ =   \ 开始{bmatrix} \ mathrm {tf} (t_1 d_1) \ * \ mathrm {idf} (t_1) & \ mathrm {tf} (t_2 d_1) \ * \ mathrm {idf} (t_2) & \ mathrm {tf} (t_3,d_1) \ * \ mathrm {idf} (t_3) & \ mathrm {tf} (t_4 d_1) \ * \ mathrm {idf} (t_4) \ \ \ mathrm {tf} (t_1、d_2) \ * \ mathrm {idf} (t_1) & \ mathrm {tf} (t_2 d_2) \ * \ mathrm {idf} (t_2) & \ mathrm {tf} (t_3、d_2) \ * \ mathrm {idf} (t_3) & \ mathrm {tf} (t_4、d_2) \ * \ mathrm {idf} (t_4) \ {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.70710678&0\\0&-0.89442719&-0.4472136&0\end{bmatrix}

这是我们的测试文件集的非常规范化的TF-IDF重量,实际上是单位向量的集合。如果您拍摄了矩阵的每一行的L2-常态,则会发现它们都有1个常数为1。

Python实践

使用环境:Python v.2.7.2,numpy 1.6.1.,Scipy V.0.9.0.,Sklearn(Scikits.learn)v.0.9

现在你在等待的部分!在本节中,我将使用Python来显示TF-IDF计算的每个步骤Scikit.learn特征提取模块。

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

从sklearn.feature_extraction。Text import CountVectorizer train_set = ("The sky is blue.", "The sun is bright.") test_set = ("The sun in the sky is bright.", "We can see the shining sun, the bright sun.") count_vectorizer = CountVectorizer() count_vectorizer.fit_transform(train_set) print "Vocabulary:", count_vectorizer.vocabulary # Vocabulary: {'blue': 0, 'sun': 1, 'bright': 2, 'sky': 3} freq_term_matrix = count_vectorizer.transform(test_set) print freq_term_matrix.todense() #[[0 1 1 1] #[0 2 1 0]]

现在我们有了频率项矩阵(称为频率项矩阵),我们可以实例化TFIDF变压器,这将负责计算我们术语频率矩阵的TF-IDF权重:

来自sklearn.feature_extraction.text导入tfidftransformer tfidf = tfidftransformer(rang =“l2”)tfidf.fit(freq_term_matrix)打印“iDf:”,tfidf.idf_#iDF:[0.69314718 -0.40546511 -0.40546511 -0.40546511 -0.40546511 -0.40546511 -0.40546511 -0.40546511 -0.40546511 0.]

请注意,我将标准指定为l2,这是可选的(实际上默认为l2-norm),但我添加了参数,使其明确到您将使用L2-Norm。另请注意,您可以通过访问调用的内部属性来查看计算的IDF重量idf_. 既然合身()方法已经计算了矩阵的IDF,让我们转换频率项矩阵到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的类,该类是一个自动组合CountVectorizerTFIDF变压器给你。看到这个例子了解如何使用它进行文本分类过程。

I really hope you liked the post, I tried to make it simple as possible even for people without the required mathematical background of linear algebra, etc. In the next Machine Learning post I’m expecting to show how you can use the tf-idf to calculate the cosine similarity.

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

引用本文为:Christian S.Perone,“机器学习:文本特征提取(tf idf)–第二部分”,在亚洲金博宝隐姓埋名地,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. 优秀的工作基督徒!我期待着阅读您的下一篇文献分类,集群和主题提取与天真贝叶斯,随机梯度下降,小纤维-K均值和非负矩阵分解

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

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

  3. 我喜欢这个教程,更好地了解我在这里学习的新概念。
    也就是说,您使用的是哪个版本的scikits learn?。
    由easy_install安装的最新版本似乎有一个不同的模块层次结构(即在sklearn中找不到feature_extraction)。如果你能提到你用的版本,我就用那些例子试试。

  4. 第三部分在哪里?我4天后要交一份关于矢量空间建模的作业。有希望在周末贴上去吗?

  5. 由于基督教!这是亚洲金博宝一个关于向量空间的很好的作品。我只有一个问题,假设我已经计算了' tf_idf_matrix ',我想计算成对的余弦相似度(每行之间)。我在稀疏矩阵格式上遇到了问题,你能给我举个例子吗?我的矩阵也很大,比如25k × 60k。谢谢!

  6. 很好的帖子…我知道什么是tf idf,以及如何用一个具体的例子来实现它。但是我发现了两件我不确定的事情:
    1-您称为2维矩阵M_Train,但它具有D3和D4文档的TF值,因此您应该调用矩阵m_test而不是m_train。因为D3和D4是我们的测试文件。
    2-计算T2的IDF值(这是'Sun')时,它应该是日志(2/4)。因为文件的数量是2. D3有“Sun”一词,D4有2次。这使它成为3,但我们还将1添加到该值,以摆脱除以0个问题。这使它成为4 ......我是对的,还是我错过了什么?
    非常感谢。

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

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

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

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

        “……我们使用的实际上是一个术语出现的文档数量,而不管该术语在任何给定文档中出现的次数。在这种情况下,t2('sun')的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. 我和Jack(上次评论)有同样的疑问。从上次tf idf权重矩阵中,我们如何分别得到术语的重要性(例如,哪个是最重要的术语?)。我们如何使用此矩阵对文档进行分类。

  10. 我有个问题。。
    在tf idf操作之后,我们得到一个带有值的numpy数组。假设我们需要从数组中获得最高的50个值。我们如何才能做到这一点?

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


  11. thanx fr d code ..确实非亚洲金博宝常有用!

    1.对于文档聚类,在计算反相术语频率之后,Shud I使用Jaccards系数等任何关联系数,然后将群集ALGO应用于K-Means或Shud I将D k均值直接应用于文档向量,在计算反相术语频率之后?

    2.对于计算文档聚类的文档向量,u如何评价倒置的术语频率?

    谢谢你的答复了!

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

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

    谢谢你的精彩帖子!

  13. 优秀的文章和对td-idf规范化的介绍。

    你有一个非常清晰和结构亚洲金博宝化的方式来解释这些困难的概念。

    谢谢!

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

  15. 如果我是wordg,请纠正我
    从“我们在第一次教程中计算的频率”开始之后的公式应该不是MTRAIN。此外,启动后,这些IDF权重可以由向量表示为:“应该是IDF_TEST而不是IDF_TRAIN。

    BTW Great系列,您能为如何实现分类提供简单的方法吗?

  16. 亚洲金博宝很好的帖子。恭喜!!

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

    我在维基百科上读到:
    tf idf值随单词在文档中出现的次数成比例增加,但随单词在语料库中出现的频率而偏移,这有助于控制某些单词通常比其他单词更常见这一事实。

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

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

    我不确定是否完全理解它。

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

  18. 优秀的帖子!偶然偶然发现关于CountVectorizer的更多信息,但我很高兴我通过两个帖子(第1部分和第2部分)读取。

    现在为你的博客添加书签

  19. 似乎没有你描述的......
    知道为什么吗?
    >>>ts
    (“天空是蓝色的”,“太阳是明亮的”)
    >>> v7 = countVectorizer()
    > > > v7.fit_transform (ts)
    <2×2类型稀疏矩阵"
    以坐标格式>存储4个元素
    >>>打印v7.1词汇表_
    {u'is':0,u'the':1}

    1. 实际上,在第一个Python示例中有两个小错误。
      1.CountVectorizer应该像这样实例化:
      count\u vectorizer=CountVectorizer(stop\u words='english')
      这将确保'是',''等被删除。

      2.要打印词汇,您必须在最后添加下划线。
      打印“词汇表:”,计数向量器。词汇表_

      优秀的教程,只是小事。HOEP它帮助他人。

      1. 谢谢你,阿什。尽管这篇文章不言自明,但你的评论完全不同。

  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. 谢谢你的精彩总结。你提到了一些比较母语和二语规范的论文,我计划对此进行更深入的研究。你还知道他们的名字吗?

  26. 我如何为我自己的文本文件计算tf idf,该文件位于我电脑的某个位置?

  27. 才华横溢的文章。

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

  28. 嗨,伟大的帖子!我正在使用Scikit中的TFIDVectorizer模块学会使用NARM = L2生成TF-IDF矩阵。我一直在研究我叫做TFIDF_MATRIX的Corpora的FIT_TRANSFORM之后的TFIDFVectorizer的输出。我已经总结了行,但它们不总和1。代码是vect = tfidfvectorizer(use_idf = true,sublunar_tf = true,norm =“l2)。tfidf_matrix = vect.fit_transform(数据)。当我运行tfidf_matrix.sum(axace = 1)时,向量大于1.也许我正在寻找错误的矩阵,或者我误解了标准化如何运作。我希望有人可以澄清这一点!谢谢

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

  30. 伟大的教程,刚刚开始了ML的新工作,这非常清楚地解释了事物。亚洲金博宝

  31. 上乘的帖子! !非常感谢这篇文章。

    但是,我需要更多信息,因为你展示了Python的实用,你可以用Java语言提供吗?

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

  33. 你好,
    非常感谢你对这个话题的详细解释,真的很好。不管怎样,你能给我一个提示,我一直看到的错误的来源是什么吗

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

    我使用的是sklearn的错误版本吗?

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

  35. 我理解tf idf的计算过程。但是这个矩阵是什么意思?我们如何使用tfidf矩阵来计算相似性?我很困惑。你能解释一下我们如何使用tfidf矩阵吗?谢谢

  36. 最好的解释。。非常有用。你能告诉我如何亚洲金博宝在svm中绘制文本分类中的向量吗。。我正在做推特分类。我很困惑,请帮帮我。

  37. 您好,如果我弄错了,我很抱歉,但我不明白怎么是| | Vd4 | | 2=1。
    D4 =(0.0,0.89,0.44,0.0)的值,因此归一化将是= SQRT(方形(.89)+ Square(.44))= SQRT(.193)= .44
    那我错过了什么?请帮我理解。

  38. 它非常伟大。亚洲金博宝我爱你的教导。亚洲金博宝非常非常好

  39. 当我执行相同的脚本时,我得到的结果不同。
    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版本,你应该会看到结果的不同,因为它们可能改变了默认参数、算法、舍入等。

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

  41. 为什么| D |=2,在idf方程中。它不应该是4吗?因为| D |表示考虑的文件数量,我们有2个来自测试,2个来自火车。

  42. 嗨,克里斯汀
    您的帖子对我非常有帮助了解基础知识的TFD-IDF。我正在研究一个分类项目,在那里我正在使用传染媒介空间模型,这导致确定应该存在测试文件的类别。它是机器学习的一部分。如果你建议我与此相关的事情会很棒。我陷入了困境。
    谢谢你

  43. 请参阅此示例以了解如何将其用于文本分类过程。“这个”链接不再工作了。您能否为此示例提供相关联系。

    谢谢

  44. 嘿,你有个不错的职位。真的谢谢你!太棒了。

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

  46. 1vbXlh您提出了一个非常精彩的细节,感谢您的帖子。亚洲金博宝

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

  48. 在第一个例子中。idf(t1),对数(2/1)=0.3010。为什么他们获得了0.69。。请问怎么了?

答复克里斯蒂安·S·佩龙取消回复

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

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