From 0b453d189cc62de68e13817717a980ec84266559 Mon Sep 17 00:00:00 2001 From: Daniil Demidko Date: Sun, 10 Oct 2021 18:43:11 +1000 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20=D0=BF=D0=B0?= =?UTF-8?q?=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=20+=20=D1=80=D0=B5=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle.yml | 4 +- README.md | 71 ++++++++++--------- build.gradle.kts | 7 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../com/github/demidko/aot/BitReader.java | 2 +- .../com/github/demidko/aot/BitWriter.java | 2 +- .../java/com/github/demidko/aot/Bytecode.java | 2 +- .../java/com/github/demidko/aot/Flexion.java | 3 + .../github/demidko/aot/HashDictionary.java | 28 ++++---- .../java/com/github/demidko/aot/Matchers.java | 32 ++++----- .../java/com/github/demidko/aot/Word.java | 3 + .../github/demidko/aot/WordformMeaning.java | 5 +- .../demidko/aot/WordformMeaningTest.java | 20 ++++-- 13 files changed, 100 insertions(+), 81 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index ebd56c1..baad5c9 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -16,10 +16,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 16 + - name: Set up JDK 17 uses: actions/setup-java@v2 with: - java-version: '16' + java-version: '17' distribution: 'adopt' - name: Grant execute permission for gradlew run: chmod +x gradlew diff --git a/README.md b/README.md index b65f0ca..b75563a 100644 --- a/README.md +++ b/README.md @@ -20,45 +20,48 @@ Java библиотека для быстрого (!) получения лем ## Как использовать? ```java +import java.io.IOException; import static java.lang.System.out; import static com.github.demidko.aot.WordformMeaning.lookupForMeanings; +import java.io.IOException; + class Example { - public static void main(String[] args) { - var meanings = lookupForMeanings("люди"); - - out.println(meanings.size()); - /* 1 */ - - out.println(meanings.get(0).getMorphology()); - /* [С, мр, им, мн] */ - - out.println(meanings.get(0).getLemma()); - /* человек */ - - for (var t : meanings.get(0).getTransformations()) { - out.println(t.toString() + " " + t.getMorphology()); - /* - * человек [С, мр, им, ед] - * человека [рд, С, мр, ед] - * человеку [С, мр, ед, дт] - * человека [С, мр, ед, вн] - * человеком [тв, С, мр, ед] - * человеке [С, мр, ед, пр] - * люди [С, мр, им, мн] - * людей [рд, С, мр, мн] - * человек [рд, С, мр, мн] - * людям [С, мр, мн, дт] - * человекам [С, мр, мн, дт] - * людей [С, мр, мн, вн] - * людьми [тв, С, мр, мн] - * человеками [тв, С, мр, мн] - * людях [С, мр, мн, пр] - * человеках [С, мр, мн, пр] - */ - } - } + public static void main(String[] args) throws IOException { + + var meanings = lookupForMeanings("люди"); + out.println(meanings.size()); + /* 1 */ + + out.println(meanings.get(0).getMorphology()); + /* [С, мр, им, мн] */ + + out.println(meanings.get(0).getLemma()); + /* человек */ + + for (var t : meanings.get(0).getTransformations()) { + out.println(t.toString() + " " + t.getMorphology()); + /* + * человек [С, мр, им, ед] + * человека [рд, С, мр, ед] + * человеку [С, мр, ед, дт] + * человека [С, мр, ед, вн] + * человеком [тв, С, мр, ед] + * человеке [С, мр, ед, пр] + * люди [С, мр, им, мн] + * людей [рд, С, мр, мн] + * человек [рд, С, мр, мн] + * людям [С, мр, мн, дт] + * человекам [С, мр, мн, дт] + * людей [С, мр, мн, вн] + * людьми [тв, С, мр, мн] + * человеками [тв, С, мр, мн] + * людях [С, мр, мн, пр] + * человеках [С, мр, мн, пр] + */ + } + } } ``` diff --git a/build.gradle.kts b/build.gradle.kts index ba2153f..082014a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,16 +6,19 @@ plugins { `maven-publish` } dependencies { - testImplementation("org.junit.jupiter:junit-jupiter:5.7.2") + testImplementation("org.junit.jupiter:junit-jupiter:5.8.1") testImplementation("org.hamcrest:hamcrest:2.2") } tasks.test { + minHeapSize = "1024m" + maxHeapSize = "2048m" useJUnitPlatform() } publishing { publications { - create("library") { + create("aot") { groupId = "com.github.demidko" + artifactId = "aot" from(components["java"]) } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0f80bbf..ffed3a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/github/demidko/aot/BitReader.java b/src/main/java/com/github/demidko/aot/BitReader.java index b1a6a07..5e906ec 100644 --- a/src/main/java/com/github/demidko/aot/BitReader.java +++ b/src/main/java/com/github/demidko/aot/BitReader.java @@ -7,7 +7,7 @@ /** * Класс предназначен для побитового чтения из примитивов */ -public class BitReader { +class BitReader { private final BitSet bs; private int pos = -1; diff --git a/src/main/java/com/github/demidko/aot/BitWriter.java b/src/main/java/com/github/demidko/aot/BitWriter.java index 2f45073..78f1972 100644 --- a/src/main/java/com/github/demidko/aot/BitWriter.java +++ b/src/main/java/com/github/demidko/aot/BitWriter.java @@ -7,7 +7,7 @@ /** * Класс предназначен для побитовой записи в примитивы */ -public class BitWriter { +class BitWriter { private final BitSet bs; private int pos = -1; diff --git a/src/main/java/com/github/demidko/aot/Bytecode.java b/src/main/java/com/github/demidko/aot/Bytecode.java index 6cc6ea2..e6582d8 100644 --- a/src/main/java/com/github/demidko/aot/Bytecode.java +++ b/src/main/java/com/github/demidko/aot/Bytecode.java @@ -3,7 +3,7 @@ /** * Класс хранит константы байткода */ -public final class Bytecode { +final class Bytecode { public static final byte endOfCompiledLine = 100; diff --git a/src/main/java/com/github/demidko/aot/Flexion.java b/src/main/java/com/github/demidko/aot/Flexion.java index bdd1233..ac70b80 100644 --- a/src/main/java/com/github/demidko/aot/Flexion.java +++ b/src/main/java/com/github/demidko/aot/Flexion.java @@ -7,7 +7,10 @@ /** * Словоформа исходной леммы + * + * @deprecated лучше используйте современный API из {@link WordformMeaning} */ +@Deprecated public class Flexion { // оптимизация diff --git a/src/main/java/com/github/demidko/aot/HashDictionary.java b/src/main/java/com/github/demidko/aot/HashDictionary.java index d1c5120..decb838 100644 --- a/src/main/java/com/github/demidko/aot/HashDictionary.java +++ b/src/main/java/com/github/demidko/aot/HashDictionary.java @@ -16,6 +16,10 @@ import java.util.Map.Entry; import java.util.zip.GZIPInputStream; +/** + * @deprecated лучше используйте высокоуровневый API из {@link WordformMeaning} + */ +@Deprecated public class HashDictionary { final MorphologyTag[][] allMorphologyTags; @@ -152,29 +156,21 @@ private List filterLemmasIds(int[] refs, String query) { * HashDictionary#getLemmaTags(int)} можно получить морфологию для каждой леммы каждого смысла. При помощи {@link * HashDictionary#fexionsSize(int)} можно получить количество всех слов каждой леммы. */ - public List> lookupForFlexions(String query) { + List> lookupForFlexions(String query) { query = query.toLowerCase().replace('ё', 'е'); int[] ids = refs.get(query.hashCode()); - return ids == null ? emptyList() : filterLemmasAndFlexionsIds(ids, query); + return ids == null ? emptyList() : filterLemmasAndFlexionIds(ids, query); } - private List> filterLemmasAndFlexionsIds(int[] refs, String query) { + private List> filterLemmasAndFlexionIds(int[] refs, String query) { List> res = new ArrayList<>(); - for (int ref : refs) { - int flexionId = getFlexionId(lemmas[ref], query); - if (flexionId != -1) { - res.add(new SimpleImmutableEntry<>(ref, flexionId)); + for (int lemmaId : refs) { + for (int flexionIdx = 0; flexionIdx < fexionsSize(lemmaId); ++flexionIdx) { + if (getFlexionString(lemmaId, flexionIdx).equals(query)) { + res.add(new SimpleImmutableEntry<>(lemmaId, flexionIdx)); + } } } return res; } - - private int getFlexionId(int[] lemma, String query) { - for (int i = 0; i < lemma.length; i += 2) { - if (allFlexionStrings[lemma[i]].equals(query)) { - return i; - } - } - return -1; - } } diff --git a/src/main/java/com/github/demidko/aot/Matchers.java b/src/main/java/com/github/demidko/aot/Matchers.java index 0855e10..2d94601 100644 --- a/src/main/java/com/github/demidko/aot/Matchers.java +++ b/src/main/java/com/github/demidko/aot/Matchers.java @@ -2,26 +2,26 @@ import java.util.function.Predicate; - +@Deprecated public final class Matchers { - public static Predicate tags(MorphologyTag... tags) { - return flexion -> flexion.hasAllOf(tags); - } + public static Predicate tags(MorphologyTag... tags) { + return flexion -> flexion.hasAllOf(tags); + } - public static Predicate partOfSpeech(PartOfSpeech pos) { - return flexion -> flexion.getPartOfSpeech() == pos; - } + public static Predicate partOfSpeech(PartOfSpeech pos) { + return flexion -> flexion.getPartOfSpeech() == pos; + } - public static Predicate string(String str) { - return flexion -> flexion.toString().equals(str); - } + public static Predicate string(String str) { + return flexion -> flexion.toString().equals(str); + } - public static Predicate has(Predicate predicate) { - return predicate; - } + public static Predicate has(Predicate predicate) { + return predicate; + } - public static Predicate not(Predicate predicate) { - return predicate.negate(); - } + public static Predicate not(Predicate predicate) { + return predicate.negate(); + } } diff --git a/src/main/java/com/github/demidko/aot/Word.java b/src/main/java/com/github/demidko/aot/Word.java index eee30b5..6234871 100644 --- a/src/main/java/com/github/demidko/aot/Word.java +++ b/src/main/java/com/github/demidko/aot/Word.java @@ -10,7 +10,10 @@ /** * Морфологические данные смысла слова (их, и соответственно объектов Word, может быть несколько, как зАмок-строение, * зАмок-запор и замОк-промок) + * + * @deprecated лучше используйте API {@link WordformMeaning} */ +@Deprecated public class Word { private final List flexions; diff --git a/src/main/java/com/github/demidko/aot/WordformMeaning.java b/src/main/java/com/github/demidko/aot/WordformMeaning.java index 380abbd..4990583 100644 --- a/src/main/java/com/github/demidko/aot/WordformMeaning.java +++ b/src/main/java/com/github/demidko/aot/WordformMeaning.java @@ -71,9 +71,8 @@ public List getMorphology() { * @return Варианты трансформации словоформы по правилам русского языка, всевозможные склонения, спряжения и т. д. */ public List getTransformations() { - int size = dictionary.fexionsSize(lemmaId); - WordformMeaning[] res = new WordformMeaning[size]; - for (int i = 0; i < size; ++i) { + WordformMeaning[] res = new WordformMeaning[dictionary.fexionsSize(lemmaId)]; + for (int i = 0; i < res.length; ++i) { res[i] = new WordformMeaning(lemmaId, i); } return asList(res); diff --git a/src/test/java/com/github/demidko/aot/WordformMeaningTest.java b/src/test/java/com/github/demidko/aot/WordformMeaningTest.java index a5f5143..c02369e 100644 --- a/src/test/java/com/github/demidko/aot/WordformMeaningTest.java +++ b/src/test/java/com/github/demidko/aot/WordformMeaningTest.java @@ -8,7 +8,6 @@ import java.io.IOException; import java.util.List; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -17,7 +16,20 @@ class WordformMeaningTest { @Test void lookupForMeaningsTest() throws IOException { List meanings = lookupForMeanings("замок"); - assertThat(meanings.size(), equalTo(2)); + + for (WordformMeaning x : meanings) { + System.out.println(x.getLemma().getId() + " -> " + x + x.getMorphology()); + } + + /* + * замок может означать + * 1. замок-строение (увидел что? - средневековый замок) + * 2. замок-запор (увидел что? - замок на двери) + * 3. замок-строение (купил кого? - средневековый замок) + * 4. замок-замор (купил кого? - замок на дверь) + * 5. замок-промок (что случилось? - замок под дождем) + */ + assertThat(meanings.size(), equalTo(5)); assertThat( meanings.get(0) @@ -27,7 +39,7 @@ void lookupForMeaningsTest() throws IOException { ); assertThat( - meanings.get(1) + meanings.get(4) .getLemma() .toString(), equalTo("замокнуть") @@ -51,7 +63,7 @@ void lookupForMeaningsTest() throws IOException { // а вот если для двух смыслов отличается хотя бы одна словоформа или хотя бы одна морфология, то словарь их разделит assertThat( - meanings.get(1) + meanings.get(4) .getTransformations() .stream() .map(WordformMeaning::toString)