2014-12-29 25 views
15

Tôi có năm tệp văn bản mà tôi nhập vào Bộ đếm số. Khi xác định min_df và max_df cho thể hiện CountVectorizer, tần số tài liệu min/max chính xác có nghĩa là gì? Có phải tần suất của một từ trong tệp văn bản cụ thể của nó hay là tần số của từ trong toàn bộ kho văn bản (5 tệp txt)?Hiểu min_df và max_df trong scikit CountVectorizer

Khác biệt như thế nào khi min_df và max_df được cung cấp dưới dạng số nguyên hoặc làm nổi?

Tài liệu dường như không cung cấp giải thích kỹ lưỡng cũng như không cung cấp ví dụ để chứng minh việc sử dụng min_df và/hoặc max_df. Ai đó có thể cung cấp giải thích hoặc ví dụ minh họa min_df hoặc max_df.

Trả lời

63

max_df được sử dụng để xóa các cụm từ xuất hiện quá thường xuyên, còn được gọi là "từ dừng cụ thể theo cụm từ". Ví dụ:

  • max_df = 0.50 có nghĩa là "bỏ qua thuật ngữ xuất hiện trong hơn 50% các văn bản".
  • max_df = 25 có nghĩa là "bỏ qua các cụm từ xuất hiện trong hơn 25 tài liệu".

Giá trị mặc định là max_df1.0, có nghĩa là "bỏ qua thuật ngữ xuất hiện trong hơn 100% các văn bản". Do đó, cài đặt mặc định không bỏ qua bất kỳ điều khoản nào.


min_df được sử dụng để loại bỏ thuật ngữ xuất hiện quá thường xuyên. Ví dụ:

  • min_df = 0.01 có nghĩa là "bỏ qua thuật ngữ xuất hiện trong ít hơn 1% của các tài liệu".
  • min_df = 5 có nghĩa là "bỏ qua các cụm từ xuất hiện trong dưới 5 tài liệu".

Giá trị mặc định là min_df1, có nghĩa là "bỏ qua thuật ngữ xuất hiện trong ít hơn 1 tài liệu". Do đó, cài đặt mặc định không bỏ qua bất kỳ điều khoản nào.

11

Theo tài liệu CountVectorizerhere.

Khi sử dụng phao trong phạm vi [0.0, 1.0], chúng tham chiếu đến tần suất tài liệu. Đó là phần trăm tài liệu có chứa thuật ngữ.

Khi sử dụng int, nó đề cập đến số lượng tài liệu tuyệt đối giữ cụm từ này.

Hãy xem xét ví dụ nơi bạn có 5 tệp văn bản (hoặc tài liệu). Nếu bạn đặt max_df = 0.6 thì điều đó sẽ chuyển thành tài liệu 0.6*5=3. Nếu bạn đặt max_df = 2 thì điều đó chỉ đơn giản là dịch thành 2 tài liệu.

Ví dụ mã nguồn dưới đây được sao chép từ Github here và cho biết cách max_doc_count được tạo từ max_df. Mã cho min_df là tương tự và có thể được tìm thấy trên trang GH.

max_doc_count = (max_df 
       if isinstance(max_df, numbers.Integral) 
       else max_df * n_doc) 

Giá trị mặc định cho min_dfmax_df tương ứng là 1 và 1,0. Điều này về cơ bản nói "Nếu thuật ngữ của tôi được tìm thấy trong chỉ 1 tài liệu, sau đó nó bị bỏ qua. Tương tự nếu nó được tìm thấy trong tất cả các tài liệu (100% hoặc 1.0) thì nó bị bỏ qua."

max_dfmin_df đều được sử dụng trong nội bộ để tính toán max_doc_countmin_doc_count, tối đa và tối thiểu số lượng tài liệu mà một thuật ngữ phải được tìm thấy trong. Điều này sau đó được chuyển cho self._limit_features như các đối số từ khóa highlow tương ứng, docstring cho self._limit_features

"""Remove too rare or too common features. 

Prune features that are non zero in more samples than high or less 
documents than low, modifying the vocabulary, and restricting it to 
at most the limit most frequent. 

This does not prune samples with zero features. 
""" 
+2

Điều này gây nhầm lẫn. Tài liệu cho 'min_df' nói 'bỏ qua các cụm từ có tần suất tài liệu ** thấp hơn ** so với ngưỡng đã cho.' Vì vậy, tần suất nghiêm ngặt thấp hơn giá trị mặc định của 1 sẽ có nghĩa là bỏ qua các cụm từ không bao giờ xuất hiện (!) Nhưng giữ các cụm từ xuất hiện một lần. –

+0

@MonicaHeddneck là chính xác. Câu trả lời này giải thích sai ý nghĩa chính xác của 'min_df' và' max_df'. Tôi đã thêm một câu trả lời giải thích chính xác cách các tham số này được diễn giải bởi CountVectorizer. –

2

Giá trị mặc định cho min_df và max_df là 1 và 1,0, tương ứng. Những mặc định này thực sự không làm gì cả.

Điều đó đang được nói, tôi tin rằng câu trả lời hiện được chấp nhận bởi câu trả lời @Ffisegydd là không hoàn toàn chính xác.

Ví dụ, chạy này bằng cách sử dụng giá trị mặc định, để thấy rằng khi min_df=1max_df=1.0, sau đó

1) tất cả các thẻ xuất hiện trong ít nhất một tài liệu được sử dụng (ví dụ, tất cả các thẻ!)

2) tất cả các thẻ xuất hiện trong tất cả các tài liệu được sử dụng (chúng tôi sẽ kiểm tra với một ứng cử viên: ở khắp mọi nơi).

cv = CountVectorizer(min_df=1, max_df=1.0, lowercase=True) 
# here is just a simple list of 3 documents. 
corpus = ['one two three everywhere', 'four five six everywhere', 'seven eight nine everywhere'] 
# below we call fit_transform on the corpus and get the feature names. 
X = cv.fit_transform(corpus) 
vocab = cv.get_feature_names() 
print vocab 
print X.toarray() 
print cv.stop_words_ 

Chúng tôi nhận được:

[u'eight', u'everywhere', u'five', u'four', u'nine', u'one', u'seven', u'six', u'three', u'two'] 
[[0 1 0 0 0 1 0 0 1 1] 
[0 1 1 1 0 0 0 1 0 0] 
[1 1 0 0 1 0 1 0 0 0]] 
set([]) 

Tất cả các thẻ đang lưu giữ. Không có từ dừng.

Làm rối tung thêm các đối số sẽ làm rõ các cấu hình khác.

Để biết niềm vui và thông tin chi tiết, tôi cũng khuyên bạn nên chơi xung quanh với stop_words = 'english' và thấy điều đó, đặc biệt, tất cả các từ ngoại trừ 'bảy' đều bị xóa! Bao gồm cả 'ở khắp mọi nơi'.

0

Tôi cũng sẽ thêm điểm này để hiểu rõ hơn min_dfmax_df trong tf-idf tốt hơn.

Nếu bạn đi với các giá trị mặc định, có nghĩa là xem xét tất cả các điều khoản, bạn đã tạo ra nhiều mã thông báo hơn. Vì vậy, quá trình phân cụm của bạn (hoặc bất kỳ điều gì khác bạn muốn làm với các điều khoản sau này) sẽ mất nhiều thời gian hơn.

NHƯNG chất lượng của cụm của bạn KHÔNG được giảm.

Người ta có thể nghĩ rằng cho phép tất cả các cụm từ (ví dụ: cụm từ quá thường xuyên hoặc từ dừng) có mặt có thể làm giảm chất lượng nhưng trong tf-idf thì không. Bởi vì đo lường tf-idf theo bản năng sẽ cung cấp cho một điểm số thấp cho những điều khoản, có hiệu quả làm cho chúng không có ảnh hưởng (như chúng xuất hiện trong nhiều tài liệu).

Vì vậy, để tổng hợp, hãy cắt tỉa các cụm từ qua số min_dfmax_df để cải thiện hiệu suất chứ không phải chất lượng của các cụm (ví dụ).

Và điểm quan trọng là nếu bạn đặt minmax nhầm lẫn, bạn sẽ mất một số cụm từ quan trọng và do đó làm giảm chất lượng. Vì vậy, nếu bạn không chắc về ngưỡng thích hợp (tùy thuộc vào bộ tài liệu của bạn) hoặc nếu bạn chắc chắn về khả năng xử lý của máy, hãy để nguyên các thông số min, max không thay đổi.

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