机器学习:文本特征提取(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}一个向量的vec {v} \是:

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

在哪里帽子\ {v}是单位向量,还是标准化向量vec {v} \向量是标准化的吗vec {v} \ | \ \ | _p向量的模(模,长度)是多少vec {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/)

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

\显示样式“\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}

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

当你读到L1-NOM,你读到的是规范p=1,定义为:

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

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

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

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

回到向量规范化

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

\帽子{v} = \压裂vec {v}} {\ vec {v} {\ | \ \ | _p } \\ \\  \ 帽子{v_ {d_4}} = \压裂{\ vec {v_ {d_4}}} {| | \ vec {v_ {d_4}} | | _2 } \\ \\ \\  \ 帽子{v_ {d_4}} = \压裂{(0 2 1,0)}{\ sqrt {0 ^ 2 + 2 ^ 2 + 1 ^ 2 + 0 ^ 2 }} \\ \\  \ 帽子{v_ {d_4}} = \压裂{(0 2 1,0)}{\√6 {5 }} \\ \\  \ 小帽子\ {v_ {d_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_1, d_2, \ldots, d_n \}在哪里N是你的语料库中的文件数量,以及我们的案件D_{train} = \{d_1, d_2\}D_{test} = \{d_3, d_4\}.文档空间的基数由\ left | {d_ {train}} \右手|= 2左\ | {D_{测试}}\ | = 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 & 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{\压裂{\左| D \右|}{1 +左| \ \{在D D: t_1 \ \} \右|}}= \ log{\压裂{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) = \ log{\压裂{\左| D \右|}{1 +左| \ \{在D D: t_3 \ \} \右|}}= \ log{\压裂{2}{3}}= -0.40546511

\ mathrm {idf} (t_4) = \ log{\压裂{\左| D \右|}{1 +左| \ \{在D D: t_4 \ \} \右|}}= \ log{\压裂{2}{2}}= 0.0

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

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

现在我们有了以频率为项的矩阵(M_{火车})和矩阵中每个特征的idf向量(vec {idf_ \{火车}}),我们可以计算tf-idf权值。我们要做的是对矩阵的每一列做一个简单的乘法M_{火车}与相应的vec {idf_ \{火车}}向量维数。为此,我们可以创建一个正方形对角矩阵被称为M_ {idf}竖直方向和水平方向都等于这个向量vec {idf_ \{火车}}尺寸:

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}

请注意,矩阵乘法不是可交换的,它是A \ B会不会有不同的结果B \乘以一个,这就是为什么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} = \压裂{M_ {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 v.0.9 (Scikits.learn)

现在轮到你等待的那部分了!在本节中,我将使用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]]

现在我们有了频率项矩阵(称为freq_term_matrix),则可以实例化TfidfTransformer,它将负责计算我们的项频率矩阵的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范数),但我已经添加了参数来明确地告诉你它将使用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}矩阵。你可以通过使用VectorizerScikit.learn的类,该类是一个自动组合CountVectorizerTfidfTransformer给你。看到这个例子了解如何使用它进行文本分类过程。

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示例使用的环境信息

对“机器学习:文本特征提取(tf-idf) -第二部分”的103个想法

  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 (sun)的idf值时,它应该是log(2/4)。因为文档的数量是2。D3有1次单词“sun”,D4有2次。它是3,但我们也在这个值上加1来消去除以0的问题。我说的对吗,还是我遗漏了什么?
    非常感谢。

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

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

      1. 回复:我的“你是正确的评论”(上面),我应该加上:

        “……还注意到Frédérique Passot关于分母的评论(如下):

        我们使用的实际上是某个术语出现在文档中的数量,而不管该术语在任何给定文档中出现过多少次。在这种情况下,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. 我和杰克有同样的疑问。从最后的tf-idf权值矩阵中,我们如何分别得到各项的重要性(例如:哪一个是最重要的术语?我们如何使用这个矩阵对文件进行分类。

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

    1. f(idf)值高表示该向量(或Document)局部强度高,全局强度低,此时可以假设其中的项局部显著性高,不可忽略。与函数(tf)相比,只有术语重复了很多次才被赋予更多的重要性,这在大多数情况下不是一种合适的建模技术。


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

    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规范化的介绍。

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

    谢谢!

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

  15. 如果我错了,请纠正我
    从“我们在第一次教程中计算的频率”开始之后的公式应该不是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.vocabulary_
    {u'is':0,u'the':1}

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

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

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

  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. 我如何为我自己的文本文件计算tf idf,该文件位于我电脑的某个位置?

  26. 才华横溢的文章。

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

  27. 嗨,好的文章!我使用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。也许我看错矩阵了,或者我误解了标准化的原理。我希望有人能澄清这一点!谢谢

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

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

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

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

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

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

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

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

  33. 很棒的简单而有效的解释。请发布更多有如此精彩解释的话题。期待接下来的文章。
    谢谢

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

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

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

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

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

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

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

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

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

    谢谢

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

  44. 关于这个问题,确实有很多东西要学习。我真的很喜欢你的观点。

  45. 我知道这个网站提供了基于优质的文章或
    评论和其他数据,有没有其他的网页展示这些
    信息的质量?

  46. 在第一个例子中。Idf (t1),通过计算器得到log(2/1) = 0.3010。为什么他们得到了0.69..请问怎么了?

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

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

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