Python scikit学习中的TD/IDF

Python scikit学习中的TD/IDF,python,python-2.7,scikit-learn,tf-idf,Python,Python 2.7,Scikit Learn,Tf Idf,关于如何使用tfidftransfer()为语料库的n-grams生成TF/IDF,是否有完整的Python 2.7示例?环顾scikit学习页面,它只有代码片段(不是完整的示例) 问候,, Lin对于TF-IDF特征提取,scikit学习有2个类和。这两个类基本上都有相同的用途,但应该使用不同的方法。对于文本特征提取,scikit learn具有变换器和矢量器的概念。矢量器直接作用于原始文本以生成特征,而转换器作用于现有特征并将其转换为新特征。因此,按照这个类比,TfidfTransforme

关于如何使用tfidftransfer()为语料库的n-grams生成TF/IDF,是否有完整的Python 2.7示例?环顾scikit学习页面,它只有代码片段(不是完整的示例)

问候,,
Lin

对于TF-IDF特征提取,scikit学习有2个类和。这两个类基本上都有相同的用途,但应该使用不同的方法。对于文本特征提取,scikit learn具有变换器和矢量器的概念。矢量器直接作用于原始文本以生成特征,而转换器作用于现有特征并将其转换为新特征。因此,按照这个类比,
TfidfTransformer
处理现有功能并将其转换为TF-IDF功能,而
tfidfvectorier
将原始文本作为输入,并直接生成TF-IDF功能。如果在构建功能时没有现有的文档术语矩阵,则应始终使用
TfidfVectorizer
。在黑盒级别,您应该将
tfidftvectorizer
视为
CountVectorizer
,后跟
tfidftranformer

现在来看
Tfidfectorizer
的工作示例。请注意,如果此示例很清楚,那么您将很容易理解为
TfidfTransformer
给出的示例

现在考虑你的语料库中有以下4个文件:

text = [
        'jack and jill went up the hill',
        'to fetch a pail of water',
        'jack fell down and broke his crown',
        'and jill came tumbling after'
       ]
只要迭代字符串,就可以使用任何
iterable
TFIDFvectorier
还支持从文件中读取文本,他们在文档中详细讨论了这些文件。现在,在最简单的情况下,我们可以初始化
TfidfVectorizer
对象,并将训练数据与之匹配。具体做法如下:

tfidf = TfidfVectorizer()
train_features = tfidf.fit_transform(text)
train_features.shape
这段代码简单地
矢量器适配到我们的输入数据上,并生成一个维度稀疏矩阵
4 x 20
。因此,它将给定文本中的每个文档转换为
20
特征向量,其中词汇表的大小为
20

tfidfvectorier
的情况下,当我们说
fit the model
时,这意味着
tfidfvectorier
从语料库中学习IDF权重转换数据意味着使用拟合模型(学习到的IDF权重)将文档转换为TF-IDF向量。此术语是整个scikit学习过程中的标准术语。它在分类问题中非常有用。考虑一下,如果你想使用一些标示的训练数据,使用TF IDF向量作为特征,将文档分类为正或负。在这种情况下,您将使用培训数据构建TF-IDF矢量器,当您看到新的测试文档时,您只需使用已安装的TFIDF矢量器对其进行转换即可

因此,如果我们有以下
测试\u txt

test_text = [
        'jack fetch water',
        'jill fell down the hill'
       ]
我们将通过简单的操作来构建测试特性

test_data = tfidf.transform(test_text)
这将再次为我们提供一个稀疏矩阵
2 x 20
本例中使用的IDF权重是从训练数据中学习到的。

这就是一个简单的
TFIDFvectorier
的工作原理。通过在构造函数中传递更多参数,可以使其更加复杂。这些都在文档中有很好的记录。我经常使用的一些参数有:

  • ngram_range
    -这允许我们使用n克令牌构建TF-IDF向量。例如,如果我通过
    (1,2)
    ,那么这将同时生成unigram和bigram
  • stop_words
    -允许我们在过程中单独给予忽略。通常的做法是过滤掉几乎所有文档中都存在的单词,如“the”、“of”等
  • min_-df
    max_-df
    -这允许我们根据文档频率动态过滤词汇表。例如,通过将
    max_df
    设置为
    0.7
    ,我可以让我的应用程序自动删除特定于域的停止字。例如,在医学期刊的语料库中,疾病这个词可以被认为是一个停止词
除此之外,您还可以参考我为一个项目编写的。虽然没有很好的文档记录,但是函数的名称非常好


希望这有帮助

Hi Lin,是我为一个项目编写的一段代码。虽然没有很好的文档记录,但是函数的名称非常好。也许你可以看看。谢谢你的鼓励。我将很快起草一份答复。对你的问题回答如下:1。语料库是一个公开上市公司财报电话会议的记录集。每一个财报电话会议记录都是一篇类似于这2条的文章。培训和测试进入画面,因为我正在处理一个分类问题。在TF-IDF的上下文中,训练集是我们学习每个术语的IDF权重的语料库。现在,当我们在测试集中看到这些术语时,我们根据它们在测试集中的出现情况计算TF,但是我们在计算TF-IDF权重时使用训练集的IDF。这允许我们以在线方式转换测试文档,即当它们进入我们的系统时。希望这能说明问题。@LinMa-我已经开始回复:-)。很抱歉,过去两天我很忙,没有时间写下来。对于您的后续问题:1。是的,是像NLTK一样的第三方NLP库。它的功能不如NLTK,但速度非常快。对于这个应用程序,我首先使用unigrams的TF IDF。然后,这些TF-IDF向量将用于训练,使用。您还可以为Bigram构建TF-IDF向量,但这只有在您拥有大型语料库时才有用,因为当您转到高阶N-gram时,您将开始获得非常稀疏的特征向量。如果你有足够大的语料库,你可以尝试不同的N-gram和s