2 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
test_02問題是,一次處理的內(nèi)容,中間數(shù)據(jù)結(jié)構(gòu)不適合內(nèi)存。分塊處理應(yīng)該可以解決問題。例如,如果句子從不在行之間拆分,則漸進(jìn)處理將如下所示:
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貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
你的直接原因MemoryError
是將很多不需要的東西加載到內(nèi)存中。
首先,整個(gè)test_02
文件作為一個(gè)巨大的字符串被放入可尋址內(nèi)存中。(你必須有很多內(nèi)存,因?yàn)檫@一步對(duì)很多人來說都會(huì)失?。。?/p>
用空格替換所有換行符——為什么,確切地說?– 可能會(huì)暫時(shí)加倍內(nèi)存需求,因?yàn)?code>.replace()返回一個(gè)副本。(不過,令人驚訝的是,你還沒有耗盡記憶力。)
然后,要求 Spacy 解析大量文本——Spacy 的解析本身通常是一個(gè)復(fù)雜的步驟——觸發(fā)了 Spacy 代碼深處的錯(cuò)誤。(但是,如果運(yùn)氣好或擴(kuò)展系統(tǒng)內(nèi)存沒有觸發(fā)錯(cuò)誤,那么您的下一行可能會(huì)嘗試創(chuàng)建所有 . 的堆內(nèi)列表.sents
。)
好消息是:您可能不需要執(zhí)行任何這些操作。盡管 gensim 的參數(shù)名稱為Word2Vec
, sentences
,但它實(shí)際上并不需要合法的句子。它只需要文本,其中每個(gè)文本都是一個(gè)字符串標(biāo)記列表。(這些可以是許多段落的完整文章/文檔,或其他任何內(nèi)容。word2vec 的某些用法甚至?xí)粝聵?biāo)點(diǎn)符號(hào)作為偽詞。)
您的test_02
文件,如果它已經(jīng)被標(biāo)記為您想要的“單詞”,其中每一行都是合理大小的文本并且單詞由單個(gè)空格分隔,則可能已經(jīng)準(zhǔn)備好傳遞給Word2Vec
. 嘗試...
from gensim.models.word2vec import LineSentence corpus = LineSentence('test_02')
..然后corpus
作為sentences
參數(shù)提供給Word2Vec
. 如果實(shí)際上您test_02
需要更復(fù)雜的預(yù)處理/標(biāo)記化,請(qǐng)先執(zhí)行此操作,如果您需要那種復(fù)雜程度,則可以使用 Spacy,然后創(chuàng)建一個(gè)文件,每行一個(gè)文本和以空格分隔的標(biāo)記。
在任何時(shí)候都沒有必要將整個(gè)語料庫加載到單個(gè)堆內(nèi)字符串或列表中;它可以而且?guī)缀蹩偸菓?yīng)該根據(jù)需要從磁盤流式傳輸,以避免消耗太多主內(nèi)存。
添加回答
舉報(bào)