2012-03-24 9 views
5

İlk akarsu veri yazma, G/nltk böylece özürlerimi piton için yeni. Jetonlaşmaya çalıştığım büyük bir dosyam var; Bellek hataları alıyorum.Python NLTK kullanarak büyük (> 70MB) TXT dosyasını toplu hale getirme. soru çok basit olup olmadığını Birleştirme & hataları Her

Okuduğum bir çözüm, bir defada bir satırı okumaktır, bu mantıklıdır, ancak bunu yaparken, cannot concatenate 'str' and 'list' objects hatasını aldım. Bu hatanın neden görüntülendiğinden emin değilim (dosyayı okuduktan sonra, onun türünü kontrol ediyorum ve aslında bir dizedir.

7MB dosyalarını 4 küçük dosyaya bölme girişiminde bulundum. Ben olsun. error: failed to write data to stream

Son olarak dosya (100KB veya daha az) çok küçük bir örnek çalışıyor ve modifiye kodu çalıştırırken, dosyayı tokenize am güçlü olanları içine

Herhangi anlayış. ? teşekkür ederim.

# 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 

küçük dosya ile aşağıdaki işleri:

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

cevap

9

Problem n ° 1: Böyle Char dosya kömürü yineleme vardır. Her satırı verimli bir şekilde okumak istiyorsanız, dosyayı açın (okuyun) ve aşağıdaki gibi file.readlines() üzerinde yineleyin.

Sorun n ° 2: word_tokenize işlevi jeton listesini döndürür, böylece jeton bir listeye str Özetle çalışıyorlardı. İlk önce listeyi bir dizgeye dönüştürmeli ve sonra onu başka bir dizgeye toplayabilirsiniz. Bunu yapmak için join işlevini kullanacağım. Kodumdaki virgülü, yapıştırıcı/ayırıcı olarak kullanmak istediğiniz char ile değiştirin.

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

liste halinde simge gerekir Bunun yerine basitçe yapın:

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

Umut yardımcı olur! python'da

+0

Mükemmel çalışıyor! çok teşekkür ederim luke14free –

+3

Ancak, 'word_tokenize' kelimesinin bir kerede tek bir cümle üzerinde çalıştığını varsayarsak, bu size bazı belirteç hatalarını verecektir. Gerçekten dosyanın bir yığınını okumalı, 'sent_tokenize' ile bölmeli, sonra bunu 'word_tokenize''ye iletmelisin. Eğer satır satır okumak gerekiyorsa, bir acıdır ve cümlenin satırları kırmak. Bu nedenle, şu an için kusurlarla yaşamayı tercih edebilirsiniz ... – alexis

+1

Evet, kodum, bir cümlenin ortasında bir \ n bulamayacağınız oldukça güçlü bir varsayımdan kaynaklanıyor. – luke14free

0

, dosyalar yineleyiciler olarak hareket ederler. Böylece, üzerinde herhangi bir yöntem aramak zorunda kalmadan dosya üzerinde yinelemelisiniz. Bu iterasyon başına bir satır döndürür.

Sorun 1: word_tokenize() bir liste döndürürken, tokenleri bir dize olarak oluşturdunuz.

Sorun 2: Sadece open('filename',"r") tarafından okunması için dosyayı açın.

import nltk 
f=open("X:\MyFile.txt","r") 
tokens=[] 
for line in f: 
    tokens+=nltk.word_tokenize(line) 
print tokens 
f.close()