50

私は、何年にもわたって、わずかに異なる名前で多くの重複レコードを取得してきたデータベースをクリーンアップしようとしています。たとえば、companysテーブルには、「SomeCompanyLimited」や「SOMECOMPANYLTD!」などの名前があります。

私の計画は、問題のあるテーブルをRにエクスポートし、名前を小文字に変換し、一般的な同義語( "limited"-> "ltd"など)を置き換え、アルファベット以外の文字を取り除き、それを使用agrepして類似したものを確認することでした。

私の最初の問題は、agrep一致する単一のパターンのみを受け入れ、他の会社と一致するようにすべての会社名をループするのが遅いことです。(クリーニングするテーブルの中には、数万、場合によっては数十万の名前をチェックするものがあります。)

tmパッケージ(JSSの記事)を簡単に見てきましたが、非常に強力なようですが、名前だけでなく、テキストの大きな塊を分析することを目的としています。

関連する質問がいくつかあります。

  1. パッケージはtmこの種のタスクに適していますか?

  2. より速い代替手段はありagrepますか?(上記の関数は、逸話的に遅いレーベンシュタイン編集距離を使用します。)

  3. と以外に、Rには他の適切なツールがagrepありtmますか?

  4. これをRで実行する必要がありますか、それともこの種のことをデータベースで直接実行する必要がありますか?(これはAccessデータベースなので、可能であれば触れないようにします。)

4

4 に答える 4

34

比較的整形式の小さなバッチを実行しているだけの場合は、パッケージcompare.linkage()内のまたはcompare.dedup()関数が出発点として最適です。ただし、大量のバッチがある場合は、さらに調整が必要になる場合があります。RecordLinkage

関数jarowinkler()levenshteinSim()、およびsoundex()inを使用して、独自の重み付けスキームを使用する独自の関数を記述します (また、そのままでは、 を使用してビッグ データ セットをRecordLinkage使用することはできません)。soundex()RecordLinkage

一致させたい名前のリストが 2 つある場合 (「レコード リンク」)、通常は両方を小文字に変換し、句読点をすべて削除します。"Limited" と "LTD" を区別するために、私は通常、各リストの最初の単語の別のベクトルを作成します。これにより、最初の単語に追加の重みを付けることができます。1 つのリストに頭字語 (おそらく ATT または IBM) が含まれている可能性があると思われる場合は、他のリストを頭字語化します。リストごとに、比較したい文字列のデータ フレームができあがり、それを MySQL データベースに個別のテーブルとして書きます。

候補が多すぎないように、2 つのリスト間で一致する必要LEFT OUTER JOINあるものについて、これら 2 つの表を作成します (おそらく、各リストの最初の 3 文字か、最初の 3 文字と頭字語の最初の 3 文字です)。 )。次に、上記の関数を使用して一致スコアを計算します。

依然として多くの手動検査を行う必要がありますが、スコアを並べ替えて、一致しないものをすばやく除外できます。

于 2011-07-13T19:24:08.857 に答える
9

たぶんグーグルリファインが役立つかもしれません。例外がたくさんあり、それらすべてをまだ知らない場合は、おそらくより適切に見えます。

于 2011-07-14T03:31:13.127 に答える
6

あなたがしていることはレコードリンケージと呼ばれ、すでに何十年にもわたって研究の巨大な分野でした. 幸いなことに、この種のことのために既製のツールがたくさんあります。基本的に、それらをデータベースに向けて、いくつかのクリーニングとコンパレーター (Levenshtein や Jaro-Winkler など) を設定すると、それらがオフになり、あなたに代わって仕事をしてくれます。

これらのツールには通常、パフォーマンスの問題を解決するための機能が用意されており、ほとんどのレコード ペアがまったく比較されないため、Levenshtein は遅くても高速に実行できます。

上記のウィキペディアのリンクには、使用できる多数のレコード リンク ツールへのリンクがあります。私は個人的に Java でDukeと呼ばれるものを作成しました。大きくて高価なものが必要な場合は、マスター データ管理ツールを購入できます。

于 2012-09-26T08:37:19.603 に答える
0

あなたの場合、おそらく編集距離計算のようなものが機能しますが、より大きなテキストベースのドキュメントでほぼ重複を見つける必要がある場合は、 http://www.softcorporation.com/products/neardup/を試すことができます

于 2013-04-07T10:54:13.287 に答える