Phát triển Trình phân loại văn bản Naive Bayes trong JAVA PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Phát triển trình phân loại văn bản Naive Bayes trong JAVA

Trong các bài viết trước, chúng tôi đã thảo luận về nền tảng lý thuyết của Phân loại văn bản Naive Bayes và tầm quan trọng của việc sử dụng Kỹ thuật chọn tính năng trong phân loại văn bản. Trong bài viết này, chúng tôi sẽ kết hợp mọi thứ lại với nhau và xây dựng một triển khai đơn giản thuật toán phân loại văn bản Naive Bayes trong JAVA. Mã của trình phân loại là nguồn mở (theo giấy phép GPL v3) và bạn có thể tải xuống từ Github.

Cập nhật: Khung học máy của Datumbox hiện là nguồn mở và miễn phí tải về. Kiểm tra gói com.datumbox.framework.machinelearning. Classifying để xem việc triển khai Naive Bayes Classifier trong Java.

Thực hiện Java Naive Bayes

Mã được viết bằng JAVA và có thể được tải xuống trực tiếp từ Github. Nó được cấp phép theo GPLv3, vì vậy hãy thoải mái sử dụng, sửa đổi và phân phối lại một cách tự do.

Trình phân loại văn bản thực hiện Vịnh Naive đa cực mô hình cùng với Lựa chọn tính năng Chisapes thuật toán. Tất cả các chi tiết lý thuyết về cách thức hoạt động của cả hai kỹ thuật được trình bày trong các bài viết trước và các bình luận javadoc chi tiết có thể được tìm thấy trên mã nguồn mô tả việc thực hiện. Vì vậy, trong phần này tôi sẽ tập trung vào một mô tả cấp cao về kiến ​​trúc của trình phân loại.

1. Lớp NaiveBayes

Đây là phần chính của Trình phân loại văn bản. Nó thực hiện các phương thức như train () và dự đoán () chịu trách nhiệm đào tạo trình phân loại và sử dụng nó để dự đoán. Cần lưu ý rằng lớp này cũng chịu trách nhiệm gọi các phương thức bên ngoài thích hợp để tiền xử lý và mã hóa tài liệu trước khi đào tạo / dự đoán.

2. Đối tượng NaiveBayesKnowledgeBase

Đầu ra của đào tạo là Đối tượng NaiveBayesKnowledgeBase lưu trữ tất cả các thông tin cần thiết và xác suất được sử dụng bởi Trình phân loại Naive Bayes.

3. Đối tượng tài liệu

Cả các văn bản đào tạo và dự đoán trong triển khai đều được lưu trữ bên trong dưới dạng Đối tượng Tài liệu. Đối tượng Tài liệu lưu trữ tất cả các mã thông báo (từ) của tài liệu, số liệu thống kê của chúng và phân loại mục tiêu của tài liệu.

4. Đối tượng FeatureStats

Đối tượng FeatureStats lưu trữ một số thống kê được tạo trong giai đoạn Trích xuất tính năng. Số liệu thống kê này là số lượng Tính năng và Lớp chung (từ đó xác suất và khả năng chung được ước tính), số lượng Lớp (từ đó các linh mục được đánh giá nếu không được đưa ra làm đầu vào) và tổng số quan sát được sử dụng cho đào tạo.

5. Lớp ngoại lệ Feature

Đây là lớp chịu trách nhiệm thực hiện trích xuất tính năng. Cần lưu ý rằng vì lớp này tính toán bên trong một số thống kê thực sự được yêu cầu bởi thuật toán phân loại trong giai đoạn sau, tất cả các thống kê này được lưu trữ và trả về trong ObjectStats Object để tránh tính toán lại.

6. Lớp TextTokenizer

Đây là một đơn giản lớp mã thông báo văn bản, chịu trách nhiệm tiền xử lý, xóa và mã hóa các văn bản gốc và chuyển đổi chúng thành các đối tượng Tài liệu.

Sử dụng lớp JAVA NaiveBayes

Trong lớp NaiveBayesExample, bạn có thể tìm thấy các ví dụ về việc sử dụng Lớp NaiveBayes. Mục tiêu của mã mẫu là đưa ra một ví dụ huấn luyện Trình phân loại Naive Bayes đơn giản để phát hiện Ngôn ngữ của văn bản. Để huấn luyện trình phân loại, ban đầu chúng tôi cung cấp các đường dẫn của bộ dữ liệu huấn luyện trong HashMap và sau đó chúng tôi tải nội dung của chúng.

   //map of dataset files
   Map<String, URL> trainingFiles = new HashMap<>();
   trainingFiles.put("English", NaiveBayesExample.class.getResource("/datasets/training.language.en.txt"));
   trainingFiles.put("French", NaiveBayesExample.class.getResource("/datasets/training.language.fr.txt"));
   trainingFiles.put("German", NaiveBayesExample.class.getResource("/datasets/training.language.de.txt"));

   //loading examples in memory
   Map<String, String[]> trainingExamples = new HashMap<>();
   for(Map.Entry<String, URL> entry : trainingFiles.entrySet()) {
      trainingExamples.put(entry.getKey(), readLines(entry.getValue()));
   }

Trình phân loại NaiveBayes được đào tạo bằng cách truyền cho nó dữ liệu. Sau khi đào tạo hoàn thành, đối tượng NaiveBayesKnowledgeBase được lưu trữ để sử dụng sau.

   //train classifier
   NaiveBayes nb = new NaiveBayes();
   nb.setChisquareCriticalValue(6.63); //0.01 pvalue
   nb.train(trainingExamples);
      
   //get trained classifier
   NaiveBayesKnowledgeBase knowledgeBase = nb.getKnowledgeBase();

Cuối cùng, để sử dụng trình phân loại và dự đoán các lớp của các ví dụ mới, tất cả những gì bạn cần làm là khởi tạo một trình phân loại mới bằng cách chuyển đối tượng NaiveBayesKnowledgeBase mà bạn có được trước đó bằng cách đào tạo. Sau đó, bằng cách gọi đơn giản là phương thức dự đoán () bạn sẽ có được lớp dự đoán của tài liệu.

   //Test classifier
   nb = new NaiveBayes(knowledgeBase);
   String exampleEn = "I am English";
   String outputEn = nb.predict(exampleEn);
   System.out.format("The sentense "%s" was classified as "%s".%n", exampleEn, outputEn);   

Mở rộng cần thiết

Việc triển khai JAVA cụ thể không nên được coi là một giải pháp hoàn chỉnh sẵn sàng để sử dụng cho các vấn đề phân loại văn bản tinh vi. Dưới đây là một số mở rộng quan trọng có thể được thực hiện:

1. Trích xuất từ ​​khóa:

Mặc dù sử dụng các từ khóa đơn lẻ có thể đủ cho các vấn đề đơn giản như Phát hiện ngôn ngữ, các vấn đề phức tạp khác đòi hỏi phải trích xuất n-gram. Do đó, người ta có thể thực hiện thuật toán trích xuất văn bản tinh vi hơn bằng cách cập nhật phương thức TextTokenizer.extractKeywords () hoặc sử dụng Datumbox API khai thác từ khóa chức năng để có được tất cả n-gram (kết hợp từ khóa) của tài liệu.

2. Tiền xử lý văn bản:

Trước khi sử dụng trình phân loại thường cần phải xử lý trước tài liệu để xóa các ký tự / phần không cần thiết. Mặc dù việc triển khai hiện tại thực hiện quá trình tiền xử lý hạn chế bằng cách sử dụng phương thức TextTokenizer.pre process (), khi phân tích các trang HTML, mọi thứ trở nên phức tạp hơn. Người ta có thể chỉ cần cắt bớt các thẻ HTML và chỉ giữ lại văn bản đơn giản của tài liệu hoặc sử dụng các kỹ thuật Machine Learning tinh vi hơn để phát hiện văn bản chính của trang và xóa nội dung thuộc về chân trang, tiêu đề, menu, v.v. có thể sử dụng Datumbox API trích xuất văn bản chức năng.

3. Các mô hình Naive Bayes bổ sung:

Trình phân loại hiện tại triển khai trình phân loại Naive Bayes Multinomial, tuy nhiên như chúng ta đã thảo luận trong một bài viết trước về Phân tích tình cảm, các vấn đề phân loại khác nhau đòi hỏi các mô hình khác nhau. Trong một số phiên bản Binarized của thuật toán sẽ phù hợp hơn, trong khi ở một số khác, Mô hình Bernoulli sẽ cung cấp kết quả tốt hơn nhiều. Sử dụng triển khai này làm điểm bắt đầu và làm theo hướng dẫn của Hướng dẫn Naive Bayes để mở rộng mô hình.

4. Phương pháp lựa chọn tính năng bổ sung:

Việc triển khai này sử dụng thuật toán lựa chọn tính năng Chisapes để chọn các tính năng phù hợp nhất để phân loại. Như chúng ta đã thấy trong một bài viết trước, Lựa chọn tính năng Chisapes phương pháp là một kỹ thuật tốt dựa trên các số liệu thống kê để chọn các tính năng phù hợp, tuy nhiên nó có xu hướng cho điểm cao hơn trên các tính năng hiếm chỉ xuất hiện trong một trong các loại. Các cải tiến có thể được thực hiện để loại bỏ các tính năng gây nhiễu / hiếm trước khi tiến hành lựa chọn tính năng hoặc bằng cách thực hiện các phương pháp bổ sung như Thông tin lẫn nhau mà chúng ta đã thảo luận trên bài viết nói trên.

5. Tối ưu hóa hiệu suất:

Trong triển khai cụ thể, điều quan trọng là phải cải thiện khả năng đọc mã hơn là thực hiện tối ưu hóa vi mô trên mã. Mặc dù thực tế là việc tối ưu hóa như vậy làm cho mã xấu hơn và khó đọc / duy trì hơn, chúng thường rất cần thiết vì nhiều vòng lặp trong thuật toán này được thực thi hàng triệu lần trong quá trình đào tạo và kiểm tra. Việc triển khai này có thể là điểm khởi đầu tuyệt vời để phát triển phiên bản điều chỉnh của riêng bạn.

Hầu như có ghi chú cuối cùng!

Tôi-nghe-ngần ngại-giỏi-mã hóa-lĐể hiểu rõ về cách thức thực hiện này, bạn nên đọc hai bài viết trước về Phân loại Naive BayesLựa chọn tính năng. Bạn sẽ có được cái nhìn sâu sắc về nền tảng lý thuyết của các phương thức và nó sẽ làm cho các phần của thuật toán / mã rõ ràng hơn.

Chúng ta nên lưu ý rằng Naive Bayes mặc dù là một cách dễ dàng, nhanh chóng và hầu hết thời gian, khá chính xác, đó cũng là Nai Naive vì nó đưa ra giả định về tính độc lập có điều kiện của các tính năng. Vì giả định này gần như không bao giờ gặp trong các vấn đề Phân loại văn bản, Naive Bayes gần như không bao giờ là phân loại hoạt động tốt nhất. Trong API hộp dữ liệu, một số bản mở rộng của trình phân loại Naive Bayes tiêu chuẩn chỉ được sử dụng cho các vấn đề đơn giản như Phát hiện ngôn ngữ. Đối với các vấn đề phân loại văn bản phức tạp hơn, các kỹ thuật nâng cao hơn như Phân loại Entropy tối đa là cần thiết.

Nếu bạn sử dụng thực hiện trong một dự án thú vị thả chúng tôi một dòng và chúng tôi sẽ giới thiệu dự án của bạn trên blog của chúng tôi. Ngoài ra nếu bạn thích bài viết xin vui lòng dành chút thời gian và chia sẻ nó trên Twitter hoặc Facebook. 🙂

Dấu thời gian:

Thêm từ Hộp dữ liệu