4

だから私はDB( MySql)にエントリの膨大なリストを持っています

Web アプリケーションの作成にPythonDjangoを使用しています。

これは、私が使用している基本の Django モデルです。

class DJ(models.Model):
    alias = models.CharField(max_length=255)
    #other fields...

私のDBには重複があります

例えば。DJ アバブ アンドビヨンド,ディスクジョーキーアバブアンドビヨンド , ...

これは問題です...それは私のDBに大きな穴を開け、したがって私のアプリケーションです。


他の人もこの問題に遭遇して考えたことがあると思います。

私の考えは次のとおりです。

  • 新しいエントリを作成できないように一連のルールを作成しますか?

    例えば。「 Above & Beyond」がDBにあるため、「DJ Above and Beyond」を作成できません

  • これらのエイリアスを相互に関連付けますか?

    例えば。「DJ アバブ アンド ビヨンド」「アバブ アンド ビヨンド」に関連付ける


誰かが私を非常に役立つ方向に向けることができたとしても、私は文字通りこれについてどうやって進むべきか見当がつきません.

どんな助けでも大歓迎です!君たちありがとう。

4

9 に答える 9

4

レーベンシュタイン距離に基づいて何かを行うことができると思いますが、これを自動的に行う実際の方法はありません-かなり複雑なルールベースのシステムを作成する必要はありません.

x任意のとが の複製であるyかどうかに対応できるルール システムを定義できない限り、あいまいで人間的な方法でこれを処理する必要があります。xy

スタック オーバーフローには、これに対処するかなり適切な方法があります。レーベンシュタイン距離 (およびおそらくある種のルール エンジン) などに基づいて、何かが重複している可能性がある場合にユーザーに警告し、ユーザーのサブセットが重複としてマージできるようにします。他のユーザーが警告を無視した場合。

于 2010-01-21T15:16:42.493 に答える
3

あなたが挙げた例から、完全一致の問題よりも自然言語の問題が多いように思えます。自然言語のマッチングは本質的に不正確であるため、完璧な解決策を思いつくことはまずありません。

  • アルゴリズム的に近い文字列は意味的に近いとは限らないため、文字列の距離は実際には機能しません (たとえば、"DJ Above & Beyond" は "Above and Beyond" と一致する必要がありますが、レーベンシュタイン距離で近い "DJ Above & Beyond 2" とは一致しません)。
  • 自然言語解析に代わるいくつかの安価な方法は、表音で一致するsoundexと、接頭辞/接尾辞を削除して語幹で正規化するStemmingです。語根のリンクされたリストを作成できると思いますが、これもそれほど正確ではありません。
  • これがユーザーと対話するプログラムである場合、「ニアミス」をユーザーにエコーすることができます。
  • 何らかの方法でエントリを正規化して、異なるエントリが同じ正規化された値にマップされるようにすることができます (たとえば、大文字と小文字の正規化、「&」->「And」など、上記の提案のいくつかが一歩前進する可能性があります)。ニアミスを検出したり、複数の入力を 1 つの値にマッピングしたりできます。

私の経験は英語にのみ適用されるという警告を追加します。たとえば、英語の PorterStemmer は、そこに入力した 1 つのフランス語のタイトルを認識しません。

于 2010-01-21T15:24:19.560 に答える
2

これはプログラミングの問題というよりも、社会的な問題だと思います。このような自然言語処理に対するプログラムによるソリューションは、バグが多く、エラーが発生しやすくなります。近いものを区別することは非常に困難ですが、あなたが話しているような望ましくない重複とは正当に異なります。

Dominic が述べたように、Stack Overflow のタグ付けシステムは、このための非常に優れたモデルです。必要に応じて既存のタグを使用するようユーザーに促し (ユーザーが入力するドロップダウン リスト)、信頼できるユーザーが個々の質問に再タグ付けできるようにし、モデレーターが大量の再タグ付けを行えるようにします。

これは実際には、人が直接関与しなければならないプロセスです。

于 2010-01-21T16:01:17.120 に答える
1

モデルを変更して、「エイリアス」を次のような他のテーブルへのキーのリストにするのはどうですか(「the」、「and」などの小さな単語をスキップします)。1=>上記。2=>超えて; 3=>ディスク; 4=>ジョキー;

次に、新しいレコードを挿入する場合は、タイトルの重要な単語がすでにテーブルにあり、現在存在するモデルエンティティと一致するものがいくつあるかを確認します。たとえば、50%を超える場合は、偶然の一致があり、訪問者にそれらのリストを表示して、「これの一部を意味しますか」と尋ねることができます。

于 2010-01-23T15:47:13.417 に答える
1

これは完全な解決策ではありませんが、私が考えたことの1つは次のとおりです。

class DJ(models.Model):
    #other fields, no alias!

class DJAlias(models.Model):
    dj = models.ForeignKey(DJ)

これにより、同じ dj に対して複数のエイリアスを持つことができます。

ただし、エイリアスが正しい dj に確実に追加されるようにするための適切な方法を見つける必要があります。ドミニクの投稿を参照してください。

しかし、1 つの dj を指している他のいくつかのエイリアスに対してエイリアスをチェックすると、アルゴリズムがうまく機能する可能性があります。

于 2010-01-21T15:23:13.910 に答える
1

まず第一に、もちろんプログラミング タスク (前述の NLP など) は興味深いものです。しかし、前述のように、それを完璧にするのはやり過ぎです。

しかし、もう 1 つのビューは前述のとおり (「ソーシャル」)、誰がデータを入力し、誰がそれを表示し、どのくらいの期間、どれだけ正確であるべきか? です。これは命名規則の問題であり、偉大なプロジェクト musicbrainz.org を思い出します。あなたのサイトが「うまく機能する」か、それとも標準に従うことを好むか、後者の場合は mb プロジェクトに沿って自分自身を方向付けます。それをしたのに聞いたことがない。すなわち。Above & Beyondについては、こちらを参照してください。エイリアスが定義されており、それを使用してユーザーの検索に一致させます。 http://musicbrainz.org/show/artist/aliases.html?artistid=58438 wiki の Artist_Alias ページもチェックしてください。

データ モデルは一見の価値があり、Python にもデータを同期するための API バインディングがいくつかあります。

于 2010-01-22T08:36:01.633 に答える
1

このインスタンスのみでこの問題を解決することを試みることができます (「&」を「&」に、「DJ」を「ディスク ジョーキー」に置き換えるか、「DJ」を無視するなど)。テーブルに DJ しかいない場合は、そのようなルールをたくさん設定できます。テーブルにもっと多様なものが含まれている場合は、より構造的なアプローチを採用する必要があります。データセットのサンプルを教えてください。

于 2010-01-21T15:47:02.803 に答える
0

アーティスト名または一般的にメディア関連の名前だけを探している場合は、last.fmまたはechonestのAPIを使用する方がはるかに良いかもしれません。それらには、すでに巨大なルールセットと解決するための巨大なデータベースがあるからです。

于 2012-11-08T10:15:54.960 に答える
0

fuzzywuzzyはあなたのニーズに完璧にマッチしているようです。

この記事では、要件に非常によく一致するように設定された理由について説明します。基本的には、2 つの異なるものの名​​前がわずかに異なる状況を処理するためです。

私たちが常にイライラさせられる問題の 1 つは、2 つのチケットのリストが同じ実際のイベントのものであるかどうかを判断しようとすることです (つまり、インターン軍の助けを借りずに)。
…<br> これを実現するために、「ファジー」文字列マッチング ルーチンのライブラリを構築して、作業を支援しています。

于 2012-11-07T18:28:32.403 に答える