【问题标题】:Create a DTM from large corpus从大型语料库创建 DTM
【发布时间】:2016-10-09 00:43:33
【问题描述】:

我有一组包含在列表中的文本,我从 csv 文件中加载了这些文本

texts=['this is text1', 'this would be text2', 'here we have text3']

我想通过使用词干创建一个文档术语矩阵。 我还阻止了他们:

[['text1'], ['would', 'text2'], ['text3']]

我想做的是创建一个计算所有词干的 DTM(然后我需要对行进行一些操作)。

对于未提取文本的问题,我可以使用报告here 的函数 fn_tdm_df 为短文本制作 DTM。 不过,对我来说更实用的是制作词干的 DTM。为了更清楚,我应用“fn_tdm_df”的输出:

  be  have  here   is  text1  text2  text3  this   we  would
0  1.0   1.0   1.0  1.0    1.0    1.0    1.0     1  1.0    1.0
1  0.0   0.0   0.0  0.0    0.0    0.0    0.0     1  0.0    0.0

首先,我不知道为什么我只有两行,而不是三行。其次,我想要的输出是这样的:

  text1  would  text2  text3
0   1      0      0      0
1   0      1      1      0
2   0      0      0      1

我很抱歉,但我对这个输出真的很绝望。我还尝试在 R 上导出和重新导入词干文本,但它没有正确编码。对于大量数据,我可能需要处理 DataFrame。你有什么建议?

----- 更新

使用 CountVectorizer 我并不完全满意,因为我没有得到一个易于处理的矩阵,我可以在其中轻松地对行/列进行归一化和求和。

这是我正在使用的代码,但它阻塞了 Python(数据集太大)。如何高效运行?

vect = CountVectorizer(min_df=0., max_df=1.0)
X = vect.fit_transform(texts)
print(pd.DataFrame(X.A, columns=vect.get_feature_names()).to_string())
df = pd.DataFrame(X.toarray().transpose(), index = vect.get_feature_names())

【问题讨论】:

    标签: python pandas scikit-learn nltk


    【解决方案1】:

    为什么不使用sklearnCountVectorizer() 方法将文本文档集合转换为令牌计数矩阵。更重要的是,它使用scipy 给出了计数的稀疏表示。

    您可以将原始条目提供给该方法,也可以按照您的方式对其进行预处理(词干 + 停用词)。

    看看这个:CountVectorizer()

    【讨论】:

    • 确实是个好主意。我试过了,但它给了我一个“令人困惑”的输出,也就是说,我想要一个易于处理的矩阵,我可以在其中对列进行求和并创建新的列。这是我按照您的提示执行的代码(请参阅编辑后的帖子)。
    • fit_transform() 方法返回一个array。您可以使用 pandas 将其转换为 DataFrame。然后你就可以对你的数据做任何你想做的事情了。
    • 确实不错。但是,Python 在运行我的代码(上图)时阻止了它,这与您的建议一致。有关如何使其顺利运行的任何提示?
    • 它在哪里阻塞?你有没有尝试减少你的单词数量?使用stop_words = 'english' 作为CountVectorizer 的参数。看看它是否首先对数据集进行了足够的修剪。
    • 我在此之前删除了标点符号。它在计算 df 时阻塞,在最后一行。我在发布代码行之前进行了词干提取。我怎样才能减少一点矩阵?