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

向量空间模型(VSM)简介

在信息检索或文本挖掘中,术语频率 - 逆文档频率(也叫TF-IDF.),是一个很好的方法来评估文档中的单词的重要方法。TF-IDF是将信息的文本表示转亚洲金博宝换为一个非常有趣的方法矢量空间模型(vsm)或陷入稀疏功能,我们将在以后讨论更多信息,但首先,让我们试图了解什么是TF-IDF和VSM。

VSM has a very confusing past, see for example the paper这most influential paper Gerard Salton Never Wrote这解释了幽灵引用纸背后的历史,实际上从未存在过;总之,VSM是表示作为向量的文本信息的代数模型,此向量的组件可以表示术语(TF-IDF)甚至缺席或存在的重要性(袋子)它在文件中;值得注意的是,SASTON提出的经典VSM包括本地和全局参数/信息(从某种意义上是它使用的孤立术语也在整个文件集合中)。vsm,解释为拉托Sensu,是文本表示为数字矢量的空间而不是其原始字符串文本表示;VSM表示从文档中提取的功能。

让我们尝试用具体示例数学地定义VSM和TF-IDF,对于具体示例,我将使用Python(也是惊人的Scikits.Learn.Python模块)。

去矢量空间

将文档建模到向量空间的第一步是创建文档中存在的术语字典。To do that, you can simple select all terms from the document and convert it to a dimension in the vector space, but we know that there are some kind of words (stop words) that are present in almost all documents, and what we’re doing is extracting important features from documents, features do identify them among other similar documents, so using terms like “the, is, at, on”, etc.. isn’t going to help us, so in the information extraction, we’ll just ignore them.

让我们拍下以下文件来定义我们(愚蠢)文档空间:

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

现在,我们要做的是使用文档创建列车文档集的单词的索引词汇(字典)D1andD2从文档集中,我们将具有以下索引词汇表\ mathrm {e}(t)那里T.是这个词:

\ mathrm {e}(t)= \ begin {uis} 1,&\ mbox {if} t \ mbox {是``blue''} \\ 2,&\ mbox {if} t \ mbox {是``Sun''} \\ 3,&\ mbox {if} t \ mbox {是``bright''} \\ 4,&\ mbox {if} t \ mbox {是``sky''} \\ \结束{案例}

Note that the terms like “is” and “the” were ignored as cited before. Now that we have an index vocabulary, we can convert the test document set into a vector space where each term of the vector is indexed as our index vocabulary, so the first term of the vector represents the “blue” term of our vocabulary, the second represents “sun” and so on. Now, we’re going to use the术语频率在我们的矢量空间中代表每个术语;术语频率不仅仅是衡量我们词汇中存在的术语的次数\ mathrm {e}(t)存在于文件中D3orD4那we define the term-frequency as a couting function:

\mathrm{tf}(t,d) = \sum\limits_{x\in d} \mathrm{fr}(x, t)

那里\ mathrm {fr}(x,t)是一个简单的功能,定义为:

\ mathrm {fr}(x,t)= \ begin {is} 1,&\ mbox {if} x = t \\ 0,&\ mbox {否则} \\ \ end {iscus}

那么,什么T.f(t,d)返回是术语的次数是多少次T.存在于文件中D.。这是一个例子,可能是tf(``sun',d4)= 2因为我们在文件中只有两项术语“Sun”D4。Now you understood how the term-frequency works, we can go on into the creation of the document vector, which is represented by:

\displaystyle \vec{v_{d_n}} =(\mathrm{tf}(t_1,d_n), \mathrm{tf}(t_2,d_n), \mathrm{tf}(t_3,d_n), \ldots, \mathrm{tf}(t_n,d_n))

文档向量的每个维度由词汇量的术语表示,例如,\mathrm{tf}(t_1,d_2)代表术语1或术语的频率T_1.(这是文档中的“蓝色”术语)D_2.

现在让我们展示文件的具体示例D_3.andD_4.代表为载体:

\ vec {v_ {d_3}}= (\mathrm{tf}(t_1,d_3), \mathrm{tf}(t_2,d_3), \mathrm{tf}(t_3,d_3), \ldots, \mathrm{tf}(t_n,d_3)) \\   \vec{v_{d_4}} = (\mathrm{tf}(t_1,d_4), \mathrm{tf}(t_2,d_4), \mathrm{tf}(t_3,d_4), \ldots, \mathrm{tf}(t_n,d_4))

哪个评估:

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

正如您所看到的,因为文件D_3.andD_4.是:

D3:天空中的太阳很明亮。D4:我们可以看到闪亮的阳光,明亮的阳光。

得到的矢量\ vec {v_ {d_3}}表明我们有0个术语“蓝色”,1项“Sun”,术语“Sun”,等等。在里面\ vec {v_ {d_3}},我们有0次出现的“蓝色”,2个术语“太阳”等。

但等等,自从我们有一系列文件,现在由向量代表,我们可以将它们作为矩阵表示| D |\ times f.形状,在哪里| D |is the cardinality of the document space, or how many documents we have and theF是由词汇大小代表的案例中的功能数量。上述矢量的矩阵表示的示例是:

M_ {| D |\ times f} = \ begin {bmatrix} 0和1&1&1 \\ 0&2&1&0 \ end {bmatrix}

如您所要所述,这些代表术语频率的矩阵往往非常亚洲金博宝(大多数术语归零),这就是为什么你会看到这些矩阵的公共表示为稀疏矩阵。

Python练习

Environment UsedPython v.2.7.2.numpy 1.6.1.Scipy V.0.9.0.Sklearn(Scikits.Learn)V.0.9

Since we know the theory behind the term frequency and the vector space conversion, let’s show how easy is to do that using the amazingscikit.learnPython模块。

Scikit.learn comes with很多例子as well real-life interesting数据集你可以使用和一些辅助功能例如下载18K新闻组帖子。

由于我们之前已经定义了我们的小型列车/测试数据集,让我们使用它们以Scikit.Learn可以使用的方式定义数据集:

train_set =(“天空是蓝色的。”,“太阳亮了”。)test_set =(“天空中的太阳很明亮。”,“我们可以看到闪亮的阳光,灿烂的阳光。”)

在Scikit.Learn中,我们呈现为术语频率,称为CountVectorizer那so we need to import it and create a news instance:

来自sklearn.feature_extraction.text导入countVectorizer Vectorizer = countVectorizer()

CountVectorizer已使用默认的“分析仪”wordngramanalyzer.,这是负责将文本转换为小写,删除令牌提取,滤波器停止单词等文本......您可以通过打印类信息来查看更多信息:

打印矢量化器CountVectorizer(analyzer__min_n=1, analyzer__stop_words=set(['all', 'six', 'less', 'being', 'indeed', 'over', 'move', 'anyway', 'four', 'not', 'own', 'through', 'yourselves', (...)

Let’s create now the vocabulary index:

Vectorizer.fit_transform(train_set)打印矢量化器。vocabulary.{'blue': 0, 'sun': 1, 'bright': 2, 'sky': 3}

看,创建的词汇表是一样的E(t)(除了它是零索引的)。

我们现在使用相同的矢量符号来创建我们的稀疏矩阵test_set.文件:

Smatrix = Vectorizer.Transform(Test_Set)打印Smatrix(0,1)1(0,2)1(0,3)1(1,1)2(1,2)1

请注意,创建的稀疏矩阵调用Smatrix.是A.scipy稀疏矩阵与存储在一个元素Coordinate format。但是您可以将其转换为密集格式:

smatrix.todense()矩阵([[0,1,1,1],...... [0,2,1]],dtype = int64)

Note that the sparse matrix created is the same matrixM_ {| D |\ times f}我们在此帖子之前引用,代表了两个文件向量\ vec {v_ {d_3}}and\ vec {v_ {d_4}}

我们将在下一篇文章中看到我们如何定义idf.逆文档频率)而不是简单的术语频率,以及对数尺度如何根据其重要性来调整术语频率的测量,以及我们如何使用它来使用一些众所好的机器学习方法对文档进行分类。

我希望你喜欢这篇文章,如果你真的很喜欢,请留下评论,所以我会知道是否有足够的人对这些系列帖子的机器学习主题感兴趣。

按照承诺,here is the second part本教程系列。

将本文引用:Christian S. Perone,“机器学习::文本特征提取(TF-IDF) - 第I部分,”在亚洲金博宝Terra Incognita.那2011/09/18.那//www.cpetem.com/2011/09/machine-learning-text-feature-extraction-tf-d-part-i/

参考

经典矢量空间模型

最具影响力的纸张Gerard Salton从未写过

维基百科:TF-IDF

维基百科:矢量空间模型

Scikits.Learn示例

Updates

21 Sep 11-修复了一些拼写错误和矢量表示法
22月11日- 根据新的0.9版本修正了Sklearn的导入并添加了环境部分
02年10月11日- 固定乳胶数学错字
10月18日-added link to the second part of the tutorial series
0.4 Mar 11-Fixed formatting issues

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

  1. 谢谢,具有理论的实际例子的混合非常方便,以便在行动中看到理论,并更好地保留理论。亚洲金博宝虽然在这篇特殊的帖子中,我有点失望,因为我觉得它结束了。我想要更多的文章。但我想越来越多的物品关闭了大多数读者。

  2. 亚洲金博宝非常有趣的博客,我肯定有更多的主题:)!

    我最近必须在Python中处理VSM和TF-IDF,在返回最相似的输入字符串的文本处理任务中。我没有看过scikits.learn,但它肯定看起来很有用和直截了当。

    I use Gensim (VSM for human beings:http://radimrehurek.com/gensim/)与NLTK一起准备数据(AKA字标记,降低单词和删除停止字)。我可以强烈推荐两个图书馆!

    有更多(略微过时)我的方法的细节,请参阅:http://graus.nu/blog/simple-keyword-extraction-in-python/

    谢谢你的帖子,并期待第二部分:)。

  3. 非常感谢这个写作。有时它真的很高兴知道什么是烹饪背部背后的所有花哨和魔法功能。

  4. 谢谢!我为矢量空间亚洲金博宝模型学习非常有用。但我有一些疑惑,请让我明确。
    1.在我的工作中,我已经添加了术语,逆文档频率。我想实现更多的准确性。所以我想加一些更多,请建议我...

  5. Great post, I will certainly try this out.

    我将有兴趣查看类似于SVMlight的类似详细分解与这些技术一起使用。

    谢谢!

  6. 你好呀,
    所以基本上,Class Feature_Selection.Text.Vectorizer现在已被弃用并由Feature_Selection.Text.TfidFvectorizer替换。

    整个模块已完全重新考虑 -
    以下是Scikit-Searn网站的更改日志:
    http://scikit-learn.org/dev/whats_new.html.

    See under ‘API changes summary’ for what’s changed

    只是以为我会给你一个掌握这个问题。
    无论如何享受你的帖子!
    小心

  7. 谢谢for your post. I am currently working on a way how to index documents, but with vocabulary terms taken from a thesaurus in SKOS format.
    您的帖子很有趣,对我很有帮助。亚洲金博宝

  8. Hey thanks for the very insightful post! I had no idea modules existed in Python that could do that for you ( I calculated it the hard way :/)

    Just curious did you happen to know about using tf-idf weighting as a feature selection or text categorization method. I’ve been looking at many papers (most from China for some reason) but am finding numerous ways of approaching this question.

    如果有任何建议或指导我朝着额外资源引导我,那将是非常感激的。

  9. 你好
    I am using python-2.7.3, numpy-1.6.2-win32-superpack-python2.7, scipy-0.11.0rc1-win32-superpack-python2.7, scikit-learn-0.11.win32-py2.7
    我试图重复你的步骤,但我无法打印矢量.vocabulary(见下文)。
    有什么建议么?
    问候
    andres soto.
    >>> train_set =(“天空是蓝色的。”,“太阳很明亮”。)
    >>> test_set =(“天空中的太阳很明亮。”,
    “我们可以看到闪亮的阳光,灿烂的阳光。”)
    >>>从Sklearn.feature_extraction.text导入CountVectorizer
    >>>Vectorizer = CountVectorizer()
    >>>打印矢量化器
    countVectorizer(分析器= Word,Binary = False,Charset = UTF-8,
    charset_error = strict,dtype =,输入=内容,
    小写= true,max_df = 1.0,max_features = none,max_n = 1,min_n = 1,
    preprocessor = none,stop_words = none,strib_action = none,
    token_pattern = bww + b,tokenizer = none,docabulary = none)
    >>>矢量.Fit_Transform(Train_Set)
    <2×6稀疏矩阵''
    使用坐标格式的8个存储元素>
    >>>打印矢量化器。vocabulary.

    回溯(最后最新呼叫):
    File “”, line 1, in
    打印矢量化器。vocabulary.
    AttributeError:'CountVectorizer'对象没有属性'词汇'
    >>>

  10. 我试图修复CountVectorizer的参数(Analyzer = WordngramAnalyzer,Vocabulary = dict),但它不起作用。因此,我决定安装Sklearn 0.9,它有效,所以我们可以说一切都好,但我仍然想知道版本Sklearn 0.11有什么问题亚洲金博宝

  11. 感谢您的伟大概览,看起来第2部分链接被打破。如果你能解决它会很棒。谢谢你。

  12. 我正在使用Mac并运行0.11版本,但我收到以下错误我想知道我如何根据最新的API改变这一点

    >> Train_Set.
    ('天空是蓝色的。','太阳很明亮。')
    >>>矢量.Fit_Transform(Train_Set)
    <2×6稀疏矩阵''
    使用坐标格式的8个存储元素>
    >>>打印矢量化器。vocabulary.
    回溯(最后最新呼叫):
    File “”, line 1, in
    AttributeError:'CountVectorizer'对象没有属性'词汇'
    >>>词汇

  13. 你好,佩雷先生!非常感谢你,我在TF亚洲金博宝-IDF中的新手,你的帖子帮助了我很多了解它。来自日本的问候^^

  14. 亚洲金博宝写得很好。良好的例子以一种形式呈现,使其易于遵循和理解。好奇现在阅读更多......
    感谢您分享你的知识
    托马斯,德国

  15. 你好。我无法理解如何计算我包含300k文本的文本文件的TF-IDF权重。每条线都被视为文档。示例摘录文本文件:

    努力乱砍
    Jeetu智能编辑器
    Shyamal Viziulizr.
    设置演示黑客
    Vivek Mans Land
    社会路线家庭讨论正确学习摄影
    Naseer Ahmed Yahealer.
    sridhar vibhash雅虎搜索mashup
    Vaibhav Chintan Facebook Friend Folio
    Vaibhav Chintan Facebook Friend Folio
    犹太人评论
    slickrnot

    我很困惑我应该做的事情。谢谢

  16. 谢谢
    写得很清楚的解释

    肯定是在进行文本挖掘中的第一个步骤时参考。

  17. 非常感谢你。亚洲金博宝这篇文章帮助了我很多。亚洲金博宝非常好的写作和清晰的解释。
    汉娜

  18. 真棒的东西。我真的很了解信息的简单性和清晰度。一个伟大,伟大的帮助。

  19. 谢谢for the great post. You have explained it in simple words, so that a novice like me can understand. Will move on to read the next part!

  20. andres和gavin问题的解决方案:

    >>>打印矢量化器。vocabulary._

    (在新版本的Scikit结束时带有下划线!)
    将输出:

    {U'Blue':0,U'Bright':1,U'sun':4,U'is':2,U'sky':3,U'the':5}

    1. 嘿兄弟,

      您是否知道(Vectorizer.vocabulary_)和(Vectorizer.get_feature_names())之间的区别是什么?

  21. 亚洲金博宝非常好的帖子!
    你做了tf-idf看起来非常有趣。我期待着更多的帖子。

  22. 这很棒!
    真的很有帮助像我这样的初学者!
    谢谢,保持良好的工作!

    干杯!

  23. Could you tell me please what is the difference between feature names and vocabulary_ ?

    我在矢量化之后打印它们,它们似乎有不同的单词?

    另外,我需要在每个班级中打印出最具信息性的单词,你能告诉我一条路吗?

    谢谢

  24. 谢谢.....亚洲金博宝.非常解释。我觉得我能理解这个概念,现在我会尝试。这对我的工作非常有帮助亚洲金博宝

  25. 谢谢你的u r . .这是非常有用的。亚洲金博宝如果possible can you tell in matlab how it will work

  26. 嗨,你有一个很好的博客。
    你提到的文字挖掘,停止单词“,是,在”等等。没有会帮助我们“。这部分是真的,例如在分析网页的情况下,您希望忽略网页上的广告,一件好事是忽略那些没有停止单词的那些句子。与具有这些单词的正常句子相比。

  27. 我试过这个,没有完全得到预期的结果:
    请参阅以下:
    train_set =(“天空是蓝色的。”,“太阳很明亮”。)
    test_set.= (“The sun in the sky is bright.”, “We can see the shining sun, the bright sun.”)
    来自sklearn.feature_extraction.text导入CountVectorizer
    Vectorizer = CountVectorizer()
    stopwords = nltk.corpus.stopwords.words(‘english’)
    Vectorizer.stop_words = stopwords.
    打印矢量化器
    Vectorizer.fit_transform(train_set)
    打印矢量化器。vocabulary.

    And I get ‘None’

  28. 真的很好的教程。亚洲金博宝对于官方的Skikit-Learing教程和用户指南,可以获得一些上下文的帮助。谢谢。

  29. 我需要一个Java程序来通过计算TF和IDF来索引一组文件请帮助我

  30. 作为社会学的博士候选人,他潜入机器学习世界,这篇文章对我来说也非常有帮助。亚洲金博宝谢谢!

  31. 这是非常有帮助的亚洲金博宝......它让我彻底了解概念......

  32. 你好呀!
    我对自然语言处理有一个问题。此字段“特征提取”和“特征选择”中有两种术语。我并不完全了解它们之间的区别,以及我们是否只使用其中一个,或者是否可以使用文本分类?
    我的第二个问题是'TF'和'TFIDF'是否被认为是NLP中的特征提取方法?

  33. 这确实是一个有趣的文章。就个人而言,我知道这篇文章中提到的一切,亚洲金博宝我以前做过所有这些,但有时候值得花费很少的时间来审查你已经知道的一些东西。保持良好的工作!

  34. Really appreciate you taking the time to write this post.
    非常详细,解释得很好。
    赞赏。

  35. 我尝试了打印(Vectorizer.Vocabulary_),它的作品,但我的输出是:
    {'':5,'天空':3,'是':2,'蓝':0,'Sun':4,'Bright':1}

    Do you know why doesn’t ignored “is’ and “the” ?

    1. 我也面临着同样的问题,但得到了解决方案。您可以初始化向量化器如下:
      Vectorizer = CountVectorizer(Stop_Words =“英语”)

      以上将逃避所有英语停止单词。
      干杯..

  36. 这是迄今为止TF-IDF和矢量空间上的最佳文章。感谢您发布此类有用的文章。请继续在机器学习基础和概念上写更多文章。谢谢!

  37. 良好的教程。它以一种简单而明确的方式向新蜜蜂解释了东西...感谢分享它......

  38. 优秀的文章......非常提供信息和亚洲金博宝解释方式非常好。
    非常感谢!!!

  39. countvectorizer()用于停止删除的方法似乎似乎没有明确,请填写正确语法的函数

  40. 伟大的帖子..对概念的清亚洲金博宝洁解释。Python代码是一个额外的奖金。谢谢

  41. hi! i’m currently make a search engine for journals with tfidf method for my undergraduate. but my professor said that my method is too old. could you recommend some new method in this past 5 years? or maybe method to optimize the tfidf? additional research paper about the method will be great. thankyou very much!

  42. 亚洲金博宝非常有趣和简洁的阅读!我正在升级到ml,它真的有帮助。也要阅读你的其他帖子。

  43. 亚洲金博宝通过实施例一步进行很好的解释。易于理解,真的很有帮助。亚洲金博宝非常感谢这种努力。请进一步发布。

发表评论

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

本网站使用AkisMet减少垃圾邮件。了解如何处理评论数据