我使用scikit-learn
TfidfVectorizer
找出两份文件中最重要的字词。每个文件是1.9GB(约9000万字),并且已经是较低的文本,被阻止(使用nltk.stem.porter.PorterStemmer
)和无阻字(英文停用词)。
我使用以下代码:
def simp_tokenizer(text):
from nltk import word_tokenize
return word_tokenize(text)
def make_corpus(path):
from glob import glob
files = glob(path)
for doc in files:
yield open(doc, 'r').read()
def tfidf(path):
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = make_corpus(path = path)
tfidf = TfidfVectorizer(max_features = 500, max_df = 0.8, min_df = 0.2, use_idf = True, tokenizer = simp_tokenizer, analyzer = 'word', ngram_range = (1,1))
tfs = tfidf.fit_transform(corpus)
return tfs
我有16GB内存,在运行60%使用一段时间后,引发了MemoryError异常。
我做了一些研究,并整合了make_corpus
函数,以避免同时将两个文档都加载到内存中。根据有关SO和Mark Needham博客的建议,我还将max_features
减少到500,将min_df
和max_df
分别减少到0.2和0.8,以解决这个问题。
但是这个错误仍然存在。
欢迎任何帮助。
谢谢!
答案 0 :(得分:0)
Python不会强制超出操作系统强加的内存限制。确保您没有使用 ulimit 或等效内容限制进程的内存使用量。还要运行 top ,看看该进程是否使用了所有可用内存。
你的文件每个2GB附近怎么样?它是多个文档的串联吗?如果是这样,可能会更多地拆分文件。
我建议设置Spark安装并检查那里的代码。你已经有了这些文件,所以剩下的就是运行tfidf部分了。它有Python界面,所以它会相当轻松。 Spark非常适合处理大文件 - 可能会克服scikit-learn的错误。
from pyspark import SparkContext
from pyspark.mllib.feature import HashingTF
from pyspark.mllib.feature import IDF
sc = SparkContext(...)
# Load documents (one per line).
documents = sc.textFile("...").map(lambda line: line.split(" "))
hashingTF = HashingTF()
tf = hashingTF.transform(documents)
tf.cache()
idf = IDF().fit(tf)
tfidf = idf.transform(tf)