我有一个巨大的文件,我希望将每一行视为文档,并使用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}
我该怎么办?
答案 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")
将您的语料库划分为单独的文档,直到拆分函数未获取换行符。