【问题标题】:Error generating a model reading corpus from a big .txt file从大的 .txt 文件生成模型读取语料库时出错
【发布时间】:2015-03-01 22:07:58
【问题描述】:

我正在尝试读取文件 corpus.txt(训练集)并生成模型,输出必须称为 lexic.txt 并包含单词、标签和出现次数...对于小型训练集它可以工作,但是对于给定训练集的大学(30mb .txt 文件,数百万行),代码不起作用,我想这将是效率问题,因此系统内存不足......谁能帮忙请给我代码?

这里附上我的代码:

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

提前致谢!

【问题讨论】:

  • 什么不起作用?输出错了吗?它没有运行完成吗?
  • @David 对小 .txt 文件非常有效,但对于大 .txt 文件,任务并没有结束,终端提示中止
  • 消息说什么?你有没有试过在它运行时观察你的记忆?
  • @David 内存不足:(
  • 您使用了多少内存?

标签: python machine-learning nlp tagged-corpus


【解决方案1】:

如果将这两个代码块结合起来,您可能能够减少内存使用量。

#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])])

【讨论】:

    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 2019-06-17
      相关资源
      最近更新 更多