2012-11-08 21 views
6

Python sklearn kitaplıklarını kullanıyorum. 150.000'den fazla ciro var.scipy.sparse ile sayma

Her satırın bir cümle için olduğu, her bir sütunun bir kelimeye karşılık geldiği ve her öğenin söz konusu cümledeki sözcük sayısı olan dizi benzeri bir nesneye ihtiyacım var.

Örneğin:

[ [1, 1, 1, 0] 
, [0, 1, 1, 1] ] 

ihtiyaç iki cümle olsaydı "köpek koştu" ve "çocuk koştu" (sütun sıralamasının bir önemi yoktur ve sütun atandığı bağlıdır hangi kelime)

Dizim seyrek olacaktır (her bir cümlede olası sözcüklerin bir kısmı olacaktır) ve bu yüzden scipy.sparse kullanıyorum.

def word_counts(texts, word_map): 
    w_counts = sp.???_matrix((len(texts),len(word_map))) 

    for n in range(0,len(texts)-1): 
     for word in re.findall(r"[\w']+", texts[n]): 
      index = word_map.get(word) 
      if index != None: 
       w_counts[n,index] += 1 
    return w_counts 

... 
nb = MultinomialNB() #from sklearn 
words = features.word_list(texts) 
nb.fit(features.word_counts(texts,words), classes) 

Kaba matrisin en iyi hangisinin olacağını bilmek istiyorum.

Ben coo_matrix kullanarak çalıştı ama bir hata var: Ben COO için documentation baktı

TypeError: 'coo_matrix' object has no attribute '__getitem__'

ama çok tarafından karıştı aşağıdadır:

Sparse matrices can be used in arithmetic operations ...
Disadvantages of the COO format ... does not directly support: arithmetic operations

ben dok_matrix kullanılan ve o Çalıştı, ama bu durumun en iyi performans gösterip göstermediğini bilmiyorum.

Şimdiden teşekkürler.

cevap

6

lil_matrix veya dok_matrix; Bunların inşa edilmesi ve denetlenmesi kolaydır (ancak, her bir ekleme işlemi doğrusal olarak zaman aldığı için lil_matrix durumunda potansiyel olarak çok yavaştır). Seyrek matrisleri kabul eden Scikit-öğrenim tahmincileri, herhangi bir formatı kabul eder ve bunları dahili bir formatta (genellikle csr_matrix) dönüştürür. Ayrıca, tocoo, todok, tocsr vb. Yöntemlerini kullanarak dönüştürmeyi de scipy.sparse matrislerinde yapabilirsiniz. Ya da scikit-learn'in tam olarak bu amaçla sağladığı CountVectorizer veya DictVectorizer sınıflarını kullanın. CountVectorizer girdi olarak tüm belgeler alır:

>>> from sklearn.feature_extraction.text import CountVectorizer 
>>> documents = ["The dog ran", "The boy ran"] 
>>> vectorizer = CountVectorizer(min_df=0) 
>>> vectorizer = CountVectorizer(min_df=0, stop_words=[]) 
>>> X = CountVectorizer.fit_transform(documents) 
>>> X = vectorizer.fit_transform(documents) 
>>> X.toarray() 
array([[0, 1, 1, 1], 
     [1, 0, 1, 1]]) 

... DictVectorizer zaten numune başına bir dict o sonucu ile, sembolleştirmeyi ve sayma yaptık üstlenir iken:

>>> from sklearn.feature_extraction import DictVectorizer 
>>> documents = [{"the":1, "boy":1, "ran":1}, {"the":1, "dog":1, "ran":1}] 
>>> X = vectorizer.fit_transform(documents) 
>>> X.toarray() 
array([[ 1., 0., 1., 1.], 
     [ 0., 1., 1., 1.]]) 
>>> vectorizer.inverse_transform(X[0]) 
[{'ran': 1.0, 'boy': 1.0, 'the': 1.0}] 

(min_dfCountVectorizer argümanı, bir kaç yayınya önce eklendi. Eski bir sürüm kullanıyorsanız, onu çıkar ya da yükseltme işlemi yapın.)

EDIT SSS'ye göre, , bağlantımı açıklamalıdır, bu yüzden işte burada: DictVectorizer yazarıyım ve ayrıca CountVectorizer parçalarını da yazdım.

+0

+1 sadece CountVectorizer için CountVectorizer –

+0

+1 teklif edecektim. –

+0

Kabul edilen cevap, CountVectorizer'ın gerçek cevap olduğu için. (Belki de DictVectorizer da, ama henüz denemedim.) –