web-dev-qa-db-ja.com

盗用されたジョークを特定しますか?

ウェブサイトに投稿された重複するジョークを特定できるようにしたいと思います。以前に投稿されたジョークのかなり大きなデータベースを構築できます。次に、新しいジョークが入ってくるたびにそれを調べ、データベースから最も「類似した」ジョークを選び出し、順番に吐き出します。新しいジョークが重複しているという私の自信が、あるしきい値を超えている場合。

文字ごとに正確に一致するものを探すことはできましたが、それはあまり面白くなく、「ほぼ重複」を見つけることができませんでした。たとえば、次の2つのジョークを同じものと見なしたいと思います。

3人の男性がバーに足を踏み入れます。最初のものは「痛い!」と言い、2番目のものは「痛い!」と言います。 3番目のアヒル。

3人の男性がバーに行きます。 1つ目は「ow !!!!」、2つ目は「OWW !!!!!」、3つ目はアヒルです。

多くの重複したジョークには、キャラクターの名前が入れ替わっていることが含まれていると思います(つまり、「リトルジョニー」ではなく「リトルスージー」についての話、または「バラクオバマ」を「ジョージブッシュ」に交換した大統領についてのジョーク)。それらも同じジョークとして数えたいです。

私は盗用検出アルゴリズムについて読んでいますが、それらははるかに大きなテキストを対象としているため(平均的なジョークはおそらく数十語です)、または学術研究の特別な特性に依存しているため、どれも完全に適合していないようです(すなわち、引用分析)。

ある時点で、次のような面白いと思った論文を見つけました。各テキストをベクトルvに折りたたんで、語彙のith単語がn回表示されるようにします。 v_iの値はnです。次に、新しいジョークを取得したら、それと作成した他のすべてのベクトルとの間の距離を計算します。最も近いベクトルは、最も可能性の高いソーステキストです。アイデアのいくつかの異なるバリエーションを調査し、それらの有効性を比較しました。

これは私には賢明な考えのように思えますが、名前を入れ替えるなどのことにあまり敏感ではないのではないかと思います。また、彼らがどのように処理したかを正確に確認するための論文をもう一度見つけることはできません。

これは基本的に数千の異なるクラスにわたる分類の問題であり、各クラスの例はほんの一握りであるため、SVMやニューラルネットなどの他の機械学習手法をこれにどのように適用できるかわかりません。そして、私が知る限り、重複したジョークの適切にラベル付けされたデータセットはありません。

これに対する合理的な戦略は何ですか?誰かが私を有用な文献の方向に向けることができますか?

(このプロジェクトは純粋に楽しみのためであり、私はいくつかの半合理的な概算を探しています。NLPは一般に非常に困難であり、これに対する実際の正確な答えは事実上不可能であることを知っています。)

編集(重複フラグに応じて):いくつかのコメントでスケッチしたように、文字列編集距離はこれに対する優れたアプローチではないと思います。理由は次のとおりです。

  • 意味を変えてはならない複数の文字で構成されるもの(名前など)を交換することに不適切な重みを置きます
  • 正の一致の適切なしきい値を手動で把握する必要があります。テストするためのデータセットがありません
  • それは順序を気にします:冗談は文をめくりながら実質的に同じである可能性があるので、私はむしろ単語の袋のアプローチのようなものが欲しいです
  • それは潜在的に高価です:私が新しいエントリを見るときはいつでも、私が見たすべてのジョークに対してその文字列編集距離を再計算する必要があります
  • それはあまり面白くなく(結局のところ、私はこれを楽しみのためにやっています)、文字ごとの単純な比較よりも「ジョークの類似性」の概念をよりよく捉えるアルゴリズムがないことを確信していません。文字列編集距離がこの仕事に最適なツールであるという証拠を誰かが持っている場合、私はそれを聞いてオープンです---しかし、それは重複フラグにリンクされた回答によって提供される議論ではありません
6
Patrick Collins

編集距離の結果を歪める名前の変更を説明するための最も単純で単純なアルゴリズムは、適切な名前を除外することです。

英語は固有名詞を識別するのが比較的簡単で、おそらく 確立されたアルゴリズムとライブラリ そこにあります。数年前に品詞タガーを使用して同様のものを使用しましたが、(高価な)商用パッケージを使用していました。繰り返しますが、おそらく 他の選択肢 そこにあります。次に、ジョニー、スージー、バラクオバマなどの固有名詞を特定し、それらを取り除き、残っているものの間で編集距離を実行します。

その基本的な考え方に基づいて結果を改善する方法はたくさんあります。重複の一般的なバリエーションを特定し、編集距離からノイズとしてそれらを削除してみてください。たとえば、 既知の同義語 を正規の表現に一致させて置き換えると、「bar/pub」または「enter/goin/walkinto」が1つの表現に折りたたまれます。タイプミスやスペルミスがオプションであると仮定すると、「もしかして...」タガーも役立つ可能性があります。