JAVA PlatoBlockchain Data Intelligence での単純ベイズ テキスト分類器の開発。垂直検索。あい。

JAVAでの単純ベイズテキスト分類子の開発

以前の記事では、の理論的背景について説明しました 単純ベイズテキスト分類子 および使用の重要性 特徴選択手法 テキスト分類。 この記事では、すべてを組み合わせて、JAVAのNaive Bayesテキスト分類アルゴリズムの単純な実装を構築します。 分類子のコードは(GPL v3ライセンスの下で)オープンソースであり、以下からダウンロードできます。 githubの.

更新:Datumbox Machine Learning Frameworkがオープンソースになり、無料で ダウンロード。 パッケージcom.datumbox.framework.machinelearning.classificationをチェックして、Javaでの単純ベイズ分類子の実装を確認してください。

Naive Bayes Java実装

コードはJAVAで書かれており、以下から直接ダウンロードできます。 githubの。 GPLv3の下でライセンスされているので、自由に使用、変更、自由に再配布してください。

テキスト分類子は、 多項式ナイーブベイズ と一緒にモデル Chisquare機能の選択 アルゴリズム。 両方の手法がどのように機能するかについての理論的な詳細はすべて、以前の記事で説明されており、詳細なjavadocコメントは、実装を説明するソースコードにあります。 したがって、このセグメントでは、分類子のアーキテクチャの高レベルの説明に焦点を当てます。

1. NaiveBayesクラス

これは、テキスト分類子の主要部分です。 分類子のトレーニングと予測に使用するtrain()やpredict()などのメソッドを実装します。 このクラスは、適切な外部メソッドを呼び出して、トレーニング/予測の前にドキュメントを前処理してトークン化することにも注意する必要があります。

2. NaiveBayesKnowledgeBaseオブジェクト

トレーニングの出力はNaiveBayesKnowledgeBaseオブジェクトであり、Naive Bayes Classifierで使用される必要なすべての情報と確率を格納します。

3.ドキュメントオブジェクト

実装のトレーニングテキストと予測テキストはどちらも内部的にドキュメントオブジェクトとして保存されます。 ドキュメントオブジェクトは、ドキュメントのすべてのトークン(単語)、それらの統計、およびドキュメントのターゲット分類を格納します。

4. FeatureStatsオブジェクト

FeatureStatsオブジェクトは、特徴抽出フェーズ中に生成されるいくつかの統計を格納します。 このような統計は、特徴とクラスの結合数(そこから結合確率と可能性が推定されます)、クラス数(入力として何も与えられていない場合は事前値が評価されます)、およびトレーニングに使用された観測の総数です。

5. FeatureExtractionクラス

これは、特徴抽出の実行を担当するクラスです。 このクラスは、後の段階で分類アルゴリズムによって実際に必要とされるいくつかの統計を内部的に計算するため、これらの統計はすべて再計算を回避するために、FeatureStatsオブジェクトにキャッシュされて返されることに注意してください。

6. TextTokenizerクラス

これは シンプルな テキストのトークン化クラス。元のテキストの前処理、クリア、トークン化、およびそれらをDocumentオブジェクトに変換します。

NaiveBayes JAVAクラスの使用

NaiveBayesExampleクラスには、NaiveBayesクラスの使用例があります。 サンプルコードの目的は、テキストの言語を検出するために単純な単純ベイズ分類器をトレーニングする例を示すことです。 分類子をトレーニングするには、最初にHashMapにトレーニングデータセットのパスを指定し、次にそのコンテンツをロードします。

   //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()));
   }

NaiveBayes分類器は、データを渡すことによってトレーニングされます。 トレーニングが完了すると、後で使用するためにNaiveBayesKnowledgeBaseオブジェクトが保存されます。

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

最後に、分類子を使用して新しい例のクラスを予測するには、トレーニングで以前に取得したNaiveBayesKnowledgeBaseオブジェクトを渡して新しい分類子を初期化するだけです。 次に、単純にpredict()メソッドを呼び出すことで、ドキュメントの予測クラスを取得します。

   //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);   

必要な拡張

特定のJAVA実装は、高度なテキスト分類問題の完全にすぐに使用できるソリューションと見なすべきではありません。 以下は、実行できる重要な拡張の一部です。

1.キーワード抽出:

言語検出などの単純な問題には単一のキーワードを使用するだけで十分ですが、他のより複雑な問題では、n-gramの抽出が必要です。 したがって、TextTokenizer.extractKeywords()メソッドを更新してより高度なテキスト抽出アルゴリズムを実装するか、Datumboxの キーワード抽出API ドキュメントのすべてのN-gram(キーワードの組み合わせ)を取得する関数。

2.テキストの前処理:

通常、分類子を使用する前に、不要な文字/部分を削除するためにドキュメントを前処理する必要があります。 現在の実装では、TextTokenizer.preprocess()メソッドを使用して限られた前処理を実行しますが、HTMLページの分析に関しては、さらに複雑になります。 HTMLタグを削除して、ドキュメントのプレーンテキストのみを保持するか、ページのメインテキストを検出し、フッター、ヘッダー、メニューなどに属するコンテンツを削除する、より洗練された機械学習手法に頼ることができます。 Datumboxの テキスト抽出API 機能。

3.追加の単純ベイズモデル:

現在の分類器は、Multinomial Naive Bayes分類器を実装していますが、以前の記事で説明したとおりです。 感情分析、異なる分類問題には異なるモデルが必要です。 アルゴリズムのXNUMX値化バージョンがより適切な場合もあれば、ベルヌーイモデルがはるかに優れた結果を提供する場合もあります。 この実装を開始点として使用し、の指示に従ってください Naive Bayesチュートリアル モデルを拡張します。

4.追加の機能選択方法:

この実装では、Chisquare特徴選択アルゴリズムを使用して、分類に最も適切な特徴を選択します。 前の記事で見たように、 Chisquare機能の選択 メソッドは、適切な機能を選択するために統計を中継する優れた手法ですが、いずれかのカテゴリにのみ表示されるまれな機能のスコアが高くなる傾向があります。 機能の選択に進む前に、または前述の記事で説明した相互情報などの追加の方法を実装することにより、ノイズの多い/まれな機能を削除して改善を行うことができます。

5.パフォーマンスの最適化:

特定の実装では、コードに対してマイクロ最適化を実行するのではなく、コードを読みやすくすることが重要でした。 このような最適化によりコードが見にくくなり、読みにくくなり、保守が困難になりますが、このアルゴリズムの多くのループがトレーニングやテスト中に数百万回実行されるため、これらの最適化が必要になることがよくあります。 この実装は、独自の調整済みバージョンを開発するための優れた出発点となります。

もう少しで…最終メモ!

私は聞いた-hes-good-at-coding-lこの実装がどのように機能するかを十分に理解するには、前のXNUMXつの記事を読むことを強くお勧めします。 単純ベイズ分類器 および 機能の選択。 メソッドの理論的背景に関する洞察が得られ、アルゴリズム/コードの一部がより明確になります。

Naive Bayesは、簡単、高速、ほとんどの場合「非常に正確」であるにもかかわらず、機能の条件付き独立性を前提としているため、「Naive」でもあることに注意してください。 この仮定がテキスト分類の問題で満たされることはほとんどないため、単純ベイズが最高のパフォーマンスの分類器になることはほとんどありません。 に データムボックス API、標準の単純ベイズ分類器の一部の拡張は、言語検出などの単純な問題にのみ使用されます。 より複雑なテキスト分類問題については、 最大エントロピー分類器 が必要です。

興味深いプロジェクトで実装を使用する場合 私たちのラインドロップ あなたのプロジェクトをブログで特集します。 また、この記事が気に入ったら、少し時間を取ってTwitterまたはFacebookで共有してください。 🙂

タイムスタンプ:

より多くの データムボックス