2014-10-14 20 views
8

Tôi có mảng một chiều với các chuỗi lớn trong mỗi phần tử. Tôi đang cố gắng sử dụng một số CountVectorizer để chuyển đổi dữ liệu văn bản thành các vectơ số. Tuy nhiên, tôi gặp lỗi khi nói:CountVectorizer: AttributeError: đối tượng 'numpy.ndarray' không có thuộc tính 'lower'

AttributeError: 'numpy.ndarray' object has no attribute 'lower' 

mealarray chứa các chuỗi lớn trong mỗi phần tử. Có 5000 mẫu như vậy. Tôi cố gắng để vectorize này như đưa ra dưới đây:

vectorizer = CountVectorizer(
    stop_words='english', 
    ngram_range=(1, 1), #ngram_range=(1, 1) is the default 
    dtype='double', 
) 
data = vectorizer.fit_transform(mealarray) 

Các stacktrace đầy đủ:

File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/text.py", line 817, in fit_transform 
    self.fixed_vocabulary_) 
    File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/text.py", line 748, in _count_vocab 
    for feature in analyze(doc): 
    File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/text.py", line 234, in <lambda> 
    tokenize(preprocess(self.decode(doc))), stop_words) 
    File "/Library/Python/2.7/site-packages/sklearn/feature_extraction/text.py", line 200, in <lambda> 
    return lambda x: strip_accents(x.lower()) 
AttributeError: 'numpy.ndarray' object has no attribute 'lower' 
+1

Một người nào đó (không có dấu vết ngăn xếp đầy đủ, thật khó để biết ai, hoặc là scikit hoặc Numpy) đang cố xử lý mảng Numpy dưới dạng một chuỗi ('" FOO ".lower()' trả về '" foo "') . Bạn có chắc nội dung 'mealarray' là các chuỗi, hay' CountVectorizer' muốn một mảng chuỗi? –

+0

@AhmedFasih, vừa thêm dấu vết ngăn xếp đầy đủ vào câu hỏi! – ashu

Trả lời

11

Kiểm tra hình dạng của mealarray. Nếu đối số cho fit_transform là một chuỗi các chuỗi, thì đó phải là mảng một chiều. (Tức là, mealarray.shape phải có dạng (n,).) Ví dụ: bạn sẽ nhận được lỗi "không có thuộc tính" nếu mealarray có hình dạng như (n, 1).

Bạn có thể thử một cái gì đó giống như

data = vectorizer.fit_transform(mealarray.ravel()) 
+0

Tôi đã thử nó với ravel và có lỗi sau. AttributeError: đối tượng 'NoneType' không có thuộc tính 'lower'. Hình dạng của mealarray là (5000,1) bởi vì tôi tạo ra nó bằng cách sử dụng "mealarray = np.empty ((plen, 1), dtype = object)" – ashu

+1

OK, vì vậy bạn sau đó điền vào mảng sau đó. Sau đó, bạn phải có một số lượng thực tế của các từ trong 'mealarray', đúng không? Giả sử nó là 'nwords'. Sau đó chuyển 'mealarray [: nwords] .ravel()' thành 'fit_transform()'. (Mặc dù tôi tự hỏi tại sao bạn tạo mảng với hình dạng '(plen, 1)' thay vì chỉ '(plen,)'.) –

+0

Lưu ý: Trong bình luận trước, tôi giả định rằng bạn điền vào 'mealarray' ngay từ đầu, với không có chỉ mục nào chứa 'None' giữa các chỉ mục có chứa các từ. –

5

Got câu trả lời cho câu hỏi của tôi. Về cơ bản, CountVectorizer đang lấy danh sách (có nội dung chuỗi) làm đối số thay vì mảng. Điều đó đã giải quyết được vấn đề của tôi.

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