2012-03-24 11 views
5

Zunächst einmal bin ich neu bei Python/Nltk so meine Entschuldigung, wenn die Frage zu einfach ist. Ich habe eine große Datei, die ich zu symbolisieren versuche; Ich bekomme Speicherfehler.Tokenizing große (> 70 MB) TXT-Datei mit Python NLTK. Verkettung & Schreiben von Daten, um Fehler zu streamen

Eine Lösung, die ich gelesen habe, ist, die Datei Zeile für Zeile zu lesen, was jedoch Sinn macht, wenn ich das tue, bekomme ich den Fehler cannot concatenate 'str' and 'list' objects. Ich bin nicht sicher, warum dieser Fehler seit angezeigt wird (nach dem Lesen der Datei, ich überprüfe seinen Typ und es ist in der Tat eine Zeichenfolge.

Ich habe versucht, die 7MB Dateien in 4 kleinere zu teilen, und wenn das ausgeführt wird, ich bekomme. error: failed to write data to stream

Schließlich, wenn eine sehr kleine Probe der Datei (100 KB oder weniger) versuchen, und den geänderten Code ausgeführt wird, ich bin in der Lage, die Datei tokenize

Irgendwelche Einblicke in das, was passiert.

# 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 

Die folgenden Arbeiten mit kleiner Datei:

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

Antwort

9

Problem n ° 1: Sie sind Iterieren die Datei char von char so. Wenn Sie jede Zeile effizient lesen möchten, öffnen Sie einfach die Datei (lesen Sie sie nicht) und durchlaufen Sie file.readlines() wie folgt.

Problem Nr. 2: Die Funktion "word_tokenize" gibt eine Liste von Tokens zurück, also haben Sie versucht, einen String mit einer Liste von Tokens zu summieren. Sie müssen zuerst die Liste in eine Zeichenfolge umwandeln und sie dann zu einer anderen Zeichenfolge zusammenfassen. Ich werde die Join-Funktion verwenden, um das zu tun. Ersetzen Sie das Komma in meinem Code durch das Zeichen, das Sie als Kleber/Trennzeichen verwenden möchten.

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

Wenn Sie stattdessen die Token in einer Liste müssen einfach tun:

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

Hoffnung, das hilft!

+0

Funktioniert perfekt! Vielen Dank luke14free –

+3

Aber denken Sie daran, dass 'word_tokenize' annimmt, dass es immer nur einen Satz enthält, so dass Sie einige Tokenisierungsfehler bekommen. Wirklich müssen Sie einen Teil der Datei lesen, teilen Sie es mit 'sent_tokenize', dann übergeben Sie das an' word_tokenize'. Was ist ein Schmerz, wenn Sie Zeile für Zeile lesen müssen, und Ihre Sätze über Linien brechen. Vielleicht möchten Sie also lieber mit den Unvollkommenheiten leben ... – alexis

+1

Ja, mein Code basiert auf der ziemlich starken Annahme, dass Sie kein \ n in der Mitte eines Satzes finden können. – luke14free

0

In Python fungieren Dateien als Iteratoren. Sie können also einfach über die Datei iterieren, ohne Methoden aufrufen zu müssen. Dies würde eine Zeile pro Iteration zurückgeben.

Problem 1: Sie haben Tokens als Zeichenfolge erstellt, während word_tokenize() eine Liste zurückgibt.

Problem 2: Öffnen Sie einfach die Datei zum Lesen von 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()