Ошибка при создании корпуса чтения модели из большого файла.txt
Я пытаюсь прочитать файл corpus.txt (обучающий набор) и создать модель, вывод должен называться lexic.txt и содержать слово, тег и число вхождений... для небольших обучающих наборов это работает, но для данного учебного комплекта университета (30-мегабайтный текстовый файл, миллионы строк) код не работает, я думаю, что это будет проблемой с эффективностью, и, следовательно, системе не хватает памяти... кто-нибудь может мне помочь с код пожалуйста?
Здесь я прилагаю свой код:
from collections import Counter
file=open('corpus.txt','r')
data=file.readlines()
file.close()
palabras = []
count_list = []
for linea in data:
linea.decode('latin_1').encode('UTF-8') # para los acentos
palabra_tag = linea.split('\n')
palabras.append(palabra_tag[0])
cuenta = Counter(palabras) # dictionary for count ocurrences for a word + tag
#Assign for every word + tag the number of times appears
for palabraTag in palabras:
for i in range(len(palabras)):
if palabras[i] == palabraTag:
count_list.append([palabras[i], str(cuenta[palabraTag])])
#We delete repeated ones
finalList = []
for i in count_list:
if i not in finalList:
finalList.append(i)
outfile = open('lexic.txt', 'w')
outfile.write('Palabra\tTag\tApariciones\n')
for i in range(len(finalList)):
outfile.write(finalList[i][0]+'\t'+finalList[i][1]+'\n') # finalList[i][0] is the word + tag and finalList[i][1] is the numbr of ocurrences
outfile.close()
И здесь вы можете увидеть образец corpus.txt:
Al Prep
menos Adv
cinco Det
reclusos Adj
murieron V
en Prep
las Det
últimas Adj
24 Num
horas NC
en Prep
las Det
cárceles NC
de Prep
Valencia NP
y Conj
Barcelona NP
en Prep
incidentes NC
en Prep
los Det
que Pron
su Det
Заранее спасибо!
2 ответа
Наконец, я улучшил код, используя словарь, вот результат, работающий на 100%:
file=open('corpus.txt','r')
data=file.readlines()
file.close()
diccionario = {}
for linea in data:
linea.decode('latin_1').encode('UTF-8') # para los acentos
palabra_tag = linea.split('\n')
cadena = str(palabra_tag[0])
if(diccionario.has_key(cadena)):
aux = diccionario.get(cadena)
aux += 1
diccionario.update({cadena:aux})
else:
diccionario.update({cadena:1})
outfile = open('lexic.txt', 'w')
outfile.write('Palabra\tTag\tApariciones\n')
for key, value in diccionario.iteritems() :
s = str(value)
outfile.write(key +" "+s+'\n')
outfile.close()
Вы можете уменьшить использование памяти, если объедините эти два фрагмента кода.
#Assign for every word + tag the number of times appears
for palabraTag in palabras:
for i in range(len(palabras)):
if palabras[i] == palabraTag:
count_list.append([palabras[i], str(cuenta[palabraTag])])
#We delete repeated ones
finalList = []
for i in count_list:
if i not in finalList:
finalList.append(i)
Вы можете проверить, существует ли уже элемент в списке счетчиков, и, таким образом, не добавлять дубликаты в первую очередь. Это должно уменьшить использование вашей памяти. Увидеть ниже;
#Assign for every word + tag the number of times appears
for palabraTag in palabras:
for i in range(len(palabras)):
if palabras[i] == palabraTag and
[palabras[i], str(cuenta[palabraTag])] not in count_list:
count_list.append([palabras[i], str(cuenta[palabraTag])])