친구가이 작은 프로그램을 작성했습니다. textFile
의 크기는 1.2GB (7 년 분량의 신문)입니다. 그는 사전을 성공적으로 생성 할 수는 있지만 pickle (프로그램이 멈춤)을 사용하여 파일에 쓸 수는 없습니다.피클을 사용하여 거대한 bigram 사전을 파일로 저장
import sys
import string
import cPickle as pickle
biGramDict = {}
textFile = open(str(sys.argv[1]), 'r')
biGramDictFile = open(str(sys.argv[2]), 'w')
for line in textFile:
if (line.find('<s>')!=-1):
old = None
for line2 in textFile:
if (line2.find('</s>')!=-1):
break
else:
line2=line2.strip()
if line2 not in string.punctuation:
if old != None:
if old not in biGramDict:
biGramDict[old] = {}
if line2 not in biGramDict[old]:
biGramDict[old][line2] = 0
biGramDict[old][line2]+=1
old=line2
textFile.close()
print "going to pickle..."
pickle.dump(biGramDict, biGramDictFile,2)
print "pickle done. now load it..."
biGramDictFile.close()
biGramDictFile = open(str(sys.argv[2]), 'r')
newBiGramDict = pickle.load(biGramDictFile)
미리 감사드립니다.
편집
에 관심있는 사람들을 위해 내가 간단히이 프로그램이 무엇을 설명 할 것이다.
<s>
Hello
,
World
!
</s>
<s>
Hello
,
munde
!
</s>
<s>
World
domination
.
</s>
<s>
Total
World
domination
!
</s>
<s>
문장 구분됩니다 : 당신을 가정 는 다음과 같이 대략 형식의 파일을 가지고있다.- 한 줄에 한 단어 씩.
나중에 사용할 수 있도록 biGramDictionary가 생성됩니다. 이 같은
뭔가 :이 도움이
{
"Hello": {"World": 1, "munde": 1},
"World": {"domination": 2},
"Total": {"World": 1},
}
희망. 지금은 sqlite가 작동하지 않아서 mysql을 사용하는 것으로 바뀌었다. (아마도 크기 때문에)
큰 파일을 망칠 경우 데이터베이스를 사용하지 않으시겠습니까? 또한, 같은 파일을 두 번 반복하는 루프를 참조하십시오. 중복 될 수 있으며 처리 비용이 추가됩니다. 샘플 입력 파일로 무엇을하고 있는지 설명하지 않으시겠습니까? – ghostdog74
ghostdog74, 명령문에 2가 표시되지만 파일에 루프가 하나만 있습니다. 파일을 반복하면 실제 위치에서 행을 읽는 것만으로 파일 시작 부분을 찾지 않습니다. – Messa
간단히 [sqlitedict] (https://pypi.python.org/pypi/sqlitedict) (RAM이 아닌 디스크상의 DB가 지원하는 Python dict)을 사용해보십시오. – Radim