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

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

这篇文章是延续在第一部分,我们开始学习关于文本特征提取和向量空间模型表示的理论和实践。我真的推荐你阅读第一部分为了跟进第二篇文章。

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

介绍

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

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} \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{你}\ | \ \ | = \√6 {u ^ 2 _1 + u ^ 2 _2 + u ^ 2 _3 + \ ldots + u ^ 2 _n”}

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

vec{你}\ displaystyle \ | \ \ | _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-norm,你读到的是规范p = 1,定义为:

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

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

出租车几何与欧几里得距离:在出租车几何中,对于相同的路线,所有三条线都有相同的长度。在欧几里德几何中,绿线有长度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\}.文档空间的基数定义为左\ | {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 {mbox {-} idf} (t) = \ mathrm {tf} (t, d) \ * \ mathrm {idf} (t)

这个公式有一个重要的结果:当给定文档中有一个高的term frequency (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{\压裂{\左| D \右|}{1 +左| \ \ {D: t_2 \在D \} \右|}}= \ log{\压裂{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标准化过程应用到特遣部队\ mbox M_ {{-} 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范数,你会发现它们的l2范数都是1。

Python实践

环境使用Python v.2.7.2Numpy 1.6.1Scipy v.0.9.0Sklearn 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 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实际上是我们之前的特遣部队\ mbox M_ {{-} idf}矩阵。你可以通过使用VectorizerScikit的班级。了解哪个是自动组合的向量CountVectorizerTfidfTransformer给你。看到这个例子了解如何使用它进行文本分类过程。

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

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

引用这篇文章为:Christian S. Perone,“机器学习::文本特征提取(tf-idf) - Part II”亚洲金博宝未发现的地域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. 优秀的工作基督教!我期待着阅读您关于文档分类、聚类和使用朴素贝叶斯提取主题、随机梯度下降、Minibatch-k-Means和非负矩阵分解的下一篇文章

    而且,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-你叫这个二维矩阵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. 嘿,
    谢谢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. 如果我错了,请纠正我
    从“我们在第一个教程中计算过的频率”开始的公式:应该是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_

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

      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. 谢谢你的精彩总结。你提到了一些比较L1和L2规范的论文,我打算更深入地研究一下。你还知道他们的名字吗?

  25. 如何我可以计算tf idf为我自己的文本文件是位于我的pc的一些地方?

  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. 最佳解释. .亚洲金博宝很有帮助。你能告诉我如何在支持向量机的文本分类中绘制向量吗?我正在研究推文分类。我很困惑,请帮助我。

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

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

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

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

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

    谢谢

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

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

给…留一个回复Frederique Passot取消回复

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

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