2012-11-08 32 views
6

Tôi đang sử dụng thư viện sklearn của Python. Tôi có hơn 150.000 câu.Đếm với scipy.sparse

Tôi cần một đối tượng giống như mảng, trong đó mỗi hàng là một câu, mỗi cột tương ứng với một từ và mỗi phần tử là số từ trong câu đó.

Ví dụ: Nếu hai câu là "Con chó chạy" và "Cậu bé chạy", tôi cần

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

(thứ tự của các cột là không thích hợp, và phụ thuộc vào cột được gán cho từ nào)

Mảng của tôi sẽ thưa thớt (mỗi câu sẽ có một phần nhỏ các từ có thể) và vì vậy tôi đang sử dụng scipy.sparse.

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) 

Tôi muốn biết ma trận thưa thớt nào là tốt nhất.

tôi đã cố gắng sử dụng coo_matrix nhưng có một lỗi:

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

Tôi nhìn documentation cho COO nhưng đã rất bối rối bởi những điều sau:

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

tôi đã sử dụng dok_matrix, và rằng đã làm việc, nhưng tôi không biết điều này có thực hiện tốt nhất trong trường hợp này hay không.

Xin cảm ơn trước.

Trả lời

6

Hãy thử hoặc lil_matrix hoặc dok_matrix; chúng dễ xây dựng và kiểm tra (nhưng trong trường hợp lil_matrix, có khả năng rất chậm khi mỗi lần chèn có thời gian tuyến tính). Những người ước tính học hỏi bằng Scikit chấp nhận các ma trận thưa thớt sẽ chấp nhận bất kỳ định dạng nào và chuyển đổi chúng thành một định dạng hiệu quả trong nội bộ (thường là csr_matrix). Bạn cũng có thể tự thực hiện chuyển đổi bằng cách sử dụng các phương pháp tocoo, todok, tocsr v.v. trên scipy.sparse ma trận.

Hoặc, chỉ sử dụng các lớp học CountVectorizer hoặc DictVectorizer mà tìm hiểu scikit cung cấp cho chính xác mục đích này. CountVectorizer mất toàn bộ tài liệu như là đầu vào:

>>> 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]]) 

... trong khi DictVectorizer giả sử bạn đã làm tokenization và đếm, với kết quả đó trong một dict mỗi mẫu:

>>> 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}] 

(Các min_df đối số cho CountVectorizer đã được thêm vào một vài bản phát hành trước. Nếu bạn đang sử dụng một phiên bản cũ, hãy bỏ qua nó hoặc thay vào đó, hãy nâng cấp.)

EDIT Theo Câu hỏi thường gặp, tôi phải tiết lộ chi nhánh của tôi, do đó, ở đây: Tôi là tác giả của DictVectorizer và tôi cũng đã viết một phần của CountVectorizer.

+0

1 tôi đã chỉ cần đi để đề xuất CountVectorizer –

+0

1 cho CountVectorizer –

+0

câu trả lời chấp nhận vì CountVectorizer là câu trả lời thực sự ở đây. (Có lẽ DictVectorizer quá, nhưng tôi chưa thử nó.) –

Các vấn đề liên quan