Transduser Levenshtein menerima istilah kueri dan mengembalikan semua istilah dalam kamus yang berada dalam jarak n kesalahan ejaan darinya. Mereka merupakan kelas korektor ejaan yang sangat efisien (ruang dan waktu) yang bekerja sangat baik ketika Anda tidak memerlukan konteks saat memberikan saran. Lupakan melakukan pemindaian linier pada kamus Anda untuk menemukan semua istilah yang cukup dekat dengan kueri pengguna, menggunakan implementasi kuadrat jarak Levenshtein atau jarak Damerau-Levenshtein, bayi-bayi ini menemukan semua istilah dari kamus Anda dalam waktu linier di panjang istilah kueri (bukan pada ukuran kamus, pada panjang istilah kueri).
Jika Anda memerlukan konteks, ambillah kandidat yang dihasilkan oleh transduser sebagai titik awal, dan masukkan kandidat tersebut ke dalam model apa pun yang Anda gunakan untuk konteksnya (misalnya dengan memilih urutan istilah yang memiliki kemungkinan terbesar untuk muncul bersamaan).
Untuk demonstrasi singkat, silakan kunjungi Halaman Github, di sini. Ada juga antarmuka baris perintah, liblevenshtein-java-cli. Silakan lihat README.md untuk informasi akuisisi dan penggunaan.
Perpustakaan saat ini ditulis dalam Java, CoffeeScript, dan JavaScript, tetapi saya akan segera memindahkannya ke bahasa lain. Jika Anda memiliki bahasa tertentu yang ingin Anda gunakan, atau sistem manajemen paket yang Anda inginkan untuk menerapkannya, beri tahu saya.
Cabang | Keterangan |
---|---|
menguasai | Terbaru, sumber pengembangan |
melepaskan | Terbaru, sumber rilis |
rilis-3.x | Terbaru, sumber rilis untuk versi 3.x |
rilis-2.x | Terbaru, sumber rilis untuk versi 2.x |
Masalah dikelola di waffle.io. Di bawah ini Anda akan menemukan grafik tingkat penutupan saya.
Silakan kunjungi Bountysource untuk menjanjikan dukungan Anda terhadap masalah yang sedang berlangsung.
Terkait dokumentasi, Anda memiliki beberapa opsi:
Wiki
Javadoc
Kode Sumber
liblevenshtein telah dikembangkan terhadap Java ≥ 1.8. Ini tidak akan berfungsi dengan versi sebelumnya.
Tambahkan ketergantungan Maven pada Artifactory. Misalnya, dalam proyek Gradle, Anda akan memodifikasi repositories
sebagai berikut:
repositori { pakar { url 'https://oss.jfrog.org/artifactory/oss-release-local' } }
Tambahkan ketergantungan Maven pada salah satu hal berikut:
Pusat Maven
JCenter
binray
<ketergantungan> <groupId>com.github.universal-automata</groupId> <artifactId>libblevenshtein</artifactId> <versi>3.0.0</versi> </ketergantungan>
'com.github.universal-automata:liblevenshtein:jar:3.0.0'
<dependency org="com.github.universal-automata" name="liblevenshtein" rev="3.0.0" />
@Anggur( @Grab(group='com.github.universal-automata', module='liblevenshtein', version='3.0.0') )
kompilasi 'com.github.universal-automata:liblevenshtein:3.0.0'
perpustakaanDependensi += "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
Katakanlah Anda memiliki konten berikut dalam file teks biasa bernama, top-20-most-common-english-words.txt (perhatikan bahwa file tersebut memiliki satu istilah per baris):
the be to of and a in that have I it for not on with he as you do at
Berikut ini memberi Anda cara untuk menanyakan kontennya:
impor java.io.InputStream;impor java.io.OutputStream;impor java.nio.file.Files;impor java.nio.file.Path;impor java.nio.file.Paths;impor com.github.liblevenshtein.collection. kamus.SortedDawg;import 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. transduser.ITransduser;impor com.github.liblevenshtein.transducer.factory.TransducerBuilder;// ... kamus SortedDawg terakhir; kamus Jalur terakhirPath = Paths.get("/path/to/top-20-most-common-english-words.txt") ;try (final InputStream stream = Files.newInputStream(dictionaryPath)) { // Konstruktor PlainTextSerializer menerima penentuan boolean opsional // apakah kamus sudah diurutkan secara leksikografis, dalam urutan menaik // memesan. Jika sudah diurutkan, maka passing true akan mengoptimalkan konstruksinya // dari kamus; Anda mungkin memberikan false apakah kamus diurutkan atau // tidak (ini adalah perilaku default dan teraman jika Anda tidak tahu apakah // kamus diurutkan). serializer serializer terakhir = PlainTextSerializer baru (false); kamus = serializer.deserialize(SortedDawg.class, stream); }transduser ITransduser<Kandidat> terakhir = TransduserBuilder baru() .kamus(kamus) .algorithm(Algorithm.TRANSPOSITION) .defaultMaxJarak(2) .includeDistance(benar) .build();for (String terakhir queryTerm : new String[] {"foo", "bar"}) { System.out.println("+---------------- --------------------------------------------------- -------------"); System.out.printf("| Ejaan Kandidat untuk Istilah Kueri: "%s"%n", queryTerm); System.out.println("+------------------------------------------ -------------------------------------"); for (Calon kandidat akhir : transducer.transduce(queryTerm)) {System.out.printf("| d("%s", "%s") = [%d]%n", queryTerm, kandidat.term() , kandidat.jarak()); } }// +----------------------------------------------- ------------------// | Kandidat Ejaan untuk Istilah Kueri: "foo"// +-------------------------------------- --------------------------// | d("foo", "lakukan") = [2]// | d("foo", "dari") = [2]// | d("foo", "pada") = [2]// | d("foo", "ke") = [2]// | d("foo", "untuk") = [1]// | d("foo", "tidak") = [2]// | d("foo", "kamu") = [2]// +--------------------------------- -------------------------------// | Kandidat Ejaan untuk Istilah Kueri: "bar"// +-------------------------------------- --------------------------// | d("bilah", "a") = [2]// | d("bilah", "sebagai") = [2]// | d("batang", "pada") = [2]// | d("batang", "menjadi") = [2]// | d("batang", "untuk") = [2]// ...
Jika Anda ingin membuat serial kamus Anda ke format yang mudah dibaca nanti, lakukan hal berikut:
jalur terakhir serializedDictionaryPath = Paths.get("/path/ke/top-20-most-common-english-words.protobuf.bytes");coba (aliran OutputStream akhir = Files.newOutputStream(serializedDictionaryPath)) { final Serializer serializer = ProtobufSerializer baru(); serializer.serialize(kamus, aliran); }
Kemudian, Anda dapat membaca kamusnya nanti, sama seperti Anda membaca versi teks biasa:
final SortedDawg deserializedDictionary;coba (final InputStream stream = Files.newInputStream(serializedDictionaryPath)) { final Serializer serializer = new ProtobufSerializer(); deserializedDictionary = serializer.deserialize(SortedDawg.class, streaming); }
Serialisasi tidak terbatas pada kamus, Anda juga dapat (membatalkan) serialisasi transduser.
Silakan lihat wiki untuk lebih jelasnya.
Perpustakaan ini sebagian besar didasarkan pada karya Stoyan Mihov, Klaus Schulz, dan Petar Nikolaev Mitankin: Fast String Correction with Levenshtein-Automata. Untuk informasi lebih lanjut, silakan lihat wiki.
liblevenshtein-java dikelola oleh@dylon ([email protected])