Python + 機械学習手法を使用した感情分析 (詳細な手順)

Python + 機械学習手法を使用した感情分析 (詳細な手順)

辞書マッチングの方法はないのでしょうか?なぜ複数の機械学習方法が必要なのでしょうか?

辞書方式と機械学習方式にはそれぞれ利点があるからです。

辞書マッチングでは意味表現の豊富さにより大きな誤差が生じる可能性があるのに対し、機械学習手法では誤差が生じないため、機械学習手法の方が正確です。さらに多様なシナリオで使用できます。主観的または客観的な分類、肯定的または否定的な感情の分類など、機械学習はタスクを完了できます。辞書マッチングのように、単語、文章、文法のレベルまで深く調べる必要はありません。

辞書方式は、携帯電話やコンピュータなどの商品から、書評や映画評などのコーパスまで、より広範囲のコーパスに適用できます。しかし、機械学習はコーパスに大きく依存しています。携帯電話のコーパスでトレーニングされた分類器を使用して書評を分類すると、失敗する運命にあります。

感情分析に機械学習を使用することは、同様の方法で表現できます。つまり、教師あり(手動でラベル付けされたカテゴリ)機械学習手法を使用してテキストを分類します。

これは辞書マッチングとは根本的に異なります。辞書マッチングは、テキスト内の感情語を直接計算し、その感情傾向スコアを取得します。機械学習法の考え方は、まずポジティブな感情を表現するテキストの部分とネガティブな感情を表現するテキストの部分を選択し、次に機械学習法を使用してトレーニングして感情分類器を取得するというものです。この感情分類器は、すべてのテキストを肯定的カテゴリと否定的カテゴリに分類するために使用されます。最終的な分類では、テキストに 0 や 1 などのカテゴリ、または「このテキストが肯定的である確率は 90%、否定的である確率は 10%」などの確率値を与えることができます。

Python には感情分類に適したパッケージがあります。これは、Python 自然言語処理パッケージ、Natural Language Toolkit、略して NLTK です。

もちろん、NLTK は感情分析を処理するだけではありません。NLTK には、単語の分割からエンティティの認識、感情の分類から構文分析まで、自然言語処理ツールの完全なセットがあります。完全で、機能が豊富で、強力です。それはまさに、国内旅行、密輸、殺人に欠かせない薬です。

非常に役立つ 2 冊の NLTK 参考書。 1 冊目は「Python Natural Language Processing」で、「Natural Language Processing with Python」の中国語訳です。これはボランティアによって翻訳されたもので、出版社から出版されたものではありません。オープンソースの精神は永遠です! もう 1 冊目は「Python Text Processing with NLTK 2.0 Cookbook」です。この本はわかりやすく書かれており、英語ですが、とても読みやすいです。この本の著者である Jacob が NLTK パッケージの主要な貢献者の 1 人であることは特に言及する価値があります。また、彼のブログには機械学習を使った感情分類に関する一連の記事があります。私のコードは完全に彼のものに基づいています。ここに感謝の意を表したいと思います。

実際、海外の著者の中には、彼に触発されて感情分類の処理に Python を使用する人もいました。例えば、この記事は非常に詳しく書かれており、私が参考にしている記事でもあります。また、彼のコードも一部拝借させていただきました。

また、Jacob 氏は記事の中で、NLTK に新しく追加された scikit-learn インターフェースにより、分類機能がより強力で使いやすくなり、多くのハイエンドかつクールな分類アルゴリズムを使用できるようになったと述べています。そこで私は scikit-learn に目を向けました。これは私にとって天の恵みです。母は私が機械学習を使えないことを心配する必要がなくなりました。

scikit-learn インターフェースにより、NLTK 分類が従来よりも簡単かつ高速になりました。しかし、NLTK と sciki-learn を組み合わせた記事は非常に少なく、両者の組み合わせを詳しく説明しているのはこの記事だけです。ここに感謝の意を表したいと思います。

しかし、中国語と英語には一定の違いがあり、上記のブログのいくつかのコードも修正する必要があるため、私にとってはまだ十分ではありません。ようやくコードの一部が完成し、実際に機能する中国語の感情分類コードを書くことができました。次に、その実装アイデアと具体的なコードを紹介します。

このシリーズの記事では、機械学習は教師あり分類法として考えることができます。

全体的なプロセスは次のとおりです。


図 1: 機械学習のプロセスと構造 (「Python による自然言語処理」より)

1. 教師ありとは、手動での注釈付けが必要であり、テキストにクラス ラベルを手動で付ける必要があることを意味します。

たとえば、製品レビューが 5,000 件ある場合、これらのレビューを肯定的なカテゴリと否定的なカテゴリに分類したいとします。次に、まずその中から 2,000 件のコメントを選択し、次にこれらの 2,000 のデータ ポイントに手動でラベルを付けて、これらの 2,000 件のコメントを「肯定的」または「否定的」としてマークします。これらの「正」と「負」はクラス ラベルです。

「肯定的」とマークされたレビューが 1,000 件、「否定的」とマークされたレビューが 1,000 件あるとします。 (同じ数は分類器のトレーニングに役立ちます。実際に数が異なる場合は、データを減らしたり増やしたりして同じ数にする必要があります)

2. 次に機能を選択する必要があります。

特徴は分類オブジェクトが示す特性の一部であり、分類の基礎となります。私たちはよく分類を行いますが、その分類は何に基づいて行うのでしょうか?

たとえば、新しいスーツを着て、真新しいブリーフケースを持ち、きびきびと歩いている若い男性を見たら、私は彼が新入社員だと思うでしょう。このうち、「新品」、「フォーマルなスーツ」、「ブリーフケース」、「速い歩行」は、いずれもこの人物が示す特徴であり、この人物がどのカテゴリーに属するかを判断するための基準でもあります。これらの特性と基盤が特徴となります。いくつかの特徴は私にとって判断を下す上で役立つかもしれませんが、いくつかはあまり役に立たないかもしれませんし、間違った判断につながる可能性もありますが、これらが私の分類の基礎となります。

私たちは、ある人物のすべての特徴を発見することはできないので、すべての特徴を客観的に選択することはできません。分類の基準として、主観的にいくつかの特徴を選択することしかできません。これは、特定の人間による選択を必要とする特徴選択の特性でもあります。

感情分類では、一般的に「単語」レベルから特徴が選択されます。

たとえば、「携帯電話はとても便利です!」という文には、「ポジティブ」というクラス ラベルを付けました。そこには「携帯電話」、「とても」、「使いやすい」、「!」という 4 つの単語(感嘆符を含む)があります。これら 4 つの単語はすべて分類に影響を与え、分類の基礎となっていると考えられます。つまり、これら 4 つの単語のいずれかが出現する箇所では、テキストは「肯定的」と分類できます。これは、すべての単語を分類機能として使用することです。

同様に、この文では、バイグラムを特徴として選択することもできます。例えば、「携帯電話は素晴らしい」、「とても使いやすい」、「使いやすい!」という3つの組み合わせを分類特徴として使用します。同様に、トライグラムとクアドラムもすべて特徴として使用できます。

3. 次に、特徴の次元を縮小する必要があります。

簡単に言えば、特徴次元削減とは、特徴の数を減らすことです。これには2つの意味があります。1つは、特徴の数を減らすことでアルゴリズムの計算を高速化できることです(もちろん数が少ないほど計算は速くなります)。もう1つは、特定の方法を使用して情報が豊富な特徴を選択すれば、ノイズが削減され、分類精度が効果的に向上する可能性があるということです。

いわゆる豊富な情報コンテンツは、上記の例「携帯電話はとても使いやすいです!」から見ることができます。明らかに、「携帯電話」、「とても」、「使いやすい」、「!」を特徴として考慮する必要はありません。なぜなら、「使いやすい」という単語、または「とても使いやすい」という 2 つの単語の組み合わせによって、その文が「肯定的」であることがすでに決定されているからです。つまり、「使いやすい」という言葉は非常に有益であるということです。

では、特徴の数を減らすにはどのような方法があるでしょうか? 答えは、特定の統計的手法を通じて、情報が豊富な特徴を見つけることです。

統計手法には、用語頻度、文書頻度、点ごとの相互情報量、情報エントロピー、カイ二乗統計などがあります。

感情分類では、単語の頻度を使用して特徴を選択します。つまり、コーパス内で頻繁に出現する単語が選択されます。たとえば、コーパス内で最も頻繁に使用される 2000 語を特徴として選択できます。ドキュメント頻度を使用して特徴を選択するということは、コーパス内のさまざまなドキュメントで最も頻繁に出現する単語を選択することです。残りの3つについては、あまりにも高級でかっこよすぎて、まだよく理解できていないので、今は取り上げません。 。 。

しかし、意味は同じで、特定の統計的手法を通じて情報に富んだ特徴を選択することです。特徴は単語または単語の組み合わせになります。

4. コーパステキストを使用特徴表現に変換します。

分類アルゴリズムを分類に使用する前に、最初のステップとして、元のコーパス テキストをすべて特徴表現に変換します。

上記の文章を例に挙げてみましょう。「携帯電話はとても便利です!」

  • NLTK の場合、すべての単語が特徴として選択されると、形式は次のようになります: [{"mobile phone": True, "very": True, "easy to use": True, "!": True}, positive]
  • 機能として 2 つの単語を選択した場合、形式は次のようになります: [{"この電話は非常に": True, "非常に便利です": True, "使いやすい!": True}, positive]
  • 豊富な情報を持つ単語を特徴として選択すると、その形式は次のようになります。[{"使用するのがよい": True}, positive]

(NLTK では、辞書と配列という 2 つのデータ型を使用する必要があります。True は、対応する要素がフィーチャであることを意味します。なぜこのように True が使用されるのかはわかりません...とにかく、私が見た例はすべてこのようになっています...時間があるときにもう一度勉強して、別の方法で実行できないか確認します)

使用される特徴選択方法に関係なく、その形式は同じです。 [{"feature1": True, "feature2": True, "featureN": True, }, クラスラベル]

5. 特徴表現後のテキストを開発セットとテストセットに分割し、開発セットをトレーニングセットと開発およびテストセットに分割します。

機械学習による分類では、分類アルゴリズムをトレーニングするためのデータが必要であり、それによって分類器 (トレーニング データに基づく) を取得できます。

分類器を作成したら、この分類器の精度をテストする必要があります。

「Python 自然言語処理」の手法によれば、データは開発セットとテストセットに分けられます。開発セットは、最適な分類アルゴリズムと特徴の次元 (量) を継続的に調整して発見するために特別に使用され、テスト セットは常に「汚染されていない」状態に保たれる必要があります。開発セットが開発された後、テスト セットを使用して、開発セットによって決定された最適なアルゴリズムと機能次元の有効性をテストします。具体的な画像:


図 2: 開発セットとテスト セット (「Python による自然言語処理」より)

一般的に言えば、分類アルゴリズムがルールを見つけて効率的な分類器を構築できるように、トレーニング セットの数はテスト セットよりもはるかに大きくする必要があります。

前の例に戻りましょう。ラベル付けされた肯定的レビューと否定的レビューが 2,000 件あると仮定すると、開発セットは 1,600 件のランダムなレビュー、テスト セットは残りの 400 件のランダムなレビューになります。開発セットでは、トレーニング セットはランダムな 1400 項目になり、開発およびテスト セットは 200 項目になります。

6. さまざまな分類アルゴリズムを使用してトレーニング セットの分類器を構築し、開発テスト セットを使用して分類器の精度をテストします (最適なアルゴリズムを選択した後、機能の数を調整して精度をテストできます)。

この時点で、ついにあらゆる種類のハイエンドかつクールな機械学習アルゴリズムを使用できるようになります。

私たちの目標は、最適な機械学習アルゴリズムを見つけることです

Naive Bayes や Decision Tree などの NLTK 独自の機械学習手法を使用できます。さらに一歩進んで、NLTK の scikit-learn インターフェースを使用することもできます。これにより、scikit-learn 内のすべての機械学習アルゴリズムを呼び出すことができます。私は涙を抑えることができませんでした。

実際、その方法は非常に簡単です。次の 5 つの手順に従ってください。

  1. 開発セットのみを使用します。
  2. 分類アルゴリズムを使用してトレーニング セット (Training Set) をトレーニングし、分類子を取得します。
  3. 分類器を使用して開発テスト セット (Dev-Test Set) を分類し、分類結果を取得します。
  4. 分類器によって与えられた分類結果を人間がマークした正しい結果と比較して、分類器の精度を判定します。
  5. 別の分類アルゴリズムを使用して、上記の 3 つの手順を繰り返します。

すべてのアルゴリズムの分類精度をテストした後、最適な分類アルゴリズムを選択できます。

最適な分類アルゴリズムを選択した後、さまざまな特徴次元が分類精度に与える影響をテストできます。一般的に、特徴が少なすぎると分類のすべての特性を反映できず、分類の精度が低下します。また、特徴が多すぎるとノイズが発生し、分類が妨げられ、分類の精度が低下します。したがって、最良の分類効果を得るためには、特徴の数を継続的にテストする必要があります。

7. 開発セットで最適な分類アルゴリズムと特徴次元を選択し、テスト セットを使用して感情分類の精度を確認します。

最終的に最適な分類アルゴリズムと特徴次元(数値)を取得したら、テスト セットを使用できます。

最適な分類アルゴリズムを直接使用してテスト セットを分類し、分類結果を取得します。分類器の分類結果を手動注釈の正しい結果と比較して、分類器の最終的な精度を算出します。

Pythonで機械学習と感情分析を実行するには、nltkとscikit-learnという2つの主要なパッケージを使用する必要があります。

nltk は主に特徴抽出 (2 語または複数語のコロケーションには nltk の使用が必要) と特徴選択 (nltk が提供する統計的手法が必要) を担当します。

scikit-learn は主に、分類アルゴリズム、分類結果の評価、分類タスクの実行を担当します。

以下の4つの記事では、以下の手順に従って機械学習による感情分析を実装します。

  1. 特徴抽出と特徴選択(最適な特徴を選択)
  2. クラスラベルを割り当て、開発セットとテストセットを分割する
  3. 分類器を構築し、分類精度をテストし、最適な分類アルゴリズムを選択する
  4. ***分類器を保存して分類に使用し、分類結果は確率値となる

1つ目は特徴抽出と選択です

1. 特徴抽出法

1. すべての単語を特徴として捉える

  1. bag_of_words(単語):を定義します。  
  2. dict([(word, True ) for word in words])を返します

返される値は辞書型であり、感情分類を処理するための nltk の標準形式です。

2. バイグラムを特徴として使う

  1. nltk をインポートする 
  2. nltk.collocationsからBigramCollocationFinder をインポートします 
  3. nltk.metricsからBigramAssocMeasures をインポートします 
  4. 定義bigram(単語、score_fn=BigramAssocMeasures.chi_sq、n=1000):  
  5. bigram_finder = BigramCollocationFinder.from_words(words) #テキストをダブルワードコロケーション形式に変換します 
  6. bigrams = bigram_finder.nbest(score_fn, n) #カイ二乗統計法を使用して、上位1000個のbigramを選択します 
  7. bag_of_words(bigrams)を返す

カイ二乗統計を使用して有益な単語のコロケーションを選択することに加えて、相互情報量 (PMI) などの他の方法も使用できます。上位 1000 位のランキングは、手動で選択したしきい値にすぎません。その他の値は自由に選択でき、テストを通じて段階的に最適な値を見つけることができます。

3. すべての単語とバイワードをまとめて特徴としてとらえる

  1. 定義bigram_words(単語、score_fn=BigramAssocMeasures.chi_sq、n=1000):  
  2. bigram_finder = BigramCollocationFinder.from_words(単語)  
  3. バイグラム = bigram_finder.nbest(score_fn, n)  
  4. return bag_of_words(words + bigrams) #すべての単語と(有益な)bigramが特徴として使用されます

2. 特徴選択法

特徴抽出法では、分類学習のための特徴を抽出できます。しかし、一般的に言えば、特徴が多すぎると分類の精度が低下するため、最も豊富な情報を持つ特徴を「選択」し、それらの特徴を分類に使用するための特定の方法が必要になります。

機能選択は次の手順で行われます。

  1. コーパス全体の各単語の情報量を計算する
  2. 情報量に応じて降順で並べ替え、最も情報量の多い単語を選択します。
  3. これらの単語を特徴として使う

1. コーパス全体の各単語の情報量を計算する

1.1 コーパス全体の各単語の情報量を計算する

  1. nltk.probabilityからFreqDist、ConditionalFreqDist をインポートします 
  2. def create_word_scores(): posWords = pickle.load ( open ( 'D:/code/sentiment_test/pos_review.pkl' , ' r' )) ..... return word_scores #各単語とその単語に関する情報量が含まれます

1.2 コーパス全体の各単語と単語ペアの情報量を計算する

  1. def create_word_bigram_scores():  
  2. posdata = pickle.load ( open ( 'D:/code/sentiment_test/pos_review.pkl' , 'r' )) negdata = pickle.load ( open ( ' D:/code/sentiment_test/neg_review.pkl' , 'r' )) ..... word_scoresを返します

2. 情報量の降順で並び替え、最も情報量の多い単語を選択する

  1. def find_best_words(単語スコア、数値):  
  2. best_vals = sorted(word_scores.iteritems(), key =lambda (w, s): s, river= True )[:number] #情報内容の逆順に単語を並べ替えます。数値はフィーチャの寸法であり、***に達するまで連続的に調整できます。
  3. best_words = set ([ww、sbest_vals])  
  4. best_wordsを返す

次に、次のように find_best_words に値を割り当てる必要があります。

  1. word_scores_1 = 単語スコアを作成します()  
  2. word_scores_2 = create_word_bigram_scores()

3. 選択した単語を特徴として使用する(情報量の多い特徴を選択するため)

  1. def best_word_features(words): return dict([(word, True ) for word in words if word in best_words])

3. どの特徴選択方法が優れているかを検出する

分類子の構築、分類精度のテスト、最適な分類アルゴリズムの選択を参照してください。

最初のステップはデータをロードすることです。

感情分析を行うには、まずデータが必要です。

データは手動で注釈が付けられたテキストであり、その一部は肯定的であり、一部は否定的です。

テキストはセグメント化され、ストップワードが削除された製品レビューです。形式はおおよそ次のようになります: [[word11, word12, ... word1n], [word21, word22, ... , word2n], ... , [wordn1, wordn2, ... , wordnn]]

これは多次元配列です。各次元はコメントであり、各コメントはコメントの単語の分割で構成されます。

  1. #!/usr/bin/env python2.7  
  2. #コーディング=utf-8  
  3. pos_review = pickle.load ( open ( 'D:/code/sentiment_test/pos_review.pkl' , 'r' ))  
  4. neg_review = pickle.load ( open ( 'D:/code/sentiment_test/neg_review.pkl' , ' r' ))

対応するデータは pickle を使用して保存したので、ここで読み込むだけです。

2 番目のステップは、肯定的なテキストの数を否定的なテキストの数と同じにすることです。

  1. ランダムインポートシャッフルから 
  2. shuffle(pos_review) #肯定的なテキストの順序をランダムにする 
  3. サイズ= int (len(pos_review)/2 - 18)  
  4. pos = pos_review[:サイズ]  
  5. neg = neg_review

ここでの肯定的なテキストの数は否定的なテキストのちょうど 2 倍で、さらに 18 個多いので、両者の数のバランスをとるためにこれを行いました。

3 番目のステップは、クラス ラベルを割り当てることです。

  1. 特徴抽出メソッドを定義します:  
  2. posFeatures = []  
  3. ....  
  4. negFeatures.append(negWords)  
  5. negFeaturesを返す

これには、特徴選択方法を使用してテキストを特徴付け、クラス ラベルを割り当てる必要があります。

ステップ4: 特徴量データを開発セットとテストセットに分割する

  1. トレーニング = posFeatures[174:]+negFeatures[174:]  
  2. devtest = posFeatures[124:174]+negFeatures[124:174]  
  3. テスト = posFeatures[:124]+negFeatures[:124]

ここでは、最初の 124 個のデータがテスト セットとして使用され、中央の 50 個のデータが開発テスト セットとして使用され、残りのデータの大部分がトレーニング セットとして使用されます。

テキストを特徴表現に変換し、開発セットとテスト セットに分割した後、開発セット用の感情分類器を開発する必要があります。テストセットは今のところ残しておきます。

開発セットは、トレーニング セット (Training Set) と開発テスト セット (Dev-Test Set) に分かれています。トレーニング セットは分類器のトレーニングに使用され、開発テスト セットは分類器の精度をテストするために使用されます。

分類器の精度をテストするには、「分類器の分類結果」と「人間がラベル付けした正しい結果」の違いを比較する必要があります。

それで:

  • 最初のステップは、開発セットとテスト セットで手動で注釈を付けたラベルとデータを分離することです。
  • 2 番目のステップは、トレーニング セットを使用して分類器をトレーニングすることです。
  • 3 番目のステップでは、分類器を使用して開発テスト セット内のデータを分類し、分類予測ラベルを付与します。4 番目のステップでは、分類ラベルと手動注釈の違いを比較し、精度を計算します。

1. 手動で注釈を付けたラベルとデータを分割する

dev, tag_dev = zip(*devtest) # 開発テストセット(特性評価とラベル付け済み)をデータとタグに分割します

2~4は関数で実行できます

  1. defスコア(分類子):  
  2. classifier = SklearnClassifier(classifier) ​​#nltkでscikit-learnのインターフェースを使用する 
  3. classifier.train(train) #分類器をトレーニングする 
  4. pred = classifier.batch_classify(testSet) #開発テストセットのデータを分類し、予測ラベルを付与する 
  5. return acceleration_score(tag_test, pred) #分類予測結果と手動アノテーションの正しい結果を比較して分類器の精度を算出します

その後は、さまざまな分類器とさまざまな特徴選択の結果を簡単にテストできます。

  1. sklearn をインポートする 
  2. .....  
  3. 'NuSVC の精度は %f です' %score(NuSVC())を出力します

1. 6 つの分類アルゴリズムを選択しました。まず、すべての単語を特徴として使用した場合のパフォーマンスを確認できます。

  1. ベルヌーイNBの精度0.790000です 
  2. MultinomiaNBの精度は0.810000です 
  3. LogisticRegressionの精度は0.710000です 
  4. SVCの精度0.650000です 
  5. LinearSVCの精度は0.680000です 
  6. NuSVCの精度は0.740000です

2. 二重単語を特徴として使用した場合の効果を見てみましょう(コードを次のように変更するだけです)

  1. posFeatures = pos_features(バイグラム)  
  2. negFeatures = neg_features(バイグラム)

結果は次のとおりです。

  1. BernoulliNB の精度0.710000、MultinomiaNB の精度0.750000、LogisticRegression の精度0.790000、SVC の精度0.750000、LinearSVC の精度0.770000、NuSVC の精度0.780000です

3. すべての単語と重複単語を特徴として使用した場合の効果を見てみましょう

posFeatures = pos_features(bigram_words) negFeatures = neg_features(bigram_words)

結果は次のとおりです。

  1. ベルヌーイNBの精度0.710000です 
  2. MultinomiaNBの精度は0.750000です 
  3. LogisticRegressionの精度は0.790000です 
  4. SVCの精度0.750000です 
  5. LinearSVCの精度は0.770000です 
  6. NuSVCの精度は0.780000です

豊富な情報を持つ特徴が選択されず、すべての単語または単語の組み合わせのみが特徴として使用された場合、分類器のパフォーマンスが低下していることがわかります。

次に、カイ二乗統計を使用して有益な特徴を選択し、これらの特徴を使用して分類器をトレーニングします。

4. 豊富な情報を持つ単語を計算し、分類特徴として利用する

  1. word_scores = create_word_scores()  
  2. best_words = find_best_words(word_scores, 1500) #最も有益な1500個の特徴を選択する 
  3. posFeatures = pos_features(ベストワードフィーチャ)  
  4. negFeatures = neg_features(ベストワードフィーチャ)

結果は次のとおりです。

  1. ベルヌーイNBの精度0.870000です 
  2. MultinomiaNBの精度は0.860000です 
  3. LogisticRegressionの精度は0.730000です 
  4. SVCの精度0.770000です 
  5. LinearSVCの精度は0.720000です 
  6. NuSVCの精度は0.780000です

ベイズ分類器の分類効果が大幅に向上したことがわかります。

5. 情報語と2語連語を計算し、それを特徴量として利用する

  1. word_scores = create_word_bigram_scores()  
  2. best_words = find_best_words(word_scores, 1500) #最も有益な1500個の特徴を選択する 
  3. posFeatures = pos_features(ベストワードフィーチャ)  
  4. negFeatures = neg_features(ベストワードフィーチャ)

結果は次のとおりです。

  1. ベルヌーイNBの精度0.910000です 
  2. MultinomiaNBの精度は0.860000です 
  3. LogisticRegressionの精度は0.800000です 
  4. SVCの精度0.800000です 
  5. LinearSVCの精度は0.750000です 
  6. NuSVCの精度は0.860000です

ベルヌーイのベイズ分類器の効果は向上し続けており、NuSVC も大幅に向上していることがわかります。

この時点で、BernoulliNB、MultinomiaNB、NuSVC を候補分類器として選択し、単語とバイグラムのコロケーションを特徴抽出方法として使用し、さまざまな特徴次元の効果をテストしました。

  1. 寸法 = [ '500' '1000' '1500' '2000' '2500' '3000' ]  
  2. 次元d場合:  
  3. word_scores = create_word_scores_bigram()  
  4. best_words = find_best_words(word_scores, int (d))  
  5. posFeatures = pos_features(ベストワードフィーチャ)  
  6. negFeatures = neg_features(ベストワードフィーチャ)  
  7. トレーニング = posFeatures[174:]+negFeatures[174:]  
  8. devtest = posFeatures[124:174]+negFeatures[124:174]  
  9. テスト = posFeatures[:124]+negFeatures[:124]  
  10. dev、tag_dev = zip(*devtest)  
  11. '機能番号 %f' %dを印刷 
  12. 'BernoulliNB の精度は %f です' %score(BernoulliNB())と出力します 
  13. 'MultinomiaNB の精度は %f です' %score(MultinomialNB())を出力します 
  14. 'LogisticRegression` の精度は %f です' %score(LogisticRegression())を出力します 
  15. 'SVC の精度は %f です' %score(SVC())を出力します 
  16. 'LinearSVC の精度は %f です' %score(LinearSVC())を出力します 
  17. 'NuSVC の精度は %f です' %score(NuSVC())を出力します

結果は以下のようになります(非常に長いです…):

  1. 特集番号500  
  2. ベルヌーイNBの精度0.880000です 
  3. MultinomiaNBの精度は0.850000です 
  4. LogisticRegressionの精度は0.740000です 
  5. SVCの精度0.840000です 
  6. LinearSVCの精度は0.700000です 
  7. NuSVCの精度は0.810000です 
  8. 特集番号1000  
  9. ベルヌーイNBの精度0.860000です 
  10. MultinomiaNBの精度は0.850000です 
  11. LogisticRegressionの精度は0.750000です 
  12. SVCの精度0.800000です 
  13. LinearSVCの精度は0.720000です 
  14. NuSVCの精度は0.760000です 
  15. 特集番号1500  
  16. ベルヌーイNBの精度0.870000です 
  17. MultinomiaNBの精度は0.860000です 
  18. LogisticRegressionの精度は0.770000です 
  19. SVCの精度0.770000です 
  20. LinearSVCの精度は0.750000です 
  21. NuSVCの精度は0.790000です 
  22. 特集号2000  
  23. ベルヌーイNBの精度0.870000です 
  24. MultinomiaNBの精度は0.850000です 
  25. LogisticRegressionの精度は0.770000です 
  26. SVCの精度0.690000です 
  27. LinearSVCの精度は0.700000です 
  28. NuSVCの精度は0.800000です 
  29. 特集番号2500  
  30. ベルヌーイNBの精度0.850000です 
  31. MultinomiaNBの精度は0.830000です 
  32. LogisticRegressionの精度は0.780000です 
  33. SVCの精度0.700000です 
  34. LinearSVCの精度は0.730000です 
  35. NuSVCの精度は0.800000です 
  36. 特集番号3000  
  37. ベルヌーイNBの精度0.850000です 
  38. MultinomiaNBの精度は0.830000です 
  39. LogisticRegressionの精度は0.780000です 
  40. SVCの精度0.690000です 
  41. LinearSVCの精度は0.710000です 
  42. NuSVCの精度は0.800000です

上記のすべてのテスト結果は次のように要約できます。

異なる特徴選択方法が異なる分類器に与える影響

まとめると、特徴次元が 500 または 1500 の場合に分類器が最も効果的であることがわかります。

上記の一連の分析を経て、次のような結論を導き出すことができます。

  • ベルヌーイ単純ベイズ分類器のパフォーマンス***
  • 単語と単語の組み合わせが特徴として与える影響***
  • フィーチャの次元が1500の場合、効果は***です

各分類の前にデータを一度トレーニングすることを避けるために、開発セットを使用して最適な分類器を見つけた後、後で使用するために最適な分類器を保存することができます。この分類器はテキストを分類するために使用されます。

1. テストセットを使用して分類器の最終的な効果をテストする

  1. word_scores = create_word_bigram_scores() #単語とバイグラムのコロケーションを特徴として使用します 
  2. best_words = find_best_words(word_scores, 1500) #特徴次元 1500  
  3. posFeatures = pos_features(ベストワードフィーチャ)  
  4. negFeatures = neg_features(ベストワードフィーチャ)  
  5. trainSet = posFeatures[:500] + negFeatures[:500] # より多くのデータを使用する 
  6. テストセット = posFeatures[500:] + negFeatures[500:]  
  7. テスト、tag_test = zip(*testSet)  
  8. final_score(分類子)を定義します。  
  9. 分類子 = SklearnClassifier(分類子)  
  10. 分類器.train(trainSet)  
  11. pred = 分類器.batch_classify(テスト)  
  12. 精度スコアを返す(tag_test, pred)  
  13. print final_score(BernoulliNB()) #開発セットで得られた***分類器を使用する

結果は素晴らしいものでした:

  1. 0.979166666667

2. 分類器を保存する

(分類器の保存方法は以前と変わりませんが、分類器の精度を高めるために、より多くのトレーニング データが使用される点が異なります)

  1. word_scores = create_word_bigram_scores()  
  2. ベストワード = find_best_words(単語スコア、1500)  
  3. posFeatures = pos_features(ベストワードフィーチャ)  
  4. negFeatures = neg_features(ベストワードフィーチャ)  
  5. トレーニングセット = posFeatures + negFeatures  
  6. BernoulliNB_classifier = SklearnClassifier(BernoulliNB())  
  7. ベルヌーイNB_classifier.train(trainSet)  
  8. pickle.dump(BernoulliNB_classifier、 open ( 'D:/code/sentiment_test/classifier.pkl' 'w' ))

分類器を保存した後は、分類に使用できます。

3. 分類器を使用して分類し、確率値を与える

確率値を与えるということは、分類器を使用してコメント テキストの正の確率と負の確率を決定することを意味します。カテゴリを付与することも可能です。つまり、分類器を使用してコメント テキストが肯定的か否定的かを直接判断できますが、単にカテゴリを付与するよりも確率の方がより多くの参考情報を提供でき、将来的にコメントの有用性を判断するのに役立ちます。

1. テキストを特徴表現に変換する

テキストを分類するには、まずテキストを特徴表現に変換する必要があります。また、分類器と同じ特徴抽出方法を選択する必要があります。

  1. #!/usr/bin/env python2.7  
  2. #コーディング=utf-8  
  3. moto = pickle.load ( open ( 'D:/code/review_set/senti_review_pkl/moto_senti_seg.pkl' , 'r' )) #テキストデータを読み込む 
  4. def extract_features(データ):  
  5. 偉業 = []  
  6. データ内のiについて:  
  7. feat.append(ベストワードフィーチャー(i))  
  8. 復帰偉業 
  9. moto_features = extract_features(moto) #テキストを特徴表現に変換する

注: 読み込まれたテキスト データは、単語の分割とストップ ワードの削除によって処理されています。

2. テキストを分類し、確率値を与える

  1. 輸入ピクルス 
  2. sklearn をインポートする 
  3. clf = pickle.load ( open ( 'D:/code/sentiment_test/classifier.pkl' )) #分類器をロードする 
  4. pred = clf.batch_prob_classify(moto_features) #このメソッドは分類確率値を計算します 
  5. p_file = open ( 'D:/code/sentiment_test/score/Motorala/moto_ml_socre.txt' , 'w' ) #結果をドキュメントに書き込む 
  6. iが pred場合:  
  7. p_file.write(str(i.prob( 'pos' )) + '' + str(i.prob( 'neg' )) + '\ n'  
  8. p_file.close

***分類結果は次のとおりです。

最初の部分は正の確率であり、2番目の部分は負の確率です。

このファイルを思い付くのに時間がかかりました。 。 。この魅力的なリズムを止めることができる人はいませんか? 。 。

ただし、この結果は実際には辞書の一致よりもはるかに正確であるため、私は安心しました。 。 。

<<:  ディープラーニングの問題を無視してはいけない。ゲイリー・マーカスはそれに冷水を浴びせる義務がある

>>:  期待する! 2020年までに中国の人工知能は世界の先進レベルに達するだろう

推薦する

バイトマルチモーダル大規模モデル PixelLM: SA に頼らない効率的なピクセルレベル推論

マルチモーダルな大規模モデルが爆発的に増加していますが、画像編集、自動運転、ロボット工学などのきめ細...

Meta AI Zeng Hanqing: サブグラフニューラルネットワークのスケーラブルなアプリケーションと表現力豊かなアプリケーション

ディープラーニングの活発な分野として、グラフニューラルネットワークは人工知能科学者から幅広い注目を集...

マスクの後ろに隠れて沈黙しないでください。AIはあなたが誰であるかを知っています

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

...

知っておくべき 10 個の機械学習 API

[[257117]] [51CTO.com クイック翻訳] 今日では、携帯電話の写真ストリーム認識...

美団総合ビジネス推奨システムの品質モデルと実践

著者: Yong Hao Gen Gen、Wang Xin など1 はじめに美団の総合店内事業(以下...

ChatGPT の残念な欠点 10 選: チャットボットの限界を探る

ChatGPT は、翻訳、作詞作曲、リサーチ、コーディングなど、さまざまなスキルに優れています。しか...

人工知能は人間に取って代わろうとしているのでしょうか、あるいは人間を支配しようとしているのでしょうか?本当にそうなのでしょうか?

生産性が徐々に生産と生活をカバーするようになると、ロボットはすぐに生活のあらゆる分野に参入し、一部の...

このトリックにより、トランスフォーマーの推論速度が4.5倍になり、数十万ドルを節約できます。

[[443226]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitA...

...

...

...

...

...

自動運転シミュレーションの雄大な景色!自動運転シミュレーションの分野についてお話ししましょう!

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...