2012-04-11 37 views
23

Tôi về cơ bản có same question as this guy .. example in the NLTK book cho trình phân loại Naive Bayes chỉ xem một từ xuất hiện trong tài liệu dưới dạng đối tượng địa lý hay không. của các từ như tính năng để xem ("bag-of-words").Thực hiện loại phân loại Naive-Bayes trong NLTK

One of the answers dường như đề xuất điều này không thể thực hiện được với các bộ phân loại NLTK được tích hợp sẵn. Đó là trường hợp? Làm thế nào tôi có thể làm tần số/túi-of-từ NB phân loại với NLTK?

Trả lời

31

scikit-learnan implementation of multinomial naive Bayes, là biến thể phù hợp của Bay ngây thơ trong tình huống này. Tuy nhiên, một máy vectơ hỗ trợ (SVM) có thể hoạt động tốt hơn.

Như Ken đã chỉ ra trong các ý kiến, NLTK có a nice wrapper for scikit-learn classifiers. Sửa đổi từ các tài liệu, đây là một phần hơi phức tạp mà không TF-IDF trọng, chọn 1000 tính năng tốt nhất dựa trên thống kê chi2, và sau đó vượt qua đó vào một phân loại đa dạng Bayes ngây thơ. (. Tôi đặt cược này có phần vụng về, như tôi không phải siêu quen thuộc với một trong hai NLTK hoặc scikit-học)

import numpy as np 
from nltk.probability import FreqDist 
from nltk.classify import SklearnClassifier 
from sklearn.feature_extraction.text import TfidfTransformer 
from sklearn.feature_selection import SelectKBest, chi2 
from sklearn.naive_bayes import MultinomialNB 
from sklearn.pipeline import Pipeline 

pipeline = Pipeline([('tfidf', TfidfTransformer()), 
        ('chi2', SelectKBest(chi2, k=1000)), 
        ('nb', MultinomialNB())]) 
classif = SklearnClassifier(pipeline) 

from nltk.corpus import movie_reviews 
pos = [FreqDist(movie_reviews.words(i)) for i in movie_reviews.fileids('pos')] 
neg = [FreqDist(movie_reviews.words(i)) for i in movie_reviews.fileids('neg')] 
add_label = lambda lst, lab: [(x, lab) for x in lst] 
classif.train(add_label(pos[:100], 'pos') + add_label(neg[:100], 'neg')) 

l_pos = np.array(classif.classify_many(pos[100:])) 
l_neg = np.array(classif.classify_many(neg[100:])) 
print "Confusion matrix:\n%d\t%d\n%d\t%d" % (
      (l_pos == 'pos').sum(), (l_pos == 'neg').sum(), 
      (l_neg == 'pos').sum(), (l_neg == 'neg').sum()) 

này in cho tôi:

Confusion matrix: 
524  376 
202  698 

Không hoàn hảo, nhưng đàng hoàng, xem xét nó không phải là một vấn đề siêu dễ dàng và nó chỉ được đào tạo trên 100/100.

+1

Thực ra, anh ấy có thể muốn các mô hình Máy Vector hỗ trợ tìm hiểu. NLTK có một trình bao bọc đẹp 'nltk.classify.scikitlearn.SklearnClassifier' làm cho các trình phân loại này phù hợp với API của nó. –

+0

@KenBloom Vâng, SVM có lẽ sẽ tốt hơn, nhưng anh ấy đã hỏi cụ thể về Bayes ngây thơ.:) Đó là wrapper là tốt đẹp, và tôi chỉ nhận ra rằng đó cũng là một vịnh ngây thơ đa thức trong scikit-học, vì vậy tôi sẽ thay đổi câu trả lời của tôi để sử dụng đó. – Dougal

+1

trông rất đơn giản. Tôi ước tôi đã học được python khi tôi đang làm bằng tiến sĩ của tôi trong này. Tôi đã làm rất nhiều công việc phân loại gói trong Ruby mà có thể hoàn toàn không cần thiết. –

6

Các tính năng trong bộ phân loại vịnh NLTK là "danh nghĩa", không phải là số. Điều này có nghĩa là chúng có thể lấy một số hữu hạn các giá trị rời rạc (nhãn), nhưng chúng không thể được coi là tần số.

Vì vậy, với các phân loại Bayes, bạn có thể không trực tiếp sử dụng từ tần số như một feature-- bạn có thể làm một cái gì đó giống như sử dụng 50 từ thường xuyên hơn từ mỗi văn bản như tính năng thiết lập của bạn, nhưng đó là một điều hoàn toàn khác

Nhưng có thể có các bộ phân loại khác trong NLTK phụ thuộc vào tần số. Tôi sẽ không biết, nhưng bạn đã nhìn? Tôi muốn nói nó đáng để kiểm tra.

3
  • đặt chuỗi bạn đang nhìn vào một danh sách, chia thành lời
  • cho mỗi mục trong danh sách, đặt câu hỏi: là mặt hàng này một tính năng tôi có trong danh sách tính năng của tôi.
  • Nếu có, hãy thêm bản ghi nhật ký như bình thường, nếu không, hãy bỏ qua nó.

Nếu câu của bạn có cùng một từ nhiều lần, câu này sẽ chỉ thêm các số nhiều lần. Nếu từ xuất hiện nhiều lần trong cùng một lớp, dữ liệu đào tạo của bạn phải phản ánh điều đó trong số từ.

Để tăng độ chính xác, hãy đếm tất cả bi-gam, tri-gram, v.v ... làm các tính năng riêng biệt.

Nó giúp tự viết phân loại của riêng bạn để bạn hiểu chính xác những gì đang xảy ra và những gì bạn cần làm để xác định độ chính xác. Nếu bạn sử dụng một giải pháp đóng gói sẵn và nó không hoạt động đủ tốt, không có nhiều bạn có thể làm gì về nó.

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