2 回答

TA貢獻1811條經驗 獲得超5個贊
test_02問題是,一次處理的內容,中間數據結構不適合內存。分塊處理應該可以解決問題。例如,如果句子從不在行之間拆分,則漸進處理將如下所示:
with open("test_02", "r") as ftest, open("sentences.txt", "w") as f:
for line in ftest:
for sent in nlp(line).sents:
f.write(str(sent)+"\n")
由于句子可以跨越多行,您可能希望使用不同的拆分策略test_02,例如通過雙換行符來拆分for line in ftest.read().split('\n\n'),但很可能即使這種天真的方法也能正常工作。

TA貢獻1865條經驗 獲得超7個贊
你的直接原因MemoryError
是將很多不需要的東西加載到內存中。
首先,整個test_02
文件作為一個巨大的字符串被放入可尋址內存中。(你必須有很多內存,因為這一步對很多人來說都會失?。。?/p>
用空格替換所有換行符——為什么,確切地說?– 可能會暫時加倍內存需求,因為.replace()
返回一個副本。(不過,令人驚訝的是,你還沒有耗盡記憶力。)
然后,要求 Spacy 解析大量文本——Spacy 的解析本身通常是一個復雜的步驟——觸發了 Spacy 代碼深處的錯誤。(但是,如果運氣好或擴展系統內存沒有觸發錯誤,那么您的下一行可能會嘗試創建所有 . 的堆內列表.sents
。)
好消息是:您可能不需要執行任何這些操作。盡管 gensim 的參數名稱為Word2Vec
, sentences
,但它實際上并不需要合法的句子。它只需要文本,其中每個文本都是一個字符串標記列表。(這些可以是許多段落的完整文章/文檔,或其他任何內容。word2vec 的某些用法甚至會留下標點符號作為偽詞。)
您的test_02
文件,如果它已經被標記為您想要的“單詞”,其中每一行都是合理大小的文本并且單詞由單個空格分隔,則可能已經準備好傳遞給Word2Vec
. 嘗試...
from gensim.models.word2vec import LineSentence corpus = LineSentence('test_02')
..然后corpus
作為sentences
參數提供給Word2Vec
. 如果實際上您test_02
需要更復雜的預處理/標記化,請先執行此操作,如果您需要那種復雜程度,則可以使用 Spacy,然后創建一個文件,每行一個文本和以空格分隔的標記。
在任何時候都沒有必要將整個語料庫加載到單個堆內字符串或列表中;它可以而且幾乎總是應該根據需要從磁盤流式傳輸,以避免消耗太多主內存。
添加回答
舉報