レーベンシュタイン トランスデューサーはクエリ用語を受け入れ、その用語から n スペル ミス以内にある辞書内のすべての用語を返します。これらは、提案を行う際にコンテキストを必要としない場合に非常にうまく機能する、(空間と時間の) 効率の高いスペル修正クラスを構成します。 レーベンシュタイン距離またはダメラウ・レーベンシュタイン距離の二次実装を使用して、ユーザーのクエリに十分近いすべての用語を見つけるために辞書に対して線形スキャンを実行することは忘れてください。これらの赤ちゃんは、線形時間で辞書からすべての用語を見つけます。クエリ用語の長さ(辞書のサイズではなく、クエリ用語の長さ)。
コンテキストが必要な場合は、トランスデューサーによって生成された候補を出発点として、コンテキストに使用しているモデルにそれらを接続します (一緒に出現する可能性が最も高い用語のシーケンスを選択するなど)。
簡単なデモンストレーションについては、こちらの Github ページにアクセスしてください。コマンドライン インターフェイス liblevenshtein-java-cli もあります。入手および使用方法については、README.md を参照してください。
このライブラリは現在 Java、CoffeeScript、JavaScript で書かれていますが、近いうちに他の言語に移植する予定です。 使用したい特定の言語、または展開したいパッケージ管理システムがある場合は、お知らせください。
支店 | 説明 |
---|---|
マスター | 最新の開発ソース |
リリース | 最新のリリースソース |
リリース-3.x | バージョン 3.x の最新のリリース ソース |
リリース-2.x | バージョン 2.x の最新のリリース ソース |
問題は waffle.io で管理されます。 以下に私が成約した割合のグラフを示します。
Bountysource にアクセスして、進行中の問題へのサポートを誓約してください。
ドキュメントに関しては、いくつかのオプションがあります。
ウィキ
Javadoc
ソースコード
liblevenshtein は Java 1.8 以上を対象として開発されました。以前のバージョンでは動作しません。
Artifactory に Maven 依存関係を追加します。 たとえば、Gradle プロジェクトでは、 repositories
次のように変更します。
リポジトリ { メイブン { URL 'https://oss.jfrog.org/artifactory/oss-release-local' } }
次のいずれかに Maven 依存関係を追加します。
メイブン・セントラル
Jセンター
ビントレイ
<依存関係> <groupId>com.github.universal-automata</groupId> <artifactId>リブレヴェンシュタイン</artifactId> <バージョン>3.0.0</バージョン> </依存関係>
「com.github.universal-automata:liblevenshtein:jar:3.0.0」
<dependency org="com.github.universal-automata" name="liblevenshtein" rev="3.0.0" />
@ぶどう( @Grab(グループ='com.github.universal-automata'、モジュール='liblevenshtein'、バージョン='3.0.0') )
「com.github.universal-automata:liblevenshtein:3.0.0」をコンパイルします
libraryDependency += "com.github.universal-automata" % "liblevenshtein" % "3.0.0"
[com.github.universal-automata/liblevenshtein "3.0.0"]
% git clone --progress [email protected]:universal-automata/liblevenshtein-java.git Cloning into 'liblevenshtein-java'... remote: Counting objects: 8117, done. remote: Compressing objects: 100% (472/472), done. remote: Total 8117 (delta 352), reused 0 (delta 0), pack-reused 7619 Receiving objects: 100% (8117/8117), 5.52 MiB | 289.00 KiB/s, done. Resolving deltas: 100% (5366/5366), done. Checking connectivity... done. % cd liblevenshtein-java % git pull --progress Already up-to-date. % git fetch --progress --tags % git checkout --progress 3.0.0 Note: checking out '3.0.0'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at 4f0f172... pushd and popd silently % git submodule init % git submodule update
top-20-most-common-english-words.txt というプレーン テキスト ファイルに次のコンテンツがあるとします (ファイルには 1 行に 1 つの用語が含まれていることに注意してください)。
the be to of and a in that have I it for not on with he as you do at
以下は、そのコンテンツをクエリする方法を提供します。
インポート java.io.InputStream;インポート java.io.OutputStream;インポート java.nio.file.Files;インポート java.nio.file.Path;インポート java.nio.file.Paths;インポート com.github.liblevenshtein.collection. Dictionary.SortedDawg;インポートcom.github.liblevenshtein.serialization.PlainTextSerializer;import com.github.liblevenshtein.serialization.ProtobufSerializer;import com.github.liblevenshtein.serialization.Serializer;import com.github.liblevenshtein.transducer.Algorithm;import com.github.liblevenshtein.transducer.Candidate;import com.github.liblevenshtein.transducer.ITransducer;import com.github.liblevenshtein.transducer.factory.TransducerBuilder;// ...最終的な SortedDawg 辞書;最終的なパス辞書Path = Paths.get("/path/to/top-20-most-common-english-words.txt");try (final InputStream stream = Files.newInputStream(dictionaryPath)) { // PlainTextSerializer コンストラクターは、オプションのブール値指定を受け入れます // 辞書がすでに辞書順に昇順にソートされているかどうか // 注文。 ソートされている場合は、true を渡すと構築が最適化されます。 // 辞書の;辞書がソートされているかどうかに関係なく、 false を渡すことができます。 // そうではありません (これがデフォルトであり、 // 辞書はソートされます)。 最終シリアライザーserializer = new PlainTextSerializer(false); Dictionary =serializer.deserialize(SortedDawg.class, stream); }最終 ITransducer<候補> トランスデューサー = new TransducerBuilder() .dictionary(辞書) .algorithm(アルゴリズム.TRANSPOSITION) .defaultMaxDistance(2) .includeDistance(true) .build();for (final String queryTerm : new String[] {"foo", "bar"}) { System.out.println("+----------------) -------------------------------------------------- -------------"); System.out.printf("| クエリ用語のスペル候補: "%s"%n", queryTerm); System.out.println("+------------------------------------------ -------------------------------------"); for (最終候補候補 : transducer.transduce(queryTerm)) {System.out.printf("| d("%s", "%s") = [%d]%n", queryTerm,candidate.term() 、候補.距離()); } }// +---------------------------------------------- ---------------------------------// |クエリ用語のスペル候補: "foo"// +-------------------------------------- ---------------------------------------// | d("foo", "do") = [2]// | d("foo", "of") = [2]// | d("foo", "on") = [2]// | d("foo", "to") = [2]// | d("foo", "for") = [1]// | d("foo", "not") = [2]// | d("foo", "you") = [2]// +--------------------------------- ------------------------------------------------// |クエリ用語のスペル候補: "bar"// +-------------------------------------- ---------------------------------------// | d("バー", "a") = [2]// | d("バー", "as") = [2]// | d("バー", "アット") = [2]// | d("バー", "be") = [2]// | d("バー", "for") = [2]// ...
辞書を後で読みやすい形式にシリアル化する場合は、次の手順を実行します。
Final Path generatedDictionaryPath = Paths.get("/path/to/top-20-most-common-english-words.protobuf.bytes");try (final OutputStream stream = Files.newOutputStream(serializedDictionaryPath)) {final Serializer シリアライザー =新しい ProtobufSerializer(); serializer.serialize(辞書, ストリーム); }
その後、プレーン テキスト バージョンを読むのとほぼ同じ方法で、後で辞書を読むことができます。
Final SortedDawg deserializedDictionary;try (final InputStream stream = Files.newInputStream(serializedDictionaryPath)) {final Serializer シリアライザー = new ProtobufSerializer(); deserializedDictionary = Serializer.deserialize(SortedDawg.class, stream); }
シリアル化は辞書に限定されず、トランスデューサーをシリアル化 (非) することもできます。
詳細については wiki を参照してください。
このライブラリは主に、Stoyan Mitov、Klaus Schulz、Petar Nikolaev Mitankin: Fast String Correction with Levenshtein-Automata の著作に基づいています。詳細については、ウィキを参照してください。
liblevenshtein-java は @dylon ([email protected]) によって保守されています。