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

向量空间模型简介

在信息检索或文本挖掘中,信息检索技术是一种新型的信息挖掘技术术语频率-反向文档频率(也称为特遣部队国防军),是衡量一个单词在文档中有多重要的一种众所周知的方法。tf-idf是一种非常有趣的将信亚洲金博宝息的文本表示转换为向量空间模型(VSM),或者说是稀疏特征,我们稍后会讨论更多,但是首先,让我们试着理解什么是tf idf和VSM。

VSM有一个非常混乱亚洲金博宝的过去,见例如纸最有影响力的论文杰拉德·索尔顿从未写过这解释了鬼背后的历史援引这其实从来没有存在过的纸张;在总和,VSM是表示文本信息作为矢量的代数模型,这个矢量的分量可以表示术语(TF-IDF)的重要性或甚至不存在或存在(袋的话)它的一个文件中;它是要注意重要的是通过索尔顿提出的经典VSM结合本地和全球的参数/信息(它使用两个分离项进行分析,以及文档的整个集合感)。VSM,解释的lato理智,是一个空间,其中文本表示为数字向量,而不是其原始字符串文本表示;VSM表示从文档中提取的特征。

让我们试着从数学结合具体实例定义VSM和TF-IDF在一起,我将使用Python具体的例子(以及惊人scikits.学习Python模块)。

去向量空间

将文档建模为向量空间的第一步是创建文档中出现的术语字典。要做到这一点,你可以简单的选择从文档中所有条款,并把它转换成向量空间的一个维度,但是我们知道有一些词汇(停止词),存在于几乎所有的文件,我们要做的就是从文档中提取重要特征,特征识别他们在其他类似的文件,所以使用诸如“,,,”,等。对我们没有帮助,所以在信息提取中,我们将忽略它们。

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

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

现在,我们要做的是使用文档创建一个列火车文档集的单词索引词汇表(字典)D1D2在文档集中,我们将把以下索引词汇表表示为\数学{E}(t)其中Ť是这个词:

\ mathrm} {E (t) = \{病例}1开始,& \ mbox{如果}t \ mbox{是“蓝色”}\ \ 2 & \ mbox{如果}t \ mbox{是“太阳”}\ \ 3 & \ mbox{如果}t \ mbox{“明亮”}\ \ 4 & \ mbox{如果}t \ mbox{是“天空”}\ \ \{病例}

需要注意的是,如术语“被”和“”分别作为引才忽略。现在,我们有一个索引词汇,我们可以测试文档集转换为其中向量的每个项指数作为我们的索引词汇向量空间,所以向量的第一项代表我们的词汇中的“蓝”来看,第二个代表“太阳”等。现在,我们将使用长期频来表示向量空间中的每一项;词的频率只不过是衡量一个词在我们的词汇表中出现了多少次\数学{E}(t)是否存在于文件中D3D4,我们定义术语频率为couting的功能:

\ mathrm {TF}(T,d)= \和\ limits_ {X \在d} \ {mathrm FR}(X,T)

其中\ mathrm {fr} (x, t)是一个简单的函数,定义为:

\mathrm{fr}(x,t)=开始{cases}1,&\mbox{if}x=t\\0,&\mbox{otherwise}\\\end{cases}

那么,是什么TF(吨,d)回报是多少次的术语Ť存在于文档中d。这方面的例子,可以tf('' sun', d4) = 2因为我们只有两次出现了“太阳”一词的文档中D4。现在,你的理解是频率是如何工作的,我们可以去到创作文档载体,由下式表示:

\的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_3d_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))

评估结果为:

\向量{v{d{u 3}=(0,1,1,1)\\\向量{v{d{u 4}=(0,2,1,0)

如您所见,由于文档d_3d_4是:

D3:在天空,阳光灿烂。D4:我们可以看到闪亮的阳光,明亮的阳光下。

由此产生的向量vec {v_ \ {d_3}}表明我们有,为了,0次出现的术语的“蓝色”,1次出现的术语“太阳”,等等。在里面vec {v_ \ {d_3}}我们有0出现次数术语的“蓝”,2次出现的术语“太阳”的,等等。

但是等等,因为我们有一个文档集合,现在用向量表示,我们可以用|D | \次F形状,其中D | |是文档空间的基数,或者我们有多少文件已经和F是特性的数量,在我们的例子中由词汇表大小表示。上述向量的矩阵表示示例为:

M_ {| d |\次F}=   \begin{bmatrix}   0 & 1 & 1 & 1\\   0 & 2 & 1 & 0   \end{bmatrix}

正如你可能注意到的,这些表示频率项的矩阵趋向于亚洲金博宝(与大多数归零项),这就是为什么你会看到这些矩阵作为稀疏矩阵的一种常见表现。

Python实践

环境中使用Python v.2.7.2NumPy的1.6.1SciPy的v.0.9.0Sklearn v.0.9 (Scikits.learn)

因为我们知道背后的词频和矢量空间转换的理论,让我们展示的是多么容易使用惊人的做scikit.learnPython模块。

Scikit.learn自带大量的例子以及现实生活中的有趣数据集您可以使用,还有一些辅助功能以下载18k个新闻组的文章为例。

因为我们之前已经定义了我们的小火车/测试数据集,所以让我们用它们来定义数据集scikit.学习可以使用:

test_set = ("The sun in The sky is bright.", "We can see The shining sun, The bright sun.")

在scikit.learn,我们所提出的术语频率,被称为CountVectorizer,所以我们需要导入它,并创建一个新闻实例:

从进口sklearn.feature_extraction.text CountVectorizer矢量器= CountVectorizer()

CountVectorizer已经用作默认的“analyzer”调用WordNGramAnalyzer负责将文本转换为小写字母、去除重音、提取标记、过滤停止词等。您可以通过打印类信息查看更多信息:

打印矢量器CountVectorizer(analyzer__min_n = 1,analyzer__stop_words =组([ '所有', '6', '少', '是', '确实', '上', '移动', '反正', '4','不”, '自己', '通过', '自己',(...)

现在,让我们创造的词汇索引:

vectorizer.fit_transform(train_set)打印vectorizer.vocabulary { '蓝':0, '太阳':1, '鲜艳':2 '天空':3}

看到创建的词汇是一样的E(T)(除了因为它是零索引)。

现在让我们使用相同的矢量器来创建TEST_SET文件:

输出smatrix (0,1) 1 (0,2) 1 (0,3) 1 (1,1) 2 (1,2) 1

注意,创建的稀疏矩阵调用smatrix是一个SciPy的稀疏矩阵元素存储在坐标格式。但是你可以把它转换成一个密集的格式:

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

需要注意的是稀疏矩阵创建相同矩阵M_ {| d |\次F}我们在本文前面引用过,它表示两个文档向量vec {v_ \ {d_3}}vec {v_ \ {d_4}}

我们将在接下来的文章中看到,我们如何定义以色列国防军逆文档频率),而不是简单的术语频率,如规模以及如何对数被用于根据其重要性进行调整词频的测量,以及我们如何能够利用一些众所周知的机器学习方法的使用它来区分文档。

我希望你喜欢这个职位,如果你真的很喜欢,发表评论,所以我会就能知道是否有足够多的人热衷于这些系列的机器学习主题文章。

按照承诺,这里是第二部分本系列教程的一部分。

引用本文为:基督教S. Perone,“机器学习::文本特征提取(TF-IDF) - 第一部分,”在亚洲金博宝未知领域,18/09/2011,//www.cpetem.com/2011/09/machine-learning-text-feature-extraction-tf-idf-part-i/

工具书类

经典向量空间模型

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

维基百科:tf idf

维基百科:向量空间模型

Scikits。学习的例子

更新

9月21日11-固定一些错字和矢量表示法
11年9月22日–根据新的0.9版本修复了sklearn的导入,并添加了environment部分
11年10月2日-修正Latex数学打字错误
10月18日11- 添加链接到教程系列的第二部分
11年3月4日- 固定的格式问题

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

  1. 谢谢,实际实例与理论的搭配是非常方便的看到理论在行动和有助于保持理论更好。亚洲金博宝虽然在这个特殊的岗位,我很失望一点点,因为我觉得它很快就结束了。我想更多的较长的文章。但我猜较长的文章关掉广大的读者。

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

    最近,在返回输入字符串中最相似的字符串的文本处理任务中,我还不得不在Python中处理VSM & TF-IDF。我还没看过科学仪器呢。学习,但它确实看起来有用和直接。

    我用Gensim(VSM人类:http://radimrehurek.com/gensim/)与NLTK一起用于准备数据(即单词标记、降低单词和删除停止词)。我强烈推荐这两个库!

    对于一些(略过时)我的方法的详细信息,请参阅:http://graus.nu/blog/simple-keyword-extraction-in-python/

    谢谢你的职位,并期待第二部分:)。

    1. 内容丰富的博客文章,帮助我了解了很多概念。拜托,继续演下去。

  3. 谢谢,非常有趣。我期待着阅读你以后关于这个主题的文章。

  4. 这是非常有用亚洲金博宝的,易于启动和良好的组织。谢谢。

  5. 非常感谢这个书面记录。有时它真的好知道什么是烹饪后台所有的幻想和神奇功能落后。

  6. 谢谢你!学习向量空间亚洲金博宝模型对我来说非常有用。但是我有一些疑问,请把我的意思说清楚。
    一。在我的工作中,我增加了一些术语,逆文档频率。我想要更精确。所以我想再加一些,请建议我…

  7. 伟大的职位,我肯定会尝试了这一点。

    我很想看到一个类似的细化分解上使用类似svmlight与这些技术相结合。

    谢谢!

  8. 嘿,再一次——我的输出与你的略有不同。我想scikiti -learn的模块可能有变化。

    我会让你知道我发现了什么。

    当心

  9. 你好,
    基本上是类feature_select。text。Sklearn中的Vectorizer现在已被弃用,并被feature_selection.text.TfidfVectorizer所取代。

    整个模块已被完全重新分解 -
    以下是Scikit学习网站上的更改日志:
    http://scikit-learn.org/dev/whats_new.html

    参见下有什么变化“API变动摘要”

    我只是想让你知道这件事。
    喜欢你的文章不管!
    当心

  10. 谢谢你的文章。我目前正在研究一种方法如何索引文件,但在SKOS格式的词库采取词汇术语。
    你的帖子很有趣,对我很有帮助。亚洲金博宝

  11. 嘿感谢的很有见地的文章!亚洲金博宝我在Python中不存在任何想法模块,可以为你做的(我计算出它的硬盘的方式:/)

    只是好奇你碰巧知道如何使用TF-IDF权重特征选择或文本分类方法。我一直在看多篇论文(来自中国最出于某种原因),但我发现接近这个问题的许多方面。

    如果有任何建议或方向引导我走向至于额外的资源,这将不胜感激。

  12. 你好
    我使用python-2.7.3,numpy的-1.6.2-Win32的superpack-python2.7,SciPy的-0.11.0rc1-Win32的superpack-python2.7,scikit学习-0.11.win32-py2.7
    我试图重复你的步骤,但我无法打印矢量器.词汇(见下文)。
    有什么建议吗?
    问候
    安德烈斯索托
    >>> train_set =("天空是蓝色的。、“太阳是明亮的。”)
    >>> TEST_SET =(“在天空中太阳是明亮的。”,
    “我们可以看到明亮的太阳,明亮的太阳。”)
    >>>从sklearn.feature_extraction.text进口CountVectorizer
    >>>矢量器= CountVectorizer()
    > > >打印vectorizer
    CountVectorizer(分析仪=单词,二进制= False, charset = utf - 8,
    严格、dtype charset_error = =, =输入的内容,
    小写=真,max_df=1.0,max_features=None,max_n=1,min_n=1,
    预处理程序= None, stop_words = None, strip_accents =没有
    token_pattern=bww+b,tokenizer=None,词汇表=None)
    > > > vectorizer.fit_transform (train_set)
    <2×6稀疏矩阵类型''
    以坐标格式存储8个元素>
    > > >打印vectorizer.vocabulary

    回溯(最近一次呼叫):
    文件“”,1号线,在
    打印vectorizer.vocabulary
    AttributeError的:“CountVectorizer”对象有没有属性“的词汇”
    >>>

  13. 我试图修复countvector的参数(analyzer=WordNGramAnalyzer,vocabulary=dict),但没有成功。因此,我决定安装sklearn 0.9并且它可以工作,所以我们可以说一切正常,但是我仍然想知道sklearn0.11版本有什么问题亚洲金博宝

    1. 您好安德烈,我知道的是,这个API已在sklearn 0.10 / 0.11改变了很多,我听说这些变化的一些讨论,但我不记得现在在哪里。

  14. 感谢伟大的概述,看起来像部分2链接断开。这将是巨大的,如果你能解决这个问题。谢谢。

  15. 我使用的是Mac和运行0.11版本,但我得到了下面的错误我不知道这个根据最新的API如何更改

    > > train_set
    )天空是蓝色的。、“太阳很明亮。”)
    > > > vectorizer.fit_transform (train_set)
    <2×6稀疏矩阵类型''
    以坐标格式存储8个元素>
    > > >打印vectorizer.vocabulary
    回溯(最近一次呼叫):
    文件“”,1号线,在
    AttributeError的:“CountVectorizer”对象有没有属性“的词汇”
    >>>词汇

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

  17. 亚洲金博宝写得很好。很好的例子的形式,使得它容易跟踪和了解呈现。现在好奇地读更多...
    感谢您分享你的知识
    托马斯,德国

  18. 你好。我无法理解如何计算TF-IDF权重的文本文件我有一个包含30万行文字。每一行被视为一个文件。例如摘自文本文件:

    硬砍
    jeetu智能编辑器
    什亚马尔维萨利泽
    设置演示技巧
    维韦克无人区
    社交路由家伙的分钟讨论学习正确的摄影
    naseer ahmed yahealer
    雅虎搜索mashup
    vaibhav chintan的facebook好友对开
    vaibhav chintan的facebook好友对开
    法官评论
    slickrnot

    我不知道我该做什么。谢谢

  19. 谢谢
    一个写得很好的明确解释

    当然考虑在文本挖掘的第一步时的参考。

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

  21. 很棒的东西。我很欣赏这些信息的简洁性和明确性。一个非常非常大的帮助。

  22. 感谢伟大的职位。你已经用通俗的话解释它,所以像我这样的新手也可以理解。将移动到读取下一个部分!

  23. 解决安德烈斯和Gavin的问题:

    >>>打印vectorizer.vocabulary_

    (新版本的scikit末尾有下划线!)
    将输出:

    {u 'blue”: 0, u 'bright”: 1, u 'sun”: 4 u的成就:2 u '天空”:3 u "”: 5}

    1. 嘿,兄弟,

      你知道是什么(vectorizer.vocabulary_)之间的差值(vectorizer.get_feature_names())?

  24. ” ......你可以简单的选择......” - >‘>>>你可以简单地选择......’

  25. 亚洲金博宝棒极了!
    你让TF-IDF的样子真的很有趣。我期待着更多这样的帖子。

  26. 这很棒!
    对于像我这样的初学者来说真的很有帮助!
    感谢和保持良好的工作!

    干杯!

  27. 你能告诉我特征名称和词汇有什么区别吗?

    我印刷他们两个矢量化,,他们似乎有不同的话后?

    另外,我需要打印出每节课中信息量最大的单词,你能给我一个建议吗?

    谢谢

  28. 谢谢你!这是一篇信息量很大的文亚洲金博宝章。

  29. 谢谢…很好地解亚洲金博宝释道。我觉得我能理解这个概念,现在我要做实验。这对我的工作很有帮助亚洲金博宝

  30. 感谢ü在V [R post..it是,你可以在MATLA亚洲金博宝B告诉它如何工作非常helpful.if可能

  31. 嗨,你有一个不错的博客。
    您提到的文本挖掘,停止像“the, is, at, on”等词。不会帮助我们”。这在一定程度上是正确的,例如在分析网页的情况下,你想忽略网页上的广告,一个好的事情是忽略那些没有停止词的句子。相比之下,正常的句子中有这些词。

  32. 我试过了,没有达到预期的效果:
    请见下文:
    train_set =(“天空是蓝色的。”,“阳光灿烂”。)
    TEST_SET =(“在天空中的太阳是光明的。”,“我们可以看到闪亮的阳光,灿烂的阳光。”)
    从sklearn.feature_extraction.text进口CountVectorizer
    矢量化= CountVectorizer()
    停用词= nltk.corpus.stopwords.words(“英语”)
    vectorizer。stop_words = stopwords
    打印vectorizer
    vectorizer.fit_transform(train_set)
    打印vectorizer.vocabulary

    而我得到“没有”

  33. 很好的教程。亚洲金博宝对于获得官方skikit学习教程和用户指南之外的内容非常有帮助。谢谢。

  34. 我需要一个java程序通过计算tf和idf来索引一组文件,请帮助我

  35. 作为社会学博士候选人是谁在深入学习机的世界里,这个职位是对我也有帮助。亚洲金博宝谢谢!

  36. 你好!
    我有一个关于自然语言处理的问题。有在这一领域“特征提取”和“特征选择”两个词。我不完全了解它们之间是否我们只使用了其中的一种或是否有可能同时使用了文本分类的区别?
    我的第二个问题是“TF”和“TFIDF”是NLP考虑的特征提取方法?

  37. 这的确是一个有趣的文章。就个人而言,我知道,已经在这个岗位被提及亚洲金博宝的一切,我之前所有的人,但有时却是值得花费一点时间来回顾一些东西,你已经知道了。保持良好的工作!

  38. 真的很感谢你抽空写这个帖子的时间。
    非常详细和解释。
    感激。

  39. 我试图与打印(vectorizer.vocabulary_)和它的作品,但我的输出是:
    {“的”:5,“天空”:3,“是”:2,“蓝”:0,“太阳”:4,“鲜艳”:1}

    你知道为什么不忽视“是和‘的’?

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

      以上将避免所有的英语停止词。
      欢呼声……

  40. 这是迄今为止关于TF-IDF和向量空间的最好的文章。谢谢你贴出这么有帮助的文章。请继续写更多关于机器学习基础和概念的文章。谢谢你!

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

  42. 很好的文章…内容丰富,解释方法也很好亚洲金博宝。
    非常感谢!!!

  43. 用于删除停止字的CountVectorizer()方法似乎不清楚,请用正确的语法完成该函数

  44. 好的文章. .亚洲金博宝非常清楚地解释了这个概念。Python代码是额外的奖励。谢谢你!

  45. 您好!我目前正在做的期刊搜索引擎与我的本科TFIDF方法。但我的教授说,我的方法是太旧了。你能在过去的这个建议了一些新的方法5年?或者也许方法来优化TFIDF?有关该方法的进一步的研究论文将是巨大的。非常感谢你!亚洲金博宝

  46. 亚洲金博宝非常有趣和简洁的阅读!我正在使用ML,它真的很有帮助。我也会去看你的其他帖子。

  47. 亚洲金博宝与实施例一步步很好说明。易于理解,真的非常有帮助。亚洲金博宝非常感谢这样的努力。请还进一步发布。

留下回信

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

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