Tfidf MemoryError:如何避免此问题?

时间:2016-03-08 02:30:31

标签: python machine-learning scikit-learn text-mining tf-idf

我使用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_dfmax_df分别减少到0.2和0.8,以解决这个问题。

但是这个错误仍然存​​在。

欢迎任何帮助。

谢谢!

1 个答案:

答案 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)