2012-03-24 8 views
5

Prima di tutto, sono nuovo in Python/nltk, quindi mi scuso se la domanda è troppo semplice. Ho un file di grandi dimensioni che sto cercando di tokenize; Ottengo errori di memoria.Tokenizzazione di file TXT di grandi dimensioni (> 70 MB) utilizzando Python NLTK. Concatenazione e scrittura di dati per lo streaming di errori

Una soluzione di cui ho letto è leggere il file una riga alla volta, il che ha senso, tuttavia, quando lo faccio, viene visualizzato l'errore cannot concatenate 'str' and 'list' objects. Non sono sicuro del motivo per cui viene visualizzato quell'errore (dopo aver letto il file, ne controllo il tipo ed è in realtà una stringa.

Ho provato a suddividere i file da 7 MB in 4 più piccoli, e quando lo eseguo, ottengo:. error: failed to write data to stream

Infine, quando si cerca un campione molto piccolo del file (100 KB o meno), e l'esecuzione del codice modificato, sono in grado di tokenize il file

Eventuali approfondimenti di ciò che sta accadendo. ? Grazie

# 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 

le seguenti opere con file di piccole dimensioni:

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

risposta

9

Problema n ° 1: Si iterazione il file char da char così. Se vuoi leggere ogni riga in modo efficiente, basta aprire il file (non leggerlo) e scorrere su file.readlines() come segue.

Problema n ° 2: la funzione word_tokenize restituisce un elenco di token, quindi si stava tentando di sommare un str a un elenco di token. Devi prima trasformare la lista in una stringa e quindi sommarla a un'altra stringa. Userò la funzione join per farlo. Sostituisci la virgola nel mio codice con il carattere che vuoi usare come colla/separatore.

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

Se invece avete bisogno i gettoni in una lista semplicemente:

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

Speranza che aiuta!

+0

Funziona perfettamente! grazie mille luke14free –

+3

Ma sappi che 'word_tokenize' presuppone che sia eseguito su una singola frase alla volta, quindi questo ti darà alcuni errori di tokenizzazione. In realtà è necessario leggere un blocco del file, dividerlo con 'sent_tokenize', quindi passarlo a' word_tokenize'. Che è un dolore se hai bisogno di leggere riga per riga e le tue frasi sfondano le righe. Quindi potresti preferire semplicemente vivere con le imperfezioni per ora ... – alexis

+1

Sì, il mio codice si basa sul presupposto abbastanza forte che non riesci a trovare un \ n nel mezzo di una frase. – luke14free

0

In python, i file funzionano come iteratori. Quindi puoi semplicemente scorrere il file senza dover chiamare alcun metodo su di esso. Ciò restituirebbe una riga per iterazione.

Problema 1: i token sono stati creati come una stringa mentre word_tokenize() restituisce un elenco.

Problema 2: aprire semplicemente il file per la lettura tramite 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()