Nếu bạn không gặp sự cố khi sử dụng thư viện bên ngoài, tôi khuyên bạn nên dùng scikit-learning vì nó có thể làm việc này tốt hơn và nhanh hơn bất cứ thứ gì bạn có thể tự viết mã. Tôi chỉ muốn làm một cái gì đó như thế này:
Xây dựng kho dữ liệu của bạn. Tôi đã tìm hiểu danh sách để rõ ràng hơn, nhưng tùy thuộc vào cách dữ liệu của bạn được lưu trữ, bạn có thể cần thực hiện những việc khác nhau:
def corpus_builder(apple_inc_tweets, apple_fruit_tweets):
corpus = [tweet for tweet in apple_inc_tweets] + [tweet for tweet in apple_fruit_tweets]
labels = [1 for x in xrange(len(apple_inc_tweets))] + [0 for x in xrange(len(apple_fruit_tweets))]
return (corpus, labels)
Điều quan trọng là bạn sẽ có hai danh sách giống như sau:
([['apple inc tweet i love ios and iphones'], ['apple iphones are great'], ['apple fruit tweet i love pie'], ['apple pie is great']], [1, 1, 0, 0])
[1, 1, 0, 0] đại diện cho các nhãn âm và dương.
Sau đó, bạn tạo một Đường ống! Pipeline là một lớp học scikit giúp dễ dàng xâu chuỗi các bước xử lý văn bản lại với nhau, do đó bạn chỉ phải gọi một đối tượng khi đào tạo / dự đoán:
def train(corpus, labels)
pipe = Pipeline([('vect', CountVectorizer(ngram_range=(1, 3), stop_words='english')),
('tfidf', TfidfTransformer(norm='l2')),
('clf', LinearSVC()),])
pipe.fit_transform(corpus, labels)
return pipe
Bên trong Pipeline có ba bước xử lý. CountVectorizer mã hóa các từ, chia nhỏ, đếm và chuyển dữ liệu thành một ma trận thưa thớt. TfidfTransformer là tùy chọn và bạn có thể muốn xóa nó tùy thuộc vào xếp hạng độ chính xác (thực hiện các bài kiểm tra xác thực chéo và tìm kiếm lưới cho các thông số tốt nhất có một chút liên quan, vì vậy tôi sẽ không giải thích ở đây). LinearSVC là một thuật toán phân loại văn bản tiêu chuẩn.
Cuối cùng, bạn dự đoán loại tweet:
def predict(pipe, tweet):
prediction = pipe.predict([tweet])
return prediction
Một lần nữa, tweet cần phải nằm trong danh sách, vì vậy tôi giả định rằng nó đang nhập hàm dưới dạng chuỗi.
Đặt tất cả những thứ đó vào một lớp hoặc bất cứ thứ gì, và bạn đã hoàn thành. Ít nhất, với ví dụ rất cơ bản này.
Tôi đã không kiểm tra mã này nên nó có thể không hoạt động nếu bạn chỉ sao chép-dán, nhưng nếu bạn muốn sử dụng scikit-learning, nó sẽ cung cấp cho bạn ý tưởng về nơi bắt đầu.
EDIT: đã cố gắng giải thích các bước chi tiết hơn.