MemoryError: Unable to allocate 1.83 MiB for an array with shape (5004, 96) and data type int32
MemoryError: Unable to allocate 1.83 MiB for an array with shape (5004, 96) and data type int32
当我想处理一个巨大的 csv 文件时,我遇到了内存错误 MemoryError: Unable to allocate 1.83 MiB for an array with shape (5004, 96) and data type int32
。错误发生在:
processed_texts = [text for text in nlp.pipe(str(tokenized_texts),
disable=["ner",
"parser"])]
当我使用多线程时,这个问题会得到解决吗?如果是这样,有人在 Python 中有一些例子吗,因为我来自 Java..
整个脚本:
df = pd.read_csv('posts_result.csv')
df_sample = df.sample(frac=0.1, replace=False, random_state=1)
""" DATA EXPLORATION """
text_test = df_sample.post.tolist()
# Start the tokenization
def tokenize_hashtag(text):
punctuations = '!"$%&\'()*+,-./:;<=>?[\]^_`{|}~'
for punctuation in punctuations:
text = str(text).replace(punctuation, '')
text = text.lower()
text = text.split()
return text
tokenized_texts = [tokenize_hashtag(text) for text in text_test]
nlp = spacy.load("en_core_web_sm")
processed_texts = [text for text in nlp.pipe(str(tokenized_texts),
disable=["ner",
"parser"])]
df_sample['processed'] = tokenized_texts
tokenized_texts = [[word.text for word in text if (word.pos_ == 'NOUN' or word.pos_ == 'VERB' or word.pos_ == 'PROPN') and not len(word.text) >12 and not word.is_punct and not word.is_stop and not word.text=='X'
and not word.text == '@Name']
for text in processed_texts]
您在这里提供的信息还不够,但看起来您无法在内存中保存所有 spaCy 文档。
一个非常简单的解决方法是将 CSV 文件拆分并一次处理一个块。
您可以做的另一件事是通过稍微更改您的 for 循环来避免保存文档,因为看起来您只是在保存一些单词。
nlp = spacy.load("en_core_web_sm")
def keep_word(word):
if word.pos_ not in ("NOUN", "VERB", "PROPN"):
return False
if word.text == "@Name":
return False
return True
out = []
for doc in nlp.pipe(str(tokenized_texts),disable=["ner", "parser"]):
out.append([ww.text for ww in doc if keep_word(ww)])
这样你就可以只保留你想要的字符串而不是文档,所以它应该减少内存使用。
关于您的代码的一些其他评论...
无论您尝试使用主题标签功能做什么,它都不起作用。如果你调用 str(text.split())
输出真的很奇怪 - 它会把 I like cheese
变成 ['I', 'like', 'cheese']
- 它会导致 spaCy 给你无意义的输出。我建议不要使用该功能,spaCy 希望处理标点符号。
您似乎正在使用 spaCy 根据词性(大部分)删除单词,但这通常不是一个好主意 - 现代文本处理不需要那种预过滤。这在 15 年前仍然是常见的做法,但你应该能够将整个句子提供给任何合理的模型,它们会比过度过滤的文本更好。
当我想处理一个巨大的 csv 文件时,我遇到了内存错误 MemoryError: Unable to allocate 1.83 MiB for an array with shape (5004, 96) and data type int32
。错误发生在:
processed_texts = [text for text in nlp.pipe(str(tokenized_texts),
disable=["ner",
"parser"])]
当我使用多线程时,这个问题会得到解决吗?如果是这样,有人在 Python 中有一些例子吗,因为我来自 Java..
整个脚本:
df = pd.read_csv('posts_result.csv')
df_sample = df.sample(frac=0.1, replace=False, random_state=1)
""" DATA EXPLORATION """
text_test = df_sample.post.tolist()
# Start the tokenization
def tokenize_hashtag(text):
punctuations = '!"$%&\'()*+,-./:;<=>?[\]^_`{|}~'
for punctuation in punctuations:
text = str(text).replace(punctuation, '')
text = text.lower()
text = text.split()
return text
tokenized_texts = [tokenize_hashtag(text) for text in text_test]
nlp = spacy.load("en_core_web_sm")
processed_texts = [text for text in nlp.pipe(str(tokenized_texts),
disable=["ner",
"parser"])]
df_sample['processed'] = tokenized_texts
tokenized_texts = [[word.text for word in text if (word.pos_ == 'NOUN' or word.pos_ == 'VERB' or word.pos_ == 'PROPN') and not len(word.text) >12 and not word.is_punct and not word.is_stop and not word.text=='X'
and not word.text == '@Name']
for text in processed_texts]
您在这里提供的信息还不够,但看起来您无法在内存中保存所有 spaCy 文档。
一个非常简单的解决方法是将 CSV 文件拆分并一次处理一个块。
您可以做的另一件事是通过稍微更改您的 for 循环来避免保存文档,因为看起来您只是在保存一些单词。
nlp = spacy.load("en_core_web_sm")
def keep_word(word):
if word.pos_ not in ("NOUN", "VERB", "PROPN"):
return False
if word.text == "@Name":
return False
return True
out = []
for doc in nlp.pipe(str(tokenized_texts),disable=["ner", "parser"]):
out.append([ww.text for ww in doc if keep_word(ww)])
这样你就可以只保留你想要的字符串而不是文档,所以它应该减少内存使用。
关于您的代码的一些其他评论...
无论您尝试使用主题标签功能做什么,它都不起作用。如果你调用 str(text.split())
输出真的很奇怪 - 它会把 I like cheese
变成 ['I', 'like', 'cheese']
- 它会导致 spaCy 给你无意义的输出。我建议不要使用该功能,spaCy 希望处理标点符号。
您似乎正在使用 spaCy 根据词性(大部分)删除单词,但这通常不是一个好主意 - 现代文本处理不需要那种预过滤。这在 15 年前仍然是常见的做法,但你应该能够将整个句子提供给任何合理的模型,它们会比过度过滤的文本更好。