Python MemoryError:无法为形状为(5004,96)且数据类型为int32的数组分配1.83 MiB

Python MemoryError:无法为形状为(5004,96)且数据类型为int32的数组分配1.83 MiB,python,dataframe,out-of-memory,spacy,Python,Dataframe,Out Of Memory,Spacy,当我想要处理一个巨大的csv文件时,我得到了一个MemoryErrorMemoryError:无法为一个具有形状(5004,96)和数据类型int32的数组分配1.83 MiB。错误发生在: processed_text=[nlp.pipe中文本的文本(str(标记化_文本), 禁用=[“ner”, “解析器”]] 当我使用多个线程时,这会被修复吗?如果是这样的话,有人用Python做过一些例子吗,因为我来自Java 全文: df=pd.read\u csv('posts\u result.c

当我想要处理一个巨大的csv文件时,我得到了一个MemoryError
MemoryError:无法为一个具有形状(5004,96)和数据类型int32的数组分配1.83 MiB。错误发生在:

processed_text=[nlp.pipe中文本的文本(str(标记化_文本),
禁用=[“ner”,
“解析器”]]
当我使用多个线程时,这会被修复吗?如果是这样的话,有人用Python做过一些例子吗,因为我来自Java

全文:

df=pd.read\u csv('posts\u result.csv'))
df_样本=df.样本(分形=0.1,替换=假,随机_状态=1)
“数据探索”
text\u test=df\u sample.post.tolist()
#启动标记化
def tokenize_标签(文本):
标点符号='!"$%&\'()*+,-./:;?[\\]^_`{|}~'
对于标点符号中的标点符号:
text=str(text).替换(标点符号“”)
text=text.lower()
text=text.split()
返回文本
tokenized_text=[文本测试中文本的tokenize_标签(文本)]
nlp=spacy.load(“en_core\u web\u sm”)
已处理的_文本=[nlp.pipe中文本的文本(str(标记化的_文本),
禁用=[“ner”,
“解析器”]]
df_样本['processed']=标记化_文本
标记化文本=[[word.text for word in text if(word.pos='NOUN'或word.pos='VERB'或word.pos='PROPN'),而非len(word.text)>12而非word.is\u punch而非word.is\u stop而非word.text='X'
而不是word.text=='@Name']
对于已处理的_文本中的文本]

您在这里没有提供足够的信息,但看起来您无法在内存中保存所有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)])

这样,您只需保留所需的字符串,而不是文档,因此应该可以减少内存使用

关于您的代码的一些其他注释

无论您试图用hashtag函数做什么,它都不起作用。如果调用
str(text.split())
输出非常奇怪-它会将
I like cheese
变成
['I','like','cheese']
-这将导致spaCy给您无意义的输出。我建议不要使用该功能,spaCy希望处理puncutation


您似乎正在使用spaCy删除基于词性的单词(大多数情况下),但这通常不是一个好主意-现代文本处理不需要这种预过滤。这仍然是15年前的常见做法,但你应该能够根据任何合理的模型给出完整的句子,它们会比过度过滤的文本更好。

有什么错误吗?MemoryError:无法为arra分配1.83 MiBy带形状(5004,96)和数据类型int32@JimeneMexa您确定您提供了整个程序吗?例如,是否缺少一些导入语句?另外,您的输入文件有多少行,一个典型的行是什么样子?