ทรานสดิวเซอร์ของ Levenshtein ยอมรับคำค้นหาและส่งกลับคำศัพท์ทั้งหมดในพจนานุกรมที่มีข้อผิดพลาดในการสะกดคำอยู่ห่างจากคำนั้น ประกอบด้วยคลาสตัวแก้ไขการสะกดคำที่มีประสิทธิภาพสูง (พื้นที่ และ เวลา) ซึ่งทำงานได้ดีมากเมื่อคุณไม่ต้องการบริบทขณะให้คำแนะนำ ลืมการสแกนเชิงเส้นในพจนานุกรมของคุณเพื่อค้นหาคำศัพท์ทั้งหมดที่ใกล้เคียงกับคำค้นหาของผู้ใช้อย่างเพียงพอ โดยใช้การคำนวณกำลังสองของระยะทางเลเวนชไทน์หรือระยะทางดาเมเรา-เลเวนชไทน์ เด็กเหล่านี้จะค้นหาคำศัพท์ ทั้งหมด จากพจนานุกรมของคุณในเวลาเชิงเส้น บน ความยาวของคำค้นหา (ไม่ขึ้นอยู่กับขนาดของพจนานุกรม แต่ขึ้นอยู่กับความยาวของคำค้นหา)
หากคุณต้องการบริบท ให้นำตัวเลือกที่สร้างโดยทรานสดิวเซอร์เป็นจุดเริ่มต้น และเสียบเข้ากับโมเดลใดๆ ก็ตามที่คุณใช้เป็นบริบท (เช่น โดยการเลือกลำดับของคำศัพท์ที่มีความน่าจะเป็นไปได้สูงสุดที่จะปรากฏร่วมกัน)
สำหรับการสาธิตอย่างรวดเร็ว โปรดไปที่หน้า Github ที่นี่ นอกจากนี้ยังมีอินเทอร์เฟซบรรทัดคำสั่ง libblevenshtein-java-cli โปรดดู README.md สำหรับข้อมูลการได้มาและการใช้งาน
ปัจจุบันไลบรารีนี้เขียนด้วย Java, CoffeeScript และ JavaScript แต่ฉันจะย้ายไปยังภาษาอื่นเร็วๆ นี้ หากคุณมีภาษาเฉพาะที่คุณต้องการดูในภาษานั้น หรือระบบการจัดการแพ็คเกจที่คุณต้องการปรับใช้ โปรดแจ้งให้เราทราบ
สาขา | คำอธิบาย |
---|---|
ผู้เชี่ยวชาญ | ล่าสุดแหล่งพัฒนา |
ปล่อย | ล่าสุด, แหล่งเผยแพร่ |
ปล่อย-3.x | แหล่งเผยแพร่ล่าสุดสำหรับเวอร์ชัน 3.x |
ปล่อย-2.x | แหล่งเผยแพร่ล่าสุดสำหรับเวอร์ชัน 2.x |
ปัญหาได้รับการจัดการบน waffle.io ด้านล่างนี้คุณจะพบกราฟเกี่ยวกับอัตราที่ฉันปิดไว้
กรุณาเยี่ยมชม Bountysource เพื่อให้คำมั่นว่าจะสนับสนุนคุณสำหรับปัญหาที่กำลังดำเนินอยู่
เมื่อพูดถึงเอกสาร คุณมีหลายทางเลือก:
วิกิ
จาวาด็อก
ซอร์สโค้ด
libblevenshtein ได้รับการพัฒนากับ Java ≥ 1.8 มันจะไม่ทำงานกับเวอร์ชันก่อนหน้า
เพิ่มการพึ่งพา Maven บน Artifactory ตัวอย่างเช่น ในโปรเจ็กต์ Gradle คุณจะต้องแก้ไข repositories
ของคุณดังนี้:
ที่เก็บ { มาเวน { URL 'https://oss.jfrog.org/artifactory/oss-release-local' - -
เพิ่มการพึ่งพา Maven ในสิ่งใดสิ่งหนึ่งต่อไปนี้:
มาเวน เซ็นทรัล
เจเซ็นเตอร์
บินเทรย์
<การพึ่งพา> <groupId>com.github.universal-automata</groupId> <artifactId>liblevenshtein</artifactId> <เวอร์ชัน>3.0.0</เวอร์ชัน> </การพึ่งพา>
'com.github.universal-automata:libiblevenshtein:jar:3.0.0'
<การพึ่งพา org = "com.github.universal-automata" name = "liblevenshtein" rev = "3.0.0" />
@องุ่น( @Grab(group='com.github.universal-automata', module='liblevenshtein', version='3.0.0') -
คอมไพล์ 'com.github.universal-automata:liblevenshtein:3.0.0'
ไลบรารีการพึ่งพา += "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 (โปรดทราบว่าไฟล์มีหนึ่งคำต่อบรรทัด):
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;นำเข้า com.github.liblevenshtein.serialization.ProtobufSerializer;นำเข้า com.github.liblevenshtein.serialization.Serializer;นำเข้า com.github.liblevenshtein.transducer.Algorithm;นำเข้า com.github.liblevenshtein.transducer.Candidate;นำเข้า com.github.liblevenshtein.transducer.ITransducer;นำเข้า com.github.liblevenshtein.transducer.factory.TransducerBuilder;// ...final SortedDawg พจนานุกรม;เส้นทางสุดท้ายพจนานุกรมPath = Paths.get("/path/to/top-20-most-common-english-words.txt");try (final InputStream stream = Files.newInputStream(dictionaryPath)) { // ตัวสร้าง PlainTextSerializer ยอมรับตัวเลือกบูลีนที่ระบุ // ไม่ว่าพจนานุกรมจะถูกจัดเรียงตามพจนานุกรมแล้วจากน้อยไปหามากหรือไม่ // คำสั่ง. หากมีการเรียงลำดับ การผ่านค่าจริงจะช่วยเพิ่มประสิทธิภาพการก่อสร้าง // ของพจนานุกรม; คุณอาจส่งผ่านเท็จไม่ว่าพจนานุกรมจะเรียงลำดับหรือก็ตาม // ไม่ใช่ (นี่เป็นพฤติกรรมเริ่มต้นและปลอดภัยที่สุด หากคุณไม่รู้ว่า // พจนานุกรมถูกจัดเรียง) Serializer สุดท้าย serializer = PlainTextSerializer ใหม่ (เท็จ); พจนานุกรม = serializer.deserialize (SortedDawg.class, สตรีม); } ตัวแปลงสัญญาณ ITransducer สุดท้าย <Candidate> = TransducerBuilder ใหม่ () .พจนานุกรม(พจนานุกรม) .อัลกอริทึม(อัลกอริทึม.การขนส่ง) .defaultMaxDistance(2) .includeDistance(จริง) .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", "ของ") = [2]// | d("foo", "on") = [2]// | d("foo", "to") = [2]// | d("foo", "for") = [1]// | d("foo", "not") = [2]// | d("foo", "you") = [2]// +------------------------------------------------ ---------------------------------------------------// | การสะกดคำสำหรับคำค้นหา: "bar"// +-------------------------------------- ---------------------------------------------// | d("bar", "a") = [2]// | d("bar", "as") = [2]// | d("บาร์", "ที่") = [2]// | d("bar", "be") = [2]// | d("bar", "for") = [2]// ...
หากคุณต้องการทำให้พจนานุกรมของคุณเป็นอนุกรมเป็นรูปแบบที่อ่านง่ายในภายหลัง ให้ทำดังต่อไปนี้:
เส้นทางสุดท้าย serializedDictionaryPath = Paths.get("/path/to/top-20-most-common-english-words.protobuf.bytes"); ลอง (สตรีม OutputStream สุดท้าย = Files.newOutputStream (serializedDictionaryPath)) { สุดท้าย Serializer serializer = ใหม่ ProtobufSerializer(); serializer.serialize (พจนานุกรม, สตรีม); -
จากนั้น คุณสามารถอ่านพจนานุกรมได้ในภายหลัง เช่นเดียวกับที่คุณอ่านเวอร์ชันข้อความธรรมดา:
สุดท้าย SortedDawg deserializedDictionary; ลอง (สตรีม InputStream สุดท้าย = Files.newInputStream (serializedDictionaryPath)) { สุดท้าย Serializer serializer = new ProtobufSerializer (); deserializedDictionary = serializer.deserialize (SortedDawg.class, สตรีม); -
การทำให้เป็นอนุกรมไม่ได้จำกัดอยู่เพียงพจนานุกรมเท่านั้น คุณยังอาจ (ยกเลิก) ทรานสดิวเซอร์ได้อีกด้วย
โปรดดูวิกิสำหรับรายละเอียดเพิ่มเติม
ห้องสมุดนี้มีพื้นฐานมาจากผลงานของ Stoyan Mihov, Klaus Schulz และ Petar Nikolaev Mitankin: Fast String Correction with Levenshtein-Automata สำหรับข้อมูลเพิ่มเติม โปรดดูที่วิกิ
liblevenshtein-java ได้รับการดูแลโดย@dylon ([email protected])