2016-04-03 12 views
1

En sık kullanılan sözcükleri bulmak için 'FreqDist' işlevine büyük bölünmüş bir liste iletmeye çalışıyorum. Nasıl nltk.FreqDur geçmek için büyük bir bölünmüş liste veya dosya

ben aşağıdaki gibi turşu kullanarak liste splitted: Artık

import nltk 
import cPickle as pickle 
import sys 
import os 
import itertools as it 
for no,i in enumerate(it.islice(it.count(), 3, 33+3, 3)): 
    if no == 0: 
     fil = tokens[0:i] 
    else: 
     fil = tokens[i-3+1:i+1] 

    file_name = "/tmp/words/text" + str(no+1) + '.p' 
    files = open(file_name, "wb") 
    pickle.dump(fil, files) 
    files.close() 

Ben aşağıdaki gibi bir sınıf operatörü kullanarak dosyaları aktarmak istiyorum: bu şekilde yapıyor, ne yazık ki

class Passer(object): 
    def __init__(self,path): 
     self.path = path 

    def __iter__(self): 
     return self 

    def __next__(self): 
     for fname in os.listdir(self.path): 
      with open(self.path + "/" + fname, "rb") as f: 
       fil = pickle.load(f) 
       yield fil 

passer = Passer(path="/tmp/words") 
words = nltk.FreqDist(passer) 

Bu hatayı aldım: Bu sorunun nasıl çözüleceği konusunda bir fikri var mı?

+2

Python 2'deki yineleyiciler 'next' yöntemini tanımlamalıdır (alt çizgi yoktur). – vaultah

+0

Yani yaptığım şey python 3'te çalışacaktı, değil mi? – alexmulo

+0

'__next__', Python 3'te çalışırdı, evet. Yine de, Python 3'te cPickle yok. – vaultah

cevap

0

Dene:

FreqDist(chain(*[word_tokenize(line) for line in open('in.txt')])) 

Örn: Ben 11 turşu dosyalarına aşağıdaki metni saklanan

[email protected]:~$ echo """This is a foo bar sentence 
> Not any more hahaha""" > in.txt 
[email protected]:~$ cat in.txt 
This is a foo bar sentence 
Not any more hahaha 
[email protected]:~$ python 
Python 2.7.11 (default, Dec 15 2015, 16:46:19) 
[GCC 4.8.4] on linux2 
fType "help", "copyright", "credits" or "license" for more information. 
>>> from nltk import FreqDist 
>>> from itertools import chain 
>>> from nltk import word_tokenize 
>>> FreqDist(chain(*[word_tokenize(line) for line in open('in.txt')])) 
FreqDist({'a': 1, 'bar': 1, 'sentence': 1, 'This': 1, 'is': 1, 'hahaha': 1, 'Not': 1, 'foo': 1, 'any': 1, 'more': 1}) 
+0

Bu yalnızca bir çözümdür. Belki de 'TypeError'dan nasıl kurtulacağını açıklamalısınız? – vaultah

+0

Merhaba alvas cevabınız için çok teşekkürler. Bu jeneratörü yapmamda bana yardımcı oldu: 'nltk.FreqDist (it.chain ([pickle.load' da kelime için kelime (open (dosya_adı)) os.listdir ("/ tmp/words /") dosya_adı için )))) '. Çok iyi çalışıyor! Sınıf ve __iter__ işlevini kullanarak benzer bir şey yapma olanağı var mı? Tekrar teşekkürler – alexmulo

+0

Bence kendi sınıfınızı oluşturmak için bir corpus oluşturmak için bir overkill olabilir. NLTK'da zaten kodlanmış olan korpus okuyucularına bir göz atın. Bu size yardımcı olabilir, https://github.com/nltk/nltk/tree/develop/nltk/corpus/reader – alvas

0

:

text = 'The European Union’s plan to send refugees fleeing Syria’s civil war back to Turkey en masse could be illegal, a top UN official has said, as concerns mounted that Greece,Greece2' 

dizin denir kelimeler (yol =/tmp/kelimeler) ve testo1, testo2 ve benzeri adlı 11 doldurma vardır. Şimdi benim hedefe ulaşmak için doğru anlama öğrendim: Artık

nltk.FreqDist([word for f in os.listdir("/tmp/words/") for word in pickle.load(open("/tmp/words/"+f))]) 

, her şeyin çalışıyor ama bu adım FreqDist adım besleyecek eğer kendime soruyorum veya ilk listeyi yükleniyor, ve görünüyor ki onu işler. Çünkü benim fikrim, dosyaları bir kerede belleğe kaydetmek için tümüyle yüklemeden adım adım yükleyip işlemekti.

Yardımlarınız için tekrar teşekkürler.

İlgili konular