2010-11-18 29 views
8

私はこの質問が多くの時間を求められて知っている。 おおよその文字列マッチングに適したアルゴリズムについての提案が必要です。おおよその文字列一致

このアプリケーションは、具体的には会社名の照合のみを対象としています。

最大の課題は、おそらく会社名の部分と短い名前の部分です 例: 1. companyA pty ltdとcompanyA pty。 ltd。会社A対 2. WESエンジニアリング対W.E.S.エンジニアリング(非常にまれな存在)

あなたはLevenshtein編集距離が適切だと思いますか?

私ははい、レーベンシュタイン距離がこれに適しているC#

よろしく、 マックス

+0

私は、すべてのドットの文字を削除し、その後レーベンシュタイン距離を使用するつもりだと思います。 ちょうどノート、私は類似しているが、より速いlevenshtein、アルゴリズムsift3男の名前別のアルゴリズムを見つけた。とても興味深い。 – Max

答えて

14

使用できるさまざまな文字列距離メトリックがあります。

Jaro-Winklerをお勧めします。比較結果が個別の編集単位である編集距離とは異なり、JWは0-1のスコアを返します。これは特に適切な名前に適しています。またthis nice tutorialthis SO question.

を見て私はC#で働いていないが、ここでJWのいくつかの実装は、私はオンラインを発見された:

Impl 1(ファイルのリストを見れば彼らはあまりにもDOT NETのバージョンを持っている)

Impl 2


あなたはもう少し洗練されたマッチングを行いたい場合は、一般的に、会社名に出現する単語の形態のいくつかのカスタム正規化を行うために試すことができますあなたは

distance (normalize("foo corp."), normalize("FOO CORPORATION"))

を計算する場合には、そのようなltd/limited, inc/incorporated, corp/corporationとしてあなたはあなた場合はなるだろう何である(0ではなく14であることを、結果を取得する必要がありますなど、この方法の場合非感受性、略語を考慮するため計算されたレーベンシュタイン編集距離)。ただ、すべての非英数字を削除するこれらの単純な例では

+1

リンクをありがとう、彼らは非常に便利です – Max

1

を使用しています。少なくともあなたがリストしているすべての人に役立ちます。

また、おそらくSoundexを使用することができますが、私はあなたがそれを必要としないと思います。

1

は、あなたにマッチを与え、あなたはまっすぐを行い、それぞれの側にデータを事前に計算することができますとして行うのが最も簡単ですでしょう試合に等しいですクロス乗算と編集距離の計算よりもはるかに高速です。

+0

それは非常に興味深い提案です! – Max

0

私は別の質問では、すでに私の答えを提供してきました。

https://stackoverflow.com/a/30120166/2282794

私はあなたについて話している同様の名前の一致要件には本当に大規模なシステムに取り組んできました。 名前の一致はあまり簡単ではなく、姓と名の順番が異なる場合があります。 このようなシナリオでは、シンプルなファジー名マッチングアルゴリズムが悲惨に失敗します。

近似ストリングマッチングアルゴリズムについて話したいだけなら、多くのものがあります。 Jaro-Winkler、編集距離(Levenshtein)、Jaccard類似性、Soundex/Phoneticsベースのアルゴリズムなどです。単純なグーグルでは、すべての詳細がわかります。 C#ですべてを実装することができます

アイロニーは、指定された2つの入力文字列を一致させようとしている間に動作します。理論的には正しかったし、あいまいな、あるいはおおよその文字列マッチングの仕方を実証する。

しかし、大幅に過小評価されている点は、本番環境でどのように使用するのかです。おおよその文字列マッチングアルゴリズムのスカウトをしている人は誰も、それらがどのように本番環境で同じものを解決できるかを知っていませんでした。

私はちょうどJavaに固有のLuceneについて話したかもしれませんが、.NetのLuceneもあります。

https://lucenenet.apache.org/

関連する問題