2012-03-24 12 views
5

Antes que nada, soy nuevo en python/nltk así que mis disculpas si la pregunta es demasiado básica. Tengo un archivo grande que estoy tratando de tokenizar; Tengo errores de memoria.Tokenización de archivo TXT grande (> 70 MB) con Python NLTK. Concatenación y escritura de datos para transmitir errores

Una de las soluciones que he leído es leer el archivo una línea a la vez, lo que tiene sentido, sin embargo, al hacerlo obtengo el error cannot concatenate 'str' and 'list' objects. No estoy seguro de por qué se muestra ese error ya que (después de leer el archivo, compruebo su tipo y de hecho es una cadena.

He intentado dividir los archivos de 7MB en 4 más pequeños, y al ejecutar eso, me sale:. error: failed to write data to stream

Por último, cuando se trata de una muestra muy pequeña del archivo (100 KB o menos), y ejecutando el código modificado, soy capaz de tokenize el archivo

Cualquier ideas sobre lo que está sucediendo. ? Gracias.

# tokenizing large file one line at a time 
import nltk 
filename=open("X:\MyFile.txt","r").read() 
type(raw) #str 
tokens = '' 
for line in filename 
     tokens+=nltk.word_tokenize(filename) 
#cannot concatenate 'str' and 'list' objects 

Los siguientes trabajos con pequeño archivo:

import nltk 
filename=open("X:\MyFile.txt","r").read() 
type(raw) 
tokens = nltk.word.tokenize(filename) 

Respuesta

9

Problema n ° 1: Usted está iterando el carbón archivo de carbón así. Si desea leer cada línea de manera eficiente, simplemente abra el archivo (no lo lea) e itere sobre file.readlines() de la siguiente manera.

Problema n ° 2: La función word_tokenize devuelve una lista de tokens, por lo que intentaba sumar un str a una lista de tokens. Primero tiene que transformar la lista en una cadena y luego puede sumarla a otra cadena. Voy a usar la función de unión para hacer eso. Reemplaza la coma de mi código con la que quieras usar como pegamento/separador.

import nltk 
filename=open("X:\MyFile.txt","r") 
type(raw) #str 
tokens = '' 
for line in filename.readlines(): 
    tokens+=",".join(nltk.word_tokenize(line)) 

Si por el contrario lo que necesita las fichas en una lista simplemente hacer:

import nltk 
filename=open("X:\MyFile.txt","r") 
type(raw) #str 
tokens = [] 
for line in filename.readlines(): 
    tokens+=nltk.word_tokenize(line) 

Espero que ayude!

+0

Funciona perfectamente! muchas gracias luke14free –

+3

Pero ten en cuenta que 'word_tokenize' supone que se ejecuta en una sola oración a la vez, por lo que esto te dará algunos errores de tokenización. Realmente necesitas leer un trozo del archivo, dividirlo con 'sent_tokenize', luego pasarlo a' word_tokenize'. Lo cual es un problema si necesita leer línea por línea, y sus oraciones se cruzan en líneas. Así que quizás prefiera vivir con las imperfecciones por ahora ... – alexis

+1

Sí, mi código se basa en la suposición bastante fuerte de que no puede encontrar un \ n en el medio de una oración. – luke14free

0

En python, los archivos actúan como iteradores. Por lo tanto, puede simplemente iterar sobre el archivo sin tener que llamar a ningún método. Esto devolvería una línea por iteración.

Problema 1: Ha creado tokens como una cadena, mientras que word_tokenize() devuelve una lista.

Problema 2: Simplemente abra el archivo para leer por open('filename',"r").

import nltk 
f=open("X:\MyFile.txt","r") 
tokens=[] 
for line in f: 
    tokens+=nltk.word_tokenize(line) 
print tokens 
f.close() 
Cuestiones relacionadas