単語の袋とRの感情分析

この記事は、 Bag of Words Kaggleの研究課題(最初の部分)に基づいていますが、これは翻訳ではありません。 元の割り当てはPythonで行われます。 自然言語のテキストを処理するためのR言語の可能性を評価すると同時に、キャレットRパッケージのラッパーでのランダムフォレストの実装を試してみました。



このタスクの意味は、英語の映画レビューを特定の方法で処理し、レビューの調性を判断する「マシン」を構築し、ネガティブ/ポジティブの2つのクラスのいずれかに関連付けます。 トレーニングのサンプルとして、タスクは未知のボランティアによってマークされたIMDBからの2万5千の改訂を含むデータセットを使用します。



記事と仕事の準備のコードは、GitHubのリポジトリにあります。 その実装には、Rバージョン3.1.3が必要です(パッケージからの警告に注意を払わない場合、3.1.2ではすべてが機能します)。 さらに、次のパッケージをインストールする必要があります。





短縮形式のタスク(1000件のレビューと約100の最も一般的な用語)は32ビットOSを搭載したマシンで実行できますが、フルバージョンの場合は64ビットと16 GBのRAMが必要です。 モデルトレーニング中に、約12 GBの物理メモリが使用されます。



トレーニングセットは、タブで区切られたデータセットです。 コントロールサンプルには25,000のリビジョンも含まれていますが、当然マークアップはありません。 このページからファイルをダウンロードできます。 これには、Kaggleでの登録が必要です。



データの前処理



ダウンロードして展開した後、ディメンションを確認することをお勧めします。3列に25,000行あるはずです。 テキストに引用符があるため、すぐには成功しませんでした。 最初のレコードで実験しました。 対応するレビューは非常に長く、2304文字なので、その断片のみを示します。



  「\」ムーンウォーカーは一部が伝記、一部が長編映画で、最初に公開されたときに映画館で見に行ったことを覚えています。 一部には、MJの報道に対する感情についての微妙なメッセージがあり、薬物の明らかなメッセージも大丈夫です。<br /> <br />視覚的に印象的ですが、もちろん、これはマイケルジャクソンに関するものです。 ..」 




テキストには、句読点、HTMLタグ、および削除する必要がある特殊文字が含まれています。 始めるために、HTMLレビューを削除しました。 次に、句読点、特殊文字、数字を削除しました。 一般的に、このような分析では、絵文字などの句読点からの一部の構造は削除せずに単語に変換する方が良いですが、私はこれを行わず、すべての文字を小文字に変換して個別の単語に解析します。 レビューに意味を追加しなかった一般的な語彙の単語を削除することは残っています。 私はtmパッケージからそのような英語の単語のリストを取りました。 楽しみのために、私は最初の20を見ました:



「私」「私」「私の」「自分」「私たち」「私たち」「私たち」「自分」「あなた」「あなた」「あなた」「自分」「自分」「彼」「彼」「彼」「彼自身」 「「彼女」「彼女」「彼女」



次に、トレーニングセットの25,000レコードすべてに対して上記の操作を繰り返しました。 同時に、彼はMJの構造から残った1文字の単語を削除しました。



言葉の袋



Bag of Words(またはBag of Words)は自然言語のテキストのモデルであり、各ドキュメントまたはテキストは、それらの間の関係に関する情報なしで、順序付けられていない単語のセットのように見えます。 マトリックスの形式で表すことができます。各行は個別のドキュメントまたはテキストに対応し、各列は特定の単語に対応します。 行と列の交点にあるセルには、対応するドキュメント内の単語の出現回数が含まれます。



Bag of wordsを準備するために、tmパッケージの機能を利用しました。 オブジェクトとしてのこのパッケージは、いわゆる一次言語コーパス-共通の機能によって結合されたテキストのコレクションで動作します。 私たちの場合、すべてのテキストは映画レビューです。 コーパスを作成するには、まずテキストをベクトルに変換する必要があります。ベクトルの各要素は個別のドキュメントを表します。 そして、ケースに基づいてドキュメント用語マトリックスを構築します。 彼女は言葉の袋になります。



まず、25,000のドキュメントと73,759の用語のマトリックスを取得しました。 明らかに、用語が多すぎました。 別の言い方をすると、語形化後、単語形式を補題に減らします-通常の語彙形式、49549の用語が残ります。 まだたくさんありました。 したがって、レビューで特にまれな言葉を削除しました。 元のタスクでは5000語が使用されていましたが、残念ながら、スパースネスパラメーターは用語の数に非線形に影響するため、用語の数を変えて、数値5072に決めました。



最も頻繁に使用される単語を含むバッグのフラグメントを次に示します。

 Docs act Actor act実際にまた他の悪い悪いベスト
     1 0 0 1 2 1 0 3 0 0 1
     2 0 0 0 0 0 0 0 0 0 0 0 1
     3 0 1 0 0 0 0 1 0 1 0
     4 0 1 0 1 2 0 0 0 0 1


モデルトレーニング



モデルを構築するために、キャレットラッパーでrandomForestパッケージを選択しました。 Caretを使用すると、学習プロセスを柔軟に管理でき、データの前処理とトレーニングの品質管理のための機能が組み込まれています。 さらに、キャレットを使用すると、複数のプロセッサコアを一度に使用できます。



所定のツリー数nree = 100の実際のサンプル(25000 x 5072)では、OS X 10.8、2.3 GHz Intel Core i7、16 GB 1600 MHz DDR3を搭載したコンピューターでトレーニングに約110時間かかりました。



キャレットを使用すると、異なるmtry値を持つ3つのモデルが一度に順番にトレーニングされ、その後、精度インジケーターによって最適なモデルが選択されることに注意してください。 mtryは、ツリーが分岐するたびにランダムに選択される用語の数を設定します。



デフォルトでは、モデルをトレーニングするとき、25サイクルのブートストラップを使用することになっています。 マシンの時間を節約するために、それを5グループのスライディングコントロールに置き換えました。 各サイクルで、80%がトレーニングに、20%がコントロールに使用されます。



削減されたサンプルに最適なモデルは、0.71の精度を示しました。 これは、結果として、すべてのリビジョンの約29%が誤って分類されることを意味していました。 しかし、これは、制御を移動する場合でも、制御サンプルに含まれています。 テストサンプルでは、​​精度がわずかに低下します。 しかし、削減されたデータセットの場合、これはそれほど悪くはありません。



キャレットのvarImp関数を使用すると、重要度の降順でモデルのトレーニングに使用されるインジケーターのリストを取得できます。 最初の10は非常に期待されていました。



学期

  1. 素晴らしい100.00000
  2. 悪い81.79039
  3. movi 59.40987
  4. フィルム53.80526
  5. 42.43621でさえ
  6. 愛39.98373
  7. 時間38.14139
  8. 最高36.50986
  9. 1つの36.36246
  10. 35.85307など


Kaggleでの予測と検証



トレーニングサンプルと同じ方法でテストサンプルを処理しましたが、1つ例外があります。トレーニングサンプルから取得した辞書を使用して、テストサンプルの用語を選択しました。



ドキュメント/用語のマトリックスを取得した後、それをデータフレームに変換し、それを送信して、トレーニング済みモデルを使用して予測()します。 予測をcsvに保存し、サイトのフォームを介してKaggleに送信しました。







結果は277のうち231の非常に控えめなものですが、それでも私の「車」は6分の1のケースでミスを犯しました。



結局のところ、Rの機能は自然言語のテキストを処理するのに十分です。 残念ながら、Pythonでタスクがどれだけ速く実行されるかについてのデータはありません。 tmパッケージは、使用可能な唯一のツールではありません。RにはOpenNLPWekaへのインターフェース 、および個々の問題を解決できる多数のパッケージがあります。 多かれ少なかれ関連性のあるツールのリストはここにあります 。 Googleのword2vecの実装もあり、まだ開発中ですが、word2vecが中心的な技術コンポーネントであるKaggleタスクの2番目の部分を試すことができます。



All Articles