2012-03-24 4 views
5

まず、Python/nltkの新機能です。質問があまりにも基本的であれば、私の謝罪です。私はトークン化しようとしている大きなファイルを持っています。私はメモリエラーが発生します。Python NLTKを使用して大きな(> 70MB)TXTファイルをトークン化します。ストリームのエラーを連結してデータを書き込む

私が読んだ解決策の1つは、一度に1行ずつ読むことですが、それは意味がありますが、そのときにエラーcannot concatenate 'str' and 'list' objectsが表示されます。

私は7MBのファイルを4つの小さなファイルに分割しようとしましたが、そのファイルを実行すると、そのエラーが表示される理由がわかりません(ファイルを読み込んだ後、私が取得:。 error: failed to write data to stream

最後に、ファイル(100キロバイト以下)の非常に小さなサンプルを試して、変更したコードを実行するときに、私は、ファイルをトークン化することができる午前何が起こっているかに

任意の洞察力を。 ?ありがとう。

# 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 

小さなファイルで、次の作品:

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

答えて

9

問題のn°1:あなたはそのような文字でファイルの文字を反復しています。すべての行を効率よく読み込むには、単にファイルを開くだけで(読み込まないでください)、file.readlines()を次のように繰り返します。

問題2:word_tokenize関数はトークンのリストを返します。したがって、strをトークンのリストに合計しようとしていました。最初にリストを文字列に変換してから別の文字列に集計する必要があります。私はそれを行うために結合関数を使用するつもりです。私のコードのコンマを、あなたがグルー/セパレータとして使用したい文字に置き換えます。

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

リスト内のトークンは、単に行う必要がある代わりに、場合:

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

希望に役立ちます!

+0

完璧に機能します。ありがとうございますluke14free –

+3

しかし、 'word_tokenize'は一度に1つの文で実行されていることを前提としているので、トークン化エラーが発生します。実際には、ファイルの塊を読み込み、 'sent_tokenize'で分割し、' word_tokenize'に渡す必要があります。 1行ずつ読む必要があり、文章が複数の行にまたがる場合は痛みです。だから今のところ不完全で暮らしている方が好きかもしれません... – alexis

+1

はい、私のコードは、文の途中で\ nを見つけることができないというかなり強い仮定に基づいています。 – luke14free

0

ファイルでは、ファイルはイテレータとして機能します。したがって、ファイルを呼び出す必要なく、ファイルを繰り返し処理できます。これは反復ごとに1行を返します。

問題1:文字列としてトークンを作成しましたが、word_tokenize()はリストを返します。

問題2:ファイルを開くために、単に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() 
関連する問題