我正在使用 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 RAM,在以 60% 使用率运行一段时间后,引发 MemoryError 异常。
我做了一些研究,并合并了 make_corpus
函数以避免将两个文档同时加载到内存中。根据 SO 和 Mark Needham 博客上的建议,我还将 max_features
减少到 500,将 min_df
和 max_df
分别减少到 0.2 和 0.8,以解决这个问题。
但是这个错误仍然存在。
欢迎任何帮助。
谢谢!
最佳答案
Python 不会施加超出操作系统施加的内存限制。确保您没有使用 ulimit 或等效项来限制进程的内存使用。同时运行 top 并查看该进程是否使用了所有可用内存。
你的文档每个都接近 2GB 吗?它是多个文档的串联吗?如果是这样,也许可以进一步拆分文档。
我建议设置 Spark 安装并检查那里的代码。您已经拥有这些文件,因此唯一剩下的就是运行 tfidf 部分。它有Python 接口(interface),所以它会相当轻松。 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)
关于python - Tfidf内存错误: How to avoid this issue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35857837/