将CountVectorizer与文件一起使用,其中每一行都是文档

时间:2016-11-12 17:00:11

标签: python scikit-learn

我有一个巨大的文件,我希望将每一行视为文档,并使用CountVectorizer创建矢量。

到目前为止我尝试过:

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(input='file', decode_error='ignore', strip_accents='unicode')
corpus = open('corpus.txt')
vectors = vectorizer.fit_transform([corpus]).toarray()
print vectors
print vectorizer.vocabulary_

文件corpus.txt

Human machine interface for lab abc computer applications
A survey of user opinion of computer system response time
The EPS user interface management system

我期望获得一个包含三个向量的数组。相反,我得到一个带有一个向量的数组:

[[1 1 2 1 1 1 2 1 1 1 2 1 1 1 2 1 1 2]]
{u'lab': 7, u'eps': 3, u'applications': 1, u'management': 9, u'user': 17, u'human': 5, u'interface': 6, u'response': 12, u'abc': 0, u'for': 4, u'of': 10, u'system': 14, u'machine': 8, u'computer': 2, u'survey': 13, u'time': 16, u'opinion': 11, u'the': 15}

我该怎么办?

3 个答案:

答案 0 :(得分:1)

小心,从文档中,CountVectorizer的input=file参数有:

  

如果是'file',则序列项必须具有'read'方法(类文件对象),该方法被调用以获取内存中的字节。

调用文件的read方法会将整个文本作为单个字符串读入内存。因此,使用[corpus],您将获得一个表示文件整个文本的字符串。

为什么不这样做呢?

vectorizer = CountVectorizer(decode_error='ignore',strip_accents='unicode')
corpus = open('corpus.txt')
vectors = vectorizer.fit_transform(corpus).toarray()

您可以直接传递文件句柄corpus,因为fit接受迭代器。这应该允许您构建矢量化器而无需将整个文件读入内存。

答案 1 :(得分:0)

您正在将整个文件传递给它。如果你想逐行进行,你需要一个循环,一次将一行传递给CV并返回一个向量。您仍然只使用一个CV对象,只需多次调用fit_transform。

或者您可以将其读入pandas数据帧然后使用apply但可能时间相似。

答案 2 :(得分:0)

修改后的代码:

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(input='file', decode_error='ignore', strip_accents='unicode')
corpus = open('corpus.txt')
docs = corpus.split("\n") 
vectors = vectorizer.fit_transform(docs)
print vectors
print vectorizer.vocabulary_

此行docs = corpus.split("\n")将您的语料库划分为单独的文档,直到拆分函数未获取换行符。