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

向量空间模型(VSM)简介

在信息检索或文本挖掘中,这个术语频率-文档反向频率(也称为TF国际设计公司)是评估文档中单词重要性的一种众所周知的方法。tf idf是将信息的文本表示转bepaly亚洲换为矢量空间模型(VSM)或者变成稀疏的特征,我们稍后再讨论,但首先,让我们试着理解什么是tf idf和vsm。

VSM过去很混乱,bepaly亚洲例如,参见论文最有影响力的报纸杰拉德·索尔顿从未写过这就解释了《鬼魂传》背后的历史事实上从未存在过;总而言之,VSM是一个代数模型,将文本信息表示为一个向量,这个向量的分量可以表示一个术语(tf-idf)的重要性,甚至可以表示不存在或存在(词袋)在文件中;值得注意的是,Salton提出的经典VSM包含了局部和全局参数/信息(从某种意义上说,它既使用了被分析的孤立项,也使用了整个文档集合)。VSM,在A中解释拉托森,文本表示为数字矢量而不是其原始字符串文本表示的空间;VSM表示从文档中提取的功能。

让我们试着用具体的例子来数学地定义vsm和tf idf,对于具体的例子,我将使用python(以及学会学习python模块)。

去向量空间

将文档建模为向量空间的第一步是创建文档中存在的术语字典。要做到这一点,您可以简单地从文档中选择所有术语并将其转换为矢量空间中的维度,但我们知道,几乎所有文档中都存在某种单词(停止词)。我们要做的是从文档中提取重要的特性,功能确实可以在其他类似的文档中识别它们,所以用“the,是,在,关于“等。。不会帮我们的,所以在信息提取中,我们会忽略它们的。

让我们用下面的文档定义我们的(愚蠢的)文档空间:

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

现在,我们要做的是为火车文档集的单词创建一个索引词汇表(字典)。使用文档D1D2从文档集,我们将有以下索引词汇表表示为\MaTrm {e}(t)何处T术语是:

\mathrm e(t)=\begin cases 1,&\mbox如果t\mbox是``蓝色

请注意,“is”和“the”等术语如前所述被忽略。既然我们有了索引词汇表,我们可以将测试文档集转换为一个向量空间,其中每个向量项都被索引为索引词汇表,所以向量的第一个术语代表了我们词汇表中的“蓝色”术语,第二个代表“太阳”等等。现在,我们将使用词频表示向量空间中的每一项;词频不过是衡量词汇表中出现的词的多少倍。\MaTrm {e}(t)存在于文档中D3型D4型,我们将术语频率定义为一个计算函数:

在d \mathrm fr(x,t)

何处\MaTrm {FR}(x,t)是一个简单函数,定义为:

\mathrm fr(x,t)=\begin cases 1,&\mbox如果x=t\\0,&\mbox否则\ \结束案例

所以,什么TF(t,d)返回是术语的次数T存在于文档中D.举个例子,可以是“太阳”因为我们在文档中只出现了两次术语“sun”D4型.现在你了解了频率这个词是如何工作的,我们可以继续创建文档向量,其代表为:

\显示样式\vec v d=(\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或T1(这是我们的“蓝色”词汇)在文档中DY2.

现在让我们展示一个文档如何D_3号DY4表示为矢量:

\vec v_d_u 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=(\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 u 3=(0,1,1,1)vec v d u 4=(0,2,1,0)

正如你所看到的,因为文件D_3号DY4是:

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

结果向量\VEC{V{{DY3}}表明我们有,整齐,术语“蓝色”出现0次,1出现术语“sun”,等等。在\VEC{V{{DY3}},我们有0个术语“蓝色”,两次出现术语“sun”,等。

但是等一下,因为我们收集了一些文件,现在用向量表示,我们可以用矩阵表示它们d d倍f形状,哪里d是文档空间的基数,或者我们有多少文件f是功能的数量,在我们的例子中,用词汇大小表示。上述向量的矩阵表示示例如下:

M D乘以F=\ begin BMatrix 0&1&1\\0&2&1&0\ end BMatrix

正如你所指出的,这些代表术语频率的矩阵bepaly亚洲稀疏的(大部分术语归零)这就是为什么你会看到这些矩阵的一个常见的表示形式是稀疏矩阵。

巨蟒练习

使用的环境Python V.2.7.2NUMPY 1.1.1SISPY V.0.9sklearn(scikits.learn)版本0.9.

既然我们知道术语频率和向量空间转换背后的理论,让我们用神奇的科学研究Python模块。

scikit.learn附带很多例子以及现实生活中有趣的数据集你可以用一些帮助函数例如下载18K新闻组文章。

因为我们之前已经定义了我们的小型列车/测试数据集,让我们使用它们以scikit.learn可以使用的方式定义数据集:

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

在scikit.learn中,我们提出的术语频率,被调用计数记录器,所以我们需要导入它并创建一个新闻实例:

从sklearn.feature_extraction.text导入countvectorizervectorizer=countvectorizer()。

这个计数记录器已用作默认的“分析器”,调用文字分析仪,它负责将文本转换为小写,删除重音符号,令牌提取,过滤停止词,等等…通过打印类信息,您可以看到更多信息:

打印矢量计数器矢量器(analyzer_uu min_n=1,analyzer_u stop_words=set(['all',“六”,“少”,“存在”“的确”,“结束”,“移动”,无论如何,“四”,“不”“自己”“通过”,“你们自己”(…)

现在让我们创建词汇索引:

vectorizer.fit_transform(train_set)打印矢量器。词汇'蓝色':0,“太阳”:1,“光明”:2,“天空”:3 }

请注意创建的词汇与e(t)(因为它是零索引的除外)。

现在让我们使用相同的矢量器来创建测试设置文件:

smatrix=vectorizer.transform(test_set)打印smatrix(0,1)____1(0,2)____1(0,3)____1(1,1)____2(1,2)____1

注意,创建的稀疏矩阵矩阵式是一个弯腰稀疏矩阵元素存储在坐标格式.但您可以将其转换为密集格式:

smatrix.todense()矩阵([[0,1,1,1,……[ 0,2,1,0)]dType=64)

注意,创建的稀疏矩阵是相同的矩阵m_d乘以f_我们在本帖前面提到,表示两个文档向量\VEC{V{{DY3}}\VEC{V{{DY4}}.

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

希望你喜欢这篇文章,如果你真的喜欢,留下一个评论,这样我就可以知道是否有足够的人对这些机器学习主题系列文章感兴趣。

如许,这是第二部分本教程系列的。

工具书类

经典向量空间模型

最有影响力的报纸杰拉德·索尔顿从未写过

维基百科:tf idf

维基百科:向量空间模型

scikits.learn示例

更新

2011年9月21日-修正了一些打字错误和矢量符号
22 9月11日–根据新的0.9版本固定导入sklearn,并添加了环境部分
2011年10月2日–固定的乳胶数学拼写错误
18 10月11日–添加到教程系列第二部分的链接
04马尔11–解决了格式问题

克里斯蒂安S佩隆

108评论

  1. 谢谢,将实际案例与理论相结合,可以很方便地看到理论的实际应用,有助于更好地保留理论。bepaly亚洲尽管在这篇文章中,我有点失望,因为我觉得结束得太快了。我想要更长的文章。但我想较长的文章会让大多数读者失望。

  2. bepaly亚洲非常有趣的博客,我肯定会有更多关于这个主题的信息:)!

    我最近也不得不在python中处理vsm&tf-idf,在返回输入字符串中最相似字符串的文本处理任务中。我没看过Scikits.Learn,但它看起来确实有用而且简单。

    我使用Gensim(人类的VSM:http://radimrehurek.com/gensim/)与NLTK一起准备数据(又称词语标记化,降词,以及删除停止字)。我可以强烈推荐这两个图书馆!

    关于我的方法的更多(稍微过时的)细节,见:http://graus.nu/blog/simple-keyword-extraction-in-python/

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

    1. 信息丰富的博客文章,在理解这个概念方面帮助了我很多。拜托,继续这个系列。

  3. 非常感谢你写这封信。有时,知道后台烹饪背后有什么花哨和神奇的功能真是太好了。

  4. 谢谢您!了解向量空间bepaly亚洲模型对我很有用。但我有点怀疑,请告诉我清楚。
    1。在我的工作中,我增加了术语,文档频率的倒数。我想达到更高的精确度。所以我想再加一点,请建议我…

  5. 你好,
    因此,基本上,sklearn中的类feature_selection.text.vectorizer现在已被弃用,取而代之的是feature_selection.text.tfidfvectorizer。

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

    有关更改内容,请参阅“API更改摘要”下的。

    我只是想给你个头像。
    不管怎样,都很享受你的职位!
    当心

  6. 谢谢你的职位。我目前正在研究如何索引文档,但词汇术语取自SKOS格式的同义词库。
    你的帖子很有趣,对我很有帮助。bepaly亚洲

  7. 嘿,谢谢你给我这个很有洞察力的职位!bepaly亚洲我不知道python中是否存在可以为您实现这一点的模块(我用硬方法计算它:/)

    只是好奇,您是否知道使用tf idf加权作为特征选择或文本分类方法。我看过很多论文(大多数是出于某种原因从中国来的),但我发现了很多解决这个问题的方法。

    如果有什么建议或方向可以引导我尽可能多地利用资源,那将非常感谢。

  8. 您好!
    我使用的是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
    我试图重复您的步骤,但无法打印vectorizer.worsary(见下文)。
    有什么建议吗?
    当做
    安德烈斯索托
    >>>火车设置=(天空是蓝色的.,“阳光明媚。”)
    >>>测试设置=“(天空中的太阳很亮。”,
    “我们可以看到灿烂的阳光,明亮的太阳。”)
    >>>从sklearn.feature_extraction.text导入countvectorizer
    >>>矢量器=countvectorizer()
    >>>打印矢量器
    countvectorizer(analyzer=字,二进制= false,字符集=UTF-8,
    charset_错误=严格,dType=输入=内容,
    小写=真,最大值df=1.0,max_features=无,Max n=1,Minn=1,
    预处理器=无,停止“单词=无”,条带重音=无,
    令牌_模式=bww+b,标记器=无词汇=无)
    >>>矢量器.fit_transform(train_set)
    <2×6类型为“”的稀疏矩阵
    以坐标格式存储8个元素>
    >>>打印矢量器.词汇

    回溯(最近一次呼叫的最后一次):
    文件“,”第1行,在里面
    印刷矢量器.词汇
    attributeError:“countvectorizer”对象没有“词汇”属性
    >>>

  9. 我试图修正countvectorizer的参数(analyzer=wordngramaanalyzer,词汇=听写),但不起作用。因此,我决定安装sklearn 0.9并开始工作,所以我们可以说一切正常,但我仍然想知道sklbepaly亚洲earn 0.11版本有什么问题。

  10. 感谢您的全面介绍,看来第2部分链接已断开。如果你能修好它,那就太好了。谢谢您。

  11. 我使用的是Mac,运行的是0.11版本,但我遇到了以下错误,我想知道如何根据最新的API更改此版本

    >训练集
    (‘天空是蓝色的’,“阳光明媚。”
    >>>矢量器.fit_transform(train_set)
    <2×6类型为“”的稀疏矩阵
    以坐标格式存储8个元素>
    >>>打印矢量器.词汇
    回溯(最近一次呼叫的最后一次):
    文件“,”第1行,在里面
    attributeError:“countvectorizer”对象没有“词汇”属性
    >词汇

  12. bepaly亚洲写得很好。很好的例子以一种易于理解的形式呈现。现在想多读点……
    感谢您分享您的知识
    托马斯,德国

  13. 你好。我很难理解如何计算包含300K行文本的文本文件的tf idf权重。每行都被视为一个文档。文本文件摘录示例:

    黑客攻击
    Jeetu智能编辑器
    奇亚马尔维苏利泽
    设置演示黑客
    维韦克曼斯地
    社交路线专家分钟讨论正确学习摄影
    纳赛尔·艾哈迈德·亚赫勒
    sridhar vibhash雅虎搜索mashup
    Vaibhav Chintan Facebook好友Folio
    Vaibhav Chintan Facebook好友Folio
    判断性评论
    滑溜的

    我很困惑我该怎么做。谢谢

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

    在进行文本挖掘的第一步时,绝对是一个引用。

  15. 非常感谢。bepaly亚洲这篇文章对我帮助很大。bepaly亚洲写得很好,解释也很清楚。
    汉娜

  16. 令人敬畏的东西。我真的很欣赏信息的简单和清晰。一个伟大的,帮了大忙。

  17. 谢谢你的精彩帖子。你用简单的语言解释过,这样像我这样的新手就能理解。将继续阅读下一部分!

  18. 安德烈和加文问题的解决方案:

    >>>打印矢量器.词汇表

    (在新版本的SciKit中,末尾带有下划线!)
    将输出:

    {蓝`:0,U'BLUTE:1,U孙’:4,U'IS:2,天空:3,U’:5 }

  19. bepaly亚洲非常好的帖子!
    你让tf idf看起来很有趣。我期待更多这样的职位。

  20. 你能告诉我功能名称和词汇有什么区别吗?

    我在矢量化后把它们都打印出来,他们好像说了不同的话??

    也,我需要打印出每节课上最有用的单词,你能给我一个建议吗?

    谢谢

  21. 谢谢……解释得bepaly亚洲很好。我觉得我能理解这个概念,现在我将进行实验。对我的工作很有帮助bepaly亚洲

  22. 谢谢你的文章。这是非常有帮助的。如果可能的话,你能在mabepaly亚洲tlab中告诉它将如何工作吗?

  23. 你好,你的博客不错。
    你提到的文本挖掘,停止像“the,是,在,关于“等。。不会帮助我们的。这部分是真的,例如,在分析网页时,你想忽略网页上的广告,一件好事就是忽略那些没有停止词的句子。与有这些词的正常句子相比。

  24. 我试过了,没有得到预期的结果:
    请参阅以下内容:
    火车开行了=(天空是蓝色的。“阳光明媚。”)
    测试设置=(天空中的太阳很亮。)“我们可以看到灿烂的阳光,明亮的太阳。”)
    从sklearn.feature提取.text导入countvectorizer
    矢量器=countvectorizer()
    stopwords=nltk.corpus.stopwords.words('english')
    vectorizer.stop_words=停止字
    打印矢量器
    矢量器.拟合变换(火车组)
    印刷矢量器.词汇

    我得到“没有”

  25. 很好的教程。bepaly亚洲非常有助于获得一些官方skkit学习教程和用户指南的附加上下文。谢谢。

  26. 非常感谢………波斯特真的帮了我很多忙!!!!!!!!!!!!!

  27. 作为潜入机器学习领域的社会学博士生,这篇文章对我也很有帮助。bepaly亚洲谢谢!

  28. 你好!
    我有一个关于自然语言处理的问题。“功能提取”和“功能选择”字段中有两个术语。我不完全理解它们之间的区别,我们是只使用其中的一个,还是可以同时用于文本分类?
    我的第二个问题是“tf”和“tfidf”是否被认为是NLP中的特征提取方法?

  29. 这确实是一篇有趣的文章。就个人而言,我知道这篇文章中bepaly亚洲提到的所有事情,我以前做过所有的事情,但是有时候花点时间回顾一些你已经知道的东西是值得的。继续努力!

  30. 我试过印刷术(矢量器,词汇),它很管用,但我的输出是:
    {”:5,“天空”:3,“IS”:2,“蓝色”:0,“太阳”:4,“明亮”:1

    你知道为什么不忽略“is”和“the”吗?

    1. 我也面临同样的问题,但得到了解决。可以按如下方式初始化矢量器:
      vectorizer=countvectorizer(stop_words=“english”)。

      以上将逃过所有英语单词。
      干杯。。

  31. 这是迄今为止关于tf-idf和向量空间的最好文章。感谢您发表这样一篇有用的文章。请继续写更多关于机器学习基础和概念的文章。谢谢您!

  32. 很好的教程。它以简单明了的方式向像我这样的新蜜蜂解释事情……谢谢分享它……

  33. 用于删除非索引字的countvectorizer()方法似乎不清楚,请用正确的语法完成函数

  34. 很好的帖子……对这个概念bepaly亚洲的解释很清楚。python代码是额外的奖励。谢谢你

  35. 你好!我目前正在为本科生制作一个使用tfidf方法的期刊搜索引擎。但是我的教授说我的方法太老了。在过去的5年里,你能推荐一些新的方法吗?或者是优化tfidf的方法?关于这一方法的额外研究论文将会很好。非常感谢!bepaly亚洲

  36. bepaly亚洲非常有趣和简洁的阅读!我正在向ML进军,这真的很有帮助。也会读你的其他帖子。

留下评论

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

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