2017-05-20 3 views
0

大きなテキストファイルから文章を抽出するには、nltk.sent_tokenize()を使用する必要があります。ファイルのサイズは1MBから400MBまで様々です。そのため、メモリの制限のためにファイルを完全にロードすることはできません。nltk.sent_tokenize()を使用してファイルを1行ずつ読み込むことはできません。大文字ファイルでnltkを使用した文のセグメンテーション

このタスクを実行するにはどうすればよいですか?

+0

ファイルを小さな塊に分割し、その穀粒で処理することができます。 –

答えて

3

あなただけのリーダーを使用してみましたか? nltkコーパスリーダーは、ファイル全体ではなく、場面の背後にあるディスクから大きなブロックを読み取って、段階的にテキストを配信するように設計されています。だから、PlaintextCorpusReaderをあなたのコーパス全体に開いてください。そして、それはあなたの全コーパスの文章を、何らかの無差別なことなしに文章で伝えなければなりません。例:

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

ファイルをストリームし、ファイルを1行ずつ読み込むときに処理します。

トークンを格納するメモリが問題の場合は、プロセストークンを1行ずつ、またはバッチで書き出します。ラインによって

ライン:バッチで

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) 

(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 = [] 
関連する問題