2017-05-25 1 views
4

私は、Pythonでのテキスト分類のために、多項式Naive Bayes Classifierをゼロから実装しています。テキスト分類でNaive Bayesを使用して希望するクラスを予測する方法

フィーチャの各クラスと確率分布のフィーチャ数を計算します。

は私の実装によると、私は次のような結果が得られます。両方のクラスの事前確率は0.5

になります。このコーパスのためにナイーブベイズによると

corpus = [ 
      {'text': 'what is chat service?', 'category': 'what_is_chat_service'}, 
      {'text': 'Why should I use your chat service?', 'category': 'why_use_chat_service'} 
     ] 

は、私は、次のコーパスがあるとし

小文字に変換、ストップワードの削除と句読点の削除を含むいくつかの前処理を行うと、次のトークンリストが得られます。

  • テキスト1:[サービス、チャット]
  • テキスト2:私は、テキストのためのクラスを予測したい場合は、[使用、チャット、サービス]

今すぐ 前処理した後、「何がチャットサービスです」 Naive Bayes Ruleによれば、以下の確率が得られる。

class      chat  service P(class|features) 

what_is_chat_service  1  1   0.5 
why_use_chat_service  1  1   0.5 

私は2つのクラスに対して等しい確率を得る。私はこの状況の改善のために勉強してきました。

可能な方法は、ストップワードを含めることです。我々はストップワードが含まれている場合は、私たち取得するには、次の機能確率:機能のデフォルト確率を仮定し

class     what  is chat  service P(class|features) 

what_is_chat_service 1   1  1  1   0.5(higher) 
why_use_chat_service 1e-9  1e-9 1  1   5e-19 

= 1E-9

すなわちその機能は、その内のクラス

に属していませんクラス1の確率が高くなるケース:what_is_chat_service

ストップワードを含めると、まだ等しい確率 コーパスは次のようになります。

corpus = [ 
      {'text': 'what is chat service?', 'category': 'what_is_chat_service'}, 
      {'text': 'what is the benefit of using chat service?', 'category': 'why_use_chat_service'} 
     ] 

この場合、すべての機能確率は両方のクラスで1になります。

また、「チャットサービスとは何か?」というテキストを予測する確率は、等しくなります。

しかし、私はwhat_is_chat_serviceクラスを予測する必要があります。

希望のクラスを予測するにはどうすればよいですか?私はsklearnからNaive Bayes Classifierを試しました。希望の結果を得られなかった。

私の質問が冗長であるか不明な場合、または詳細情報が必要な場合はお知らせください。

ありがとうございます。

答えて

1

Naive Bayesは語順を考慮していません。したがって、文書の主題(通常は文章だけでなく、完全な文書:多数の段落、例えばニュース記事のようなもの)を分類することは良いことです。

あなたの例では、トピックは実際には「チャットサービス」(または「ウェブサービス」または「カスタマーサービス」)です。

しかし、「なぜ、チャットサービス」対簡単なぜとはほとんど構文が何であるかとの差が、テキスト分類によって分離することができる何かが本当にされていない「チャットサービスが何でありますか」。たとえば、以下の文章は:

チャットサービスが何であるかを
  1. チャットサービスが何のためにあるのか
  2. (あなたがカテゴリをしたい)
(あなたはなぜカテゴリをしたいです)

文の正確な構文解析のみが役に立ちます(この作業は非常に難しいです)。ほぼすべてのテキスト分類子によって使用されるbag-of-words(またはベクトル空間モデル)を使用するアプローチは、このタスクで失敗する可能性があります。

私の答えがあまり役に立たないことは分かっていますが、それはそれです。 Naive Bayesクラシファイアを使用しているときに、より良い分類をしたい場合は、機能(単語のシーケンス)にnグラムを追加してみてください。それは、(時には必ずしもそうではない)いくつかの構文的情報を捕捉するだろう。

+0

@Pascalありがとうございます。私は機能カウントから生成されたNaive Bayesのバイアス問題の解決策が必要です。フィーチャがクラス1で頻度が高い場合、このフィーチャを含むサンプルはその事前分類に関係なくそのクラスに分類されます。 –

+0

"事前分類"とは何ですか? –

+0

トレーニングデータの各テキストにはクラスが割り当てられています。私の例では、 'what_is_chat_service'は最初のテキストに割り当てられ、 'why_use_chat_service'は2番目のテキストに割り当てられます。 –

関連する問題