私は高性能なJavaライブラリを探しています。
同様の文字列、レーベンシュタイン距離、Daitch-Mokotoff Soundex、n-gramなどを見つけるための多くのアルゴリズムがあります。
Java実装が存在しますか?実装の長所と短所はありますか?Lucene、他のソリューション、またはLuceneが最適ですか?
私はこれらを見つけました、誰かがそれらを使った経験がありますか?
Commons Langには、 レーベンシュタイン距離 の実装があります。
Apache Luceneを使用できますが、ユースケースによってはこれが重すぎる可能性があります。非常に単純なファジー検索では、使用するのが少し複雑になる場合があります(間違っている場合は修正してください)。インデックスを作成する必要があります。
簡単なオンライン(=インデックスを維持しない)アルゴリズムが必要な場合は、ファジー Bitapアルゴリズム を使用できます。私はJava here で実装を見つけました。これは、ほとんど自己説明的なシグネチャを持つ単一の比較的短いメソッドに収まるコードです。
public static List<Integer> find(String doc, String pattern, int k)
Apache Commons StringUtils
には、ファジー文字列マッチングのためのレーベンシュタインアルゴリズムの実装があります。 String.equals
のファジーバージョンとして見ることができます。BitapはString.indexOf
のファジーバージョンに似ており、まだレーベンシュタイン距離測定を使用しています。通常、Levenshteinを単純に使用して、検索パターンと一致する可能性のある各部分文字列を比較するよりも効率的です。
注:
ArrayIndexOutOfBoundsException
をスローするため、これらを除外する必要があります。名前でメモリ内の人のリストを検索するアプリケーションでBimapを使用してみました。レーベンシュタイン距離が2の場合、誤検出が多すぎることがわかりました。 Levenhsteinの距離1はより効果的ですが、2つの文字を入れ替えるタイプミスを検出できません。 「ウィリアム」と「ウィラム」。これを解決するいくつかの方法を考えることができます。
ArrayIndexOutOfBoundsException
2または4を実行する場合は、とにかくLuceneのような適切なフルテキスト検索ライブラリを使用した方が良い場合があります。
BitapOnlineSearcher
と呼ばれる Javaでの実装 を作成しましたが、Java.io.Reader
をAlphabetクラスと一緒に使用する必要があります。 Javadocはロシア語で書かれています。主に短い文字列を比較していて、ポータブルで軽量なものが必要な場合は、よく知られているpython algorithm fuzzywuzzy ported to Java を使用できます。
詳しくはこちらをご覧ください こちら
SimMetricsはおそらく必要なものです: http://sourceforge.net/projects/simmetrics/
編集距離のさまざまなフレーバーを計算するためのいくつかのアルゴリズムがあります。
Luceneは非常に強力な全文検索エンジンですが、FT検索はファジー文字列一致とまったく同じものではありません(たとえば、文字列のリストから、ある候補文字列に最も近いものを見つけることができます)。
LuceneにSOLRを追加します http://wiki.Apache.org/solr/AnalyzersTokenizersTokenFilters
Completely ライブラリを試すことができます。これは、テキスト前処理に依存してメモリ内インデックスを作成し、大規模なデータセットで(ファジー)検索に効率的に応答します。 Luceneやその他のフル機能のテキスト検索ライブラリとは異なり、APIは小さくて簡単に開始できます。
Bitapを試すことができます。私はANSI Cで書かれたbitapで遊んでいましたが、Java http://www.crosswire.org で実装されています。
Apache Lucene が唯一の方法だと思います。より良い検索ライブラリは知りません。
Apache Lucene(TM)は、完全にJavaで記述された高性能でフル機能のテキスト検索エンジンライブラリです。これは、フルテキスト検索を必要とするほぼすべてのアプリケーション、特にクロスプラットフォームに適したテクノロジーです。