一般的なテーマで文字列をグループ化するにはどうすればよいですか?


10

たとえば、プログラミングに関する文字列とプログラミングに関する他の文字列、物理学に関する文字列と物理学に関する他の文字列などを、さまざまなトピックについてグループ化しようとしています。問題の明白な理論的な言語的側面にもかかわらず、私は実際にプログラミング/ソフトウェアを使用してこれを行うことを探しています。

まとめ多数の文字列がある場合、それらをセマンティックテーマでグループ化するにはどうすればよいですか?

特定のアプリケーション:一般的なグループ(車、コンピューター、政治、カナダ、食品、バラクオバマなど)に分類したい約20万の雑学クイズがあります。

調べた内容:ウィキペディアには自然言語処理ツールキットのリストがあります(私がやろうとしていることが実際にはNLPと呼ばれていると仮定しています)。

注:これを行うには追加の知識が必要であることが指摘されています(たとえば、ポルシェは自動車であり、C ++はプログラミング言語です)。次に、トレーニングデータが必要だと思いますが、質問と回答のリストしかない場合、どうすればトレーニングデータを生成できますか?次に、トレーニングデータをどのように使用しますか?

その他のメモ: Q&Aヘルプの現在のフォーマット(JSONのように見えますが、基本的には未加工のテキストファイルです)の場合:

// row 1: is metadata
// row 2: is a very specific kind of "category"
// row 3: is the question
// row 4: is the answer
{
  15343
  A MUSICAL PASTICHE
  Of classical music's "three B's", he was the one born in Hamburg in 1833
  Johannes Brahms
}

しかし、誰かがすでにカテゴリが存在していると指摘する前に、このように約20万の質問と回答があり、基本的には「カテゴリ」がいくつもあることに注意してください。私はこれらを上記のようなより広いグループにグループ化しようとしています。また、この書式はすべての質問に対して簡単に変更できます。プログラムで変更します。

さらに注意:自分ですべての質問を読んだわけではないので、必要なカテゴリの数(少なくとも10〜20)は実際にはわかりません。分類中に何らかの方法で有限数が決定されることを部分的に期待していました。いずれにせよ、私はいつでも手動でいくつかのカテゴリを作成できます。


にんじんはどのように使いましたか?それについての私の短い読解から、それは200kレコードを簡単に処理するべきであるように思われます。

思ったよりもずっと長くかかり、JVMの初期メモリ割り当てを1024mに、最大メモリを2048mに増やすことを余儀なくされました。それは私がその音を作ったほど悪くはありませんでした。

十分なトレーニングデータが必要なだけで、質問をこれらのカテゴリに分類できるはずです。完全に自動化されたアプローチでは、「車」という単語を含む質問など、他の方法でそれらをグループ化する可能性があります。グループ化の作成と同時にシノニムを学習することはできません。
QUITあり-Anony-Mousse 2012年

ええと、一括処理を行っています。JVMを与えることは本当に問題ではありません。どれくらいかかりましたか?どこからドキュメントをロードしましたか?カスタムソース?

私は多分10分かかりましたが、私は同意します、バルク処理は定義により時間とメモリを集中的に使用します。それに関する窒息全体の問題は問題ではありませんでしたが、余談です。

回答:


4

これはNLPのかなり標準的な問題であり、探しているGoogleの魔法の言葉は「トピックモデリング」です。文字列はかなり短いですが、Latent Dirichlet Allocationまたは同様の方法である程度成功する可能性があります。ここにEdwin Chenによる素晴らしいブログ投稿があります。これは、アルゴリズムの背後にある一般的な考え方を説明しています。実装の詳細については、このノートでYi Wangが説明しています。

既製のソリューションを探している場合topicmodelsは、LDAとより洗練された相関トピックモデルの両方に適度に優れたインターフェースを提供するため、R用のパッケージを試すことをお勧めします。また、David Mimnoが管理している実装の優れたリストもここにあります


ありがとう、チェンのブログ投稿は、私がやろうとしていることにスポットがあるようです。これまでにリスト/実行したことのいずれかを使用した可能性はありますか?私はここでまったく新しい根拠にあり、(既成のソリューションの1つを使用して)何をする必要があるかについてのウォークスルーに感謝します。「ドキュメント」をフォーマットするにはどうすればよいですか?どのドキュメントがどのグループにあるかを識別できるように、各Q&AにIDを適用する必要がありますか?出力されたデータをどのように使用しますか?私が言ったように、私は多くの詳細を理解していません。
Whymarrh 2012年

R topicmodelsパッケージをかなり使用しました。私は確かにあなた自身のコードを転がすことよりもそれをお勧めします-cran.r-project.org/web/packages/topicmodels/vignettes/…動作する例を含むいくつかのドキュメントがあります。いずれにしてもすべてが「バッグオブワード」表現に縮小されるため、各ドキュメントの特定のフォーマットはそれほど重要ではありません。関連するすべてのテキストを1つの文字列に投げ込むだけです。
Martin O'Leary

4

ここで2つの問題を解決しようとしています。

問題1:質問文字列を適切なカテゴリに分類します。

問題2:適切なカテゴリを作成します。

最初の問題は、いわゆる監視アルゴリズムによって実行できます。多くの分類子は、非常に優れた精度とパフォーマンスを提供できます。ただし、問題2、薄い空気(大量のデータ)からカテゴリを作成することは、はるかにトリッキーです。これは監視されていない問題であり、大量のデータが与えられると、コンピュータはいくつかの基準を与えられてカテゴリを自律的に決定します。理想的には、これらの基準とアルゴリズムは、データをクラスターに整理する必要があります。次に、これらにラベルを付けることができます。ただし、これははるかに困難なタスクであるため、専門家を必要とする可能性が高い調整作業を行わずに良好な結果をもたらす、許容できるドロップインソリューションはここにはないと思います。

だから、ここにはまだ魔法のボタンはありません。ただし、できることは、マシンを少し手助けすることです。たとえば、カテゴリセットを決定できます。カテゴリを決定したら、トレーニングデータを作成できます。この設定では、トレーニングデータは質問と正しいカテゴリのペアです。

トレーニングデータが多いほど良いです。ただし、タスクはまだ何かに対して自動的に行われるため、最初は手動で作業を開始しても意味がありません。では、なぜトレーニングデータが必要なのでしょうか。精度評価。良い結果が必要な場合は、セットアップがどの程度優れているかについて何らかの評価を行うことが重要です。そして、それをやや体系的に行う唯一の方法は、手動でいくつかの質問に手動でラベルを付けることです。そうでなければ、あなたは盲目です。

次に、いくつかの新しい質問が発生します。最初:どのくらいのトレーニングデータが必要ですか?"場合によります"。あなたのデータやカテゴリを見たことがないので、私が推測するかどうかさえわかりません。しかし、「球場の見積もり」を取り、約500の質問をすることができます。桁違いにオフになる可能性があることに注意してください。

これは本当に500の質問に手作業でタグ付けする必要があることを意味しますか?はいといいえ。中間結果と「ブートストラップ」分類子への賢さを使用することが可能です。それでもまだ手作業であり、考えてみると、500の質問にタグを付けるのにそれほど時間はかかりません。ここで賢いことは、勤勉であるよりもすぐに悪い結果をもたらす可能性があります。

十分な量のトレーニングデータがある場合は、その75%を取り、お気に入りのツール(ここで言及したものなど)を使用して分類子を作成します。ここで、分類器に、保持されているデータの25%にラベルを付けて、結果の精度を測定してみましょう。結果が良ければ、シャンパンをポップします。そうでない場合は、さらにトレーニングデータを作成するか、別の分類子を試してください。

TL; DR

要約すると、これは私がそれをした方法です。

0) Use a supervised learner.
1) Create a category set yourself. 
2) Label manually about 500 questions
3) Use 75% of those to train a classifier.
4) Check performance.
5) If good then cheers else goto 2.

小さな質問の1つ:トレーニングデータに対して「約500の質問」と言って手動でタグ付けするだけでなく、「1桁もオフになる可能性がある」ので、代わりに5kまたは50kの質問を使用したとしても、手動でタグ付けしますか?

ことです。データを確認したり、プロジェクトのすべての詳細を非常に明確に把握したりせずに、適切な見積もりを出すことは困難です。ただし、これは覚えておくことが重要です。500が低すぎる場合でも、タグ付けの労力は無駄になりませんでした。評価のために手動でラベル付けされた質問がまだ必要です。評価データが多いほど、より良い評価を行うことができます。

1桁の大きさで私は50-500-5000を意味しました。50kに分類する必要はないと思います。コーパス全体の1/4です!500の質問が低すぎる場合、分類子をブートストラップすることが可能です。ここでの考え方は、小さな初期コーパス(例:500)で分類子をトレーニングし、残りをタグ付けすることです。これで、分類子が自信を持って新しい大きな分類子を再トレーニングするいくつかのケースを使用できます。

覚えておくべきもう一つの重要なこと。多くの分類子のパフォーマンスは、トレーニングデータの量において線形ではありませんが、通常はシグモイドのような曲線になります。つまり、タグ付けされた500の質問は5000とほぼ同じくらいのメリットがあります。

私のプロジェクトに追加の洞察を提供する詳細は何ですか?いくつかの例の質問を共有してフォーマットを表示できますが、分類プロセスに合うようにQ&Aのフォーマットを調整したいと思っています。私は助けに感謝します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.