2017-05-20 2 views
0

Ich muss nltk.sent_tokenize() verwenden, um Sätze aus großen Textdateien zu extrahieren. Die Größe der Dateien variiert von 1MB bis 400MB, daher ist es nicht möglich, Dateien vollständig zu laden, da die Speichergrenzen begrenzt sind. Ich denke, es ist nicht möglich, nltk.sent_tokenize() zu verwenden und Dateien zeilenweise zu lesen.Satzsegmentierung mit Nltk in großen Textdateien

Was schlagen Sie vor, diese Aufgabe zu tun?

+0

Sie könnten die Dateien in kleinere Brocken brechen und sie in dieser Körnung verarbeiten. –

Antwort

3

Haben Sie versucht, nur mit dem Leser? Die Corpus-Lesegeräte nltk sind so konzipiert, dass sie Text inkrementell liefern und große Blöcke statt der gesamten Dateien von der Festplatte im Hintergrund lesen. Öffnen Sie einfach einen PlaintextCorpusReader auf Ihrem gesamten Korpus, und es sollte Ihr ganzes Korpus Satz für Satz ohne irgendwelche Spielereien liefern. Zum Beispiel:

reader = nltk.corpus.reader.PlaintextCorpusReader("path/to/corpus", r".*\.txt") 
for sent in reader.sents(): 
    if "shenanigans" in sent: 
     print(" ".join(sent)) 
0

Streamen Sie die Datei und verarbeiten Sie sie beim zeilenweisen Lesen der Datei.

Wenn der Speicher zum Speichern der Tokens ein Problem ist, schreiben Sie die Prozesstoken zeilenweise oder in Stapeln.

Zeile für Zeile:

from __future__ import print_function 
from nltk import word_tokenize 
with open('input.txt', 'r') as fin, open('output.txt', 'w') as fout: 
    for line in fin: 
     tokenized_line = ' '.join(word_tokenize(line.strip())) 
     print(tokenized_line, end='\n', file=fout) 

In Chargen (1000):

from __future__ import print_function 
from nltk import word_tokenize 
with open('input.txt', 'r') as fin, open('output.txt', 'w') as fout: 
    processed_lines = [] 
    for i, line in enumerate(fin): 
     tokenized_line = ' '.join(word_tokenize(line.strip())) 
     processed_lines.append(tokenized_line) 
     if i % 1000 = 0: 
      print('\n'.join(processed_lines), end='\n', file=fout) 
      processed_lines = []