Levenshtein 변환기는 쿼리 용어를 수락하고 n 철자 오류 내에 있는 사전의 모든 용어를 반환합니다. 이는 제안을 하는 동안 컨텍스트가 필요하지 않을 때 매우 잘 작동하는 매우 효율적인(공간 및 시간) 철자 교정기 클래스를 구성합니다. Levenshtein 거리 또는 Damerau-Levenshtein 거리의 2차 구현을 사용하여 사용자의 쿼리에 충분히 가까운 모든 용어를 찾기 위해 사전에 대한 선형 스캔을 수행하는 것을 잊어버리세요. 이 아기들은 선형 시간에 사전의 모든 용어를 찾습니다 . 쿼리 용어의 길이 (사전의 크기가 아니라 쿼리 용어의 길이에 따라 다름)
컨텍스트가 필요한 경우 변환기에서 생성된 후보를 출발점으로 삼아 컨텍스트에 사용 중인 모델에 연결합니다(예: 함께 나타날 확률이 가장 높은 용어 시퀀스 선택).
빠른 데모를 보려면 여기 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'
<종속성 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라는 일반 텍스트 파일에 다음 콘텐츠가 있다고 가정해 보겠습니다. 파일에는 한 줄에 하나의 용어가 있습니다.
the be to of and a in that have I it for not on with he as you do at
다음은 해당 콘텐츠를 쿼리하는 방법을 제공합니다.
import java.io.InputStream;import java.io.OutputStream;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import com.github.liblevenshtein.collection. Dictionary.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. transducer.ITransducer;가져오기 com.github.liblevenshtein.transducer.factory.TransducerBuilder;// ...최종 SortedDawg 사전;최종 경로 DictionaryPath = Paths.get("/path/to/top-20-most-common-english-words.txt") ;try (최종 InputStream 스트림 = Files.newInputStream(dictionaryPath)) { // PlainTextSerializer 생성자는 다음을 지정하는 선택적 부울을 허용합니다. // 사전이 이미 사전순으로 오름차순으로 정렬되어 있는지 여부 // 주문하다. 정렬된 경우 true를 전달하면 구성이 최적화됩니다. // 사전의; 사전이 정렬되었는지 여부에 관계없이 false를 전달할 수 있습니다. // 아닙니다(이것은 기본적이고 가장 안전한 동작입니다. // 사전이 정렬됩니다). final Serializer serializer = new PlainTextSerializer(false); Dictionary = serializer.deserialize(SortedDawg.class, stream); }final ITransducer<Candidate> 변환기 = 새로운 TransducerBuilder() .dictionary(사전) .algorithm(알고리즘.TRANSPOSITION) .defaultMaxDistance(2) .includeDistance(참) .build();for (최종 문자열 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", "당신") = [2]// +--------------------------------- --------------------// | 검색어에 대한 철자 후보: "bar"// +------------------------- ----------------------------// | d("바", "a") = [2]// | d("bar", "as") = [2]// | d("바", "at") = [2]// | d("바", "베") = [2]// | d("bar", "for") = [2]// ...
나중에 읽기 쉬운 형식으로 사전을 직렬화하려면 다음을 수행하세요.
final Path serializedDictionaryPath = Paths.get("/path/to/top-20-most-common-english-words.protobuf.bytes");try (최종 OutputStream 스트림 = Files.newOutputStream(serializedDictionaryPath)) { final Serializer serializer = 새로운 ProtobufSerializer(); serializer.serialize(사전, 스트림); }
그런 다음 일반 텍스트 버전을 읽는 것과 거의 같은 방식으로 나중에 사전을 읽을 수 있습니다.
final SortedDawg deserializedDictionary;try (최종 InputStream 스트림 = Files.newInputStream(serializedDictionaryPath)) { final Serializer serializer = new ProtobufSerializer(); deserializedDictionary = serializer.deserialize(SortedDawg.class, stream); }
직렬화는 사전에만 국한되지 않고 변환기를 (역)직렬화할 수도 있습니다.
자세한 내용은 위키를 참조하세요.
이 라이브러리는 주로 Stoyan Mihov, Klaus Schulz 및 Petar Nikolaev Mitankin의 작업: Levenshtein-Automata를 사용한 빠른 문자열 수정을 기반으로 합니다. 자세한 내용은 위키를 참조하세요.
liblevenshtein-java는 @dylon([email protected])에 의해 관리됩니다.