大規模なテキスト分類


18

テキストデータの分類を検討しています。私が持っている300 classes、クラスごとに200件のトレーニング文書を(そう60000 documents in total)、これはおそらくもたらすことがある非常に高い次元データ(私たちはを超えて見てすることができる100万の寸法)。

パイプラインで次の手順を実行します(私の要件が何であるかを把握するためです)。

  1. 各ドキュメントを特徴ベクトルに変換(tf-idfまたはvector space model
  2. Feature selectionMutual Informationできればベース、または他の標準的なもの)
  3. (分類器をトレーニングSVMNaive BayesLogistic RegressionまたはRandom Forest
  4. 訓練された分類子モデルに基づいて、見えないデータを予測します。

質問は、このような高次元のデータを処理するためにどのツール/フレームワークを使用するのですか?私はいつもの容疑者(R、WEKA ...)を知っていますが、私の知る限り(間違っているかもしれません)、おそらく誰もこの大規模なデータを処理できません。私が見ることができる他の市販のツールはありますか?

並列化する必要がある場合、Apache Mahoutを検討する必要がありますか?必要な機能をまだ提供していないようです。

事前にすべてに感謝します。


更新:このWebサイト、Rメーリングリスト、およびインターネット全般を調べました。私の状況では、次の問題が発生する可能性があります。

(1)R(特にtmパッケージ)を使用したデータの前処理は、非常に遅いため、実用的ではありませんtm

(2)Rパッケージ(前処理、スパース行列、分類子など)のアンサンブルを使用する必要があるため、パッケージ間の相互運用性が問題になる可能性があり、データをある形式から別の形式に変換する際に追加のオーバーヘッドが発生する可能性があります。たとえば、tm(またはWEKAなどの外部ツール)を使用して前処理を行う場合、このデータをRのHPCライブラリが読み取れる形式に変換する方法を見つける必要があります。繰り返しになりますが、分類器パッケージがHPCライブラリによって提供されるデータを直接取り込むかどうかは明確ではありません。

私は正しい軌道に乗っていますか?そしてもっと重要なことは、私は理にかなっていますか?


Rはこれよりはるかに大きいデータセットを処理できます。使用できるツールを十分に活用する必要があります。主要な言語や環境で達成できることの間に違いはありませんが、WekaとMahoutは利用可能なものの点で遅れています。FWIW、これはかなり小さなサンプルサイズであり、1Mの次元は大したことではありませんが、統計的にはやり過ぎです。私の推奨事項はRまたはPythonです。初心者でも無料で簡単です。Matlabは無料ではありませんが、優れています。また、多くのコンピューターを使用すると、大きな税金がかかります。
イテレーター

1
はるかに顕著な点は、クラスごとの例よりも多くのクラスがあり、それを非常に高い次元の空間に埋め込むことです。ここで非常に優れたクラス分離が得られるかどうかはわかりません。クラスの構造的な関係はありますか?もしそうなら、これらの方法のいくつかはその洞察なしではうまくいかないかもしれません。
イテレーター

1
foreachライブラリを使用して、Rで並列コードを記述できます。これは、本質的に並列化が簡単なランダムフォレストと組み合わせて使用​​すると特に効果的です。
ザック

2
いくつかの質問:1)あなたが言及したすべての異なるタイプの学習アプローチを比較することに興味がありますか、それとも仕事を成し遂げるのに必要なのでしょうか?2)各ドキュメントは、1、1以上、または0以上のクラスに属しますか?3)何らかの理由で機能選択を具体的に使用したいですか、それとも必要だと思いましたか?これは今日の標準では控えめなサイズの問題であり、次元の削減は必要ないという他のコメントに同意します。
DavidDLewis

1
私は、10,000近くのトピック(たとえば、クラスやカテゴリ、またはお好みの用語)を含むテキスト分類に取り組んでいます。私は現在、この規模でこのテキスト分類システムの調整に取り組んでいます。私は独自のテクニックをプロプライエタリであるため共有することはできませんが、少しアドバイスがあります:既にそうであることが証明されていない限り、いくつかの提案されたテクニックスケールを想定することには非常に注意してください。私の経験では、そうする人はほとんどいません。

回答:


13

これは、データがscipy.sparse.csr_matrixPythonのインスタンスなどのスパースデータ構造として表される限り、機能するようにする必要があります。テキストデータ扱うためのチュートリアルを書きました。ハッシュトリックを活用することで、さらにメモリ使用量を削減するために、さらに可能である:使用するように適応させるHashingVectorizer代わりに、CountingVectorizerまたはTfidfVectorizer。これについては、ドキュメントセクションのテキスト機能の抽出で説明しています。

ランダムフォレストは一般に、線形モデル(線形サポートベクターマシンやロジスティック回帰など)や多項またはベルヌーイナイーブベイよりもはるかに高価であり、ほとんどのテキスト分類問題では、単純なモデルよりも予測精度が大幅に向上することはありません。

scikit-learnが問題に合わせて拡張できない場合、Vowpal Wabbitは、あなたが話しているすべてのモデルを実装していなくても(おそらくsklearnよりも高速に)実行します。

scikit-learnライブラリの現在の状態を反映し、壊れたリンクを修正するために、2015年4月に編集されました。


さて、「非標準」の次元削減手法を使用する際の問題は、作品を公開しようとするとトラブルに陥る可能性が高いことです。少なくともテキスト分類の分野では、レビュアーが一般的に使用されている手法を見たいと思っているという事実を知っています(既存の分類手法との比較も容易にします)。
user721975

心配しないでください-@ogriselは、少なくとも標準のテキスト分類に関するものではないので、非標準については言及していませんでしたが、彼のチュートリアルはまだ読んでいません。
イテレーター

+1 Pythonはおそらく楽しい方法だと思います。Rにはテキストマイニング用のごく最近のパッケージがいくつかありますが、統計的な専門知識や興味よりも計算能力が高い場合は、Pythonが推奨されます。
イテレーター

@ogrisel:あなたや他の人がsklearnに貢献したことに対する称賛。Pythonで作業する多くの人に推奨しました-デザイン全体が模範的です。
イテレーター

「ランダムな投影法を使用した」「非標準」次元削減と機能ハッシュについては、John Langfordによるハッシュトリックmetaoptimizeに関するこの説明を確認してください
ogrisel

10

Gensim for Pythonは魔法です。また、Pythonにあるため、@ ogriselの提案と組み合わせて使用​​できます。


1

自分のホーンを鳴らすのではなく、Rapidminerを使用してテキスト分析に関する非常に人気のあるビデオシリーズを作成しました。ここで見ることができます:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

機能選択の実行を避けることができます。メモリ内に100万* 100万のマトリックスを作成しない分類子を使用するだけです:)

ロジスティック回帰は、その多くの次元で停止します。Naive Bayesは独立した次元を想定しているため、問題ありません。SVMは次元の数に依存しません(ただし、サポートベクトルの数に依存します)ので、同様に問題ありません。

ただし、300は多くのクラスです。私はほんの数人で始めて、あなたの道を進みます。


素晴らしい指針とアドバイス。ありがとう。「数個から始めて、自分のやり方で作業を進めてください」という意味を詳しく説明していただけますか?
-user721975

さて、300クラス(「バイオリン、ヴィオラ、チェロ、トランペットなど」)の代わりに、「string、brass」などのより小さな数に再分類できます。
ニール


1

まず、あなたのコメントに基づいて、これを300のバイナリ(はい/いいえ)分類問題として扱います。使いやすいオープンソースのバイナリ分類学習器が多数あり、これにより時間とメモリを交換できます。

SVMとロジスティック回帰は、おそらくテキスト分類の最も一般的なアプローチです。最新の実装ではスパースデータ構造が使用され、オーバーフィットを回避する正則化設定が含まれているため、どちらも1000000ディメンションを簡単に処理できます。

WEKAKNIMEなど、いくつかのオープンソースの機械学習スイートには、SVMとロジスティック回帰の両方が含まれています。SVMのスタンドアロン実装にはlibSVMおよびSVMlightが含まれます。ロジスティック回帰のために、マディガン、ゲンキンなどで開発したBXRtrainとBXRclassifyをプラグインします。BXRclassifyは、数千のロジスティック回帰モデルのメモリ内インデックスを構築し、それらを同時に適用できます。

テキストを属性ベクトル形式に変換することに関して、私はどういうわけか、常にゼロからそれを行うために小さなPerlを書くことになります。:-)しかし、私が言及した機械学習スイートには、トークン化とベクトル化のコードが含まれていると思います。もう1つの方法は、LingPipeのような自然言語ツールキットを使用することです。ただし、これはやりすぎかもしれません。


+1良いコメント。300のyes / no分類を行う場合、クラスのネガティブトレーニングデータをどのように選択しますか?明確なデータは、明らかにクラスに属するドキュメントです。
user721975

別のコメント。SVM / Logistic regは確かに100万のディメンションを処理できますが、これらの分類子のパラメーターを選択する実験を実行するにはどうすればよいですか?たとえば、小さなデータセットで10倍のクロス検証を実行してパラメーターを決定できますが、このような大きなデータに対しては、アルゴリズムが妥当な時間で実行を完了するためにどのようなアプローチを取りますか?
user721975

@ user721975:特定の差別については、肯定的な文書はラベルXが付いた文書であり、否定的な文書はすべて残りの文書です。
-DavidDLewis

@ user721975:詳細はアルゴリズムと実装によって大きく異なるため、実行時間に関する一般的なアドバイスを与えることは困難です。10倍の交差検証は、データセットに対して非実用的ではない場合があります。60000の例は重要ではありません。
-DavidDLewis

1
バランスの悪いトレーニングセットは必ずしも問題ではありません。しかし、実際、私は混乱していることに気付きます。ドキュメントは0、1、または複数のクラスに属することができるので、クラスごとに200のトレーニングドキュメントを持つことはどういう意味ですか?0クラスまたは2+クラスのドキュメントを削除するために何かしましたか?一般に、この60000文書のセットをどのように生成しましたか?
-DavidDLewis

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.