From f8ec85d5a5bcc2625e08dbe14998d565acd7199f Mon Sep 17 00:00:00 2001 From: Daniil Demidko Date: Mon, 18 Oct 2021 21:50:57 +1000 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=8B=D0=BF=D0=B8=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=83=D1=81=D1=82=D0=B0=D1=80=D0=B5=D0=B2=D1=88=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=BD=D0=B8=D0=B7=D0=BA=D0=BE=D1=83=D1=80=D0=BE=D0=B2=D0=BD?= =?UTF-8?q?=D0=B5=D0=B2=D1=8B=D0=B9=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../java/com/github/demidko/aot/Flexion.java | 74 -------- .../github/demidko/aot/HashDictionary.java | 176 ------------------ .../java/com/github/demidko/aot/Matchers.java | 27 --- .../java/com/github/demidko/aot/Word.java | 57 ------ .../github/demidko/aot/WordformMeaning.java | 150 +++++++++------ .../demidko/aot/HashDictionaryTest.java | 130 ------------- .../demidko/aot/WordformMeaningTest.java | 4 - 8 files changed, 91 insertions(+), 528 deletions(-) delete mode 100644 src/main/java/com/github/demidko/aot/Flexion.java delete mode 100644 src/main/java/com/github/demidko/aot/HashDictionary.java delete mode 100644 src/main/java/com/github/demidko/aot/Matchers.java delete mode 100644 src/main/java/com/github/demidko/aot/Word.java delete mode 100644 src/test/java/com/github/demidko/aot/HashDictionaryTest.java diff --git a/.gitignore b/.gitignore index 32f10e4..9ea096a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ build .idea .DS_Store +AotBinary diff --git a/src/main/java/com/github/demidko/aot/Flexion.java b/src/main/java/com/github/demidko/aot/Flexion.java deleted file mode 100644 index d2a9488..0000000 --- a/src/main/java/com/github/demidko/aot/Flexion.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.github.demidko.aot; - -import static com.github.demidko.aot.PartOfSpeech.partOfSpeech; -import static java.util.Arrays.asList; - -import java.util.Arrays; -import java.util.List; - -/** - * Словоформа исходной леммы - * - * @deprecated лучше используйте современный API из {@link WordformMeaning} - */ -@Deprecated -public class Flexion { - - // оптимизация - static HashDictionary db; - - private final int strIndex, tagsIndex; - private final PartOfSpeech pos; - - Flexion(int source, int tags) { - this.strIndex = source; - this.tagsIndex = tags; - pos = partOfSpeech(db.allMorphologyTags[tags]); - } - - public List getTags() { - return asList(db.allMorphologyTags[tagsIndex]); - } - - /** - * @param tag тег - * @return входит ли тег в множество тегов которыми помечена флексия - */ - public boolean has(MorphologyTag tag) { - // пустой тег однозначно входит в множество тегов - if (tag == null) { - return true; - } - for (MorphologyTag i : db.allMorphologyTags[tagsIndex]) { - if (i == tag) { - return true; - } - } - return false; - } - - public boolean hasNot(MorphologyTag tag) { - return !has(tag); - } - - public boolean hasAllOf(MorphologyTag... tags) { - return Arrays.stream(tags).allMatch(this::has); - } - - public boolean hasAnyOf(MorphologyTag... tags) { - return Arrays.stream(tags).anyMatch(this::has); - } - - public boolean hasNoneOf(MorphologyTag... tags) { - return !hasAnyOf(tags); - } - - @Override - public String toString() { - return db.allFlexionStrings[strIndex]; - } - - public PartOfSpeech getPartOfSpeech() { - return pos; - } -} diff --git a/src/main/java/com/github/demidko/aot/HashDictionary.java b/src/main/java/com/github/demidko/aot/HashDictionary.java deleted file mode 100644 index decb838..0000000 --- a/src/main/java/com/github/demidko/aot/HashDictionary.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.github.demidko.aot; - -import static com.github.demidko.aot.ByteBlock.readBlockFrom; -import static com.github.demidko.aot.Reader.readLemmas; -import static com.github.demidko.aot.Reader.readMorph; -import static com.github.demidko.aot.Reader.readRefs; -import static com.github.demidko.aot.Reader.readStrings; -import static java.util.AbstractMap.SimpleImmutableEntry; -import static java.util.Collections.emptyList; - -import java.io.DataInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.zip.GZIPInputStream; - -/** - * @deprecated лучше используйте высокоуровневый API из {@link WordformMeaning} - */ -@Deprecated -public class HashDictionary { - - final MorphologyTag[][] allMorphologyTags; - final String[] allFlexionStrings; - - private final int[][] lemmas; - private final Map refs; - - public HashDictionary() throws IOException { - try (DataInputStream file = new DataInputStream(new GZIPInputStream(getClass().getResourceAsStream("/mrd.gz")))) { - allMorphologyTags = readMorph(readBlockFrom(file)); - allFlexionStrings = readStrings(readBlockFrom(file)); - lemmas = readLemmas(readBlockFrom(file)); - refs = readRefs(readBlockFrom(file)); - } - Flexion.db = this; - } - - private boolean isCollision(int[] links, String query) { - for (int i = 0; i < links.length; i += 2) { - if (allFlexionStrings[links[i]].equals(query)) { - return false; - } - } - return true; - } - - /// *** /// - /// Здесь начинается высокоуровневое API /// - /// *** /// - - private List filterLemmas(int[] refs, String query) { - Word[] res = new Word[refs.length]; - int i = -1; - for (int ref : refs) { - if (!isCollision(lemmas[ref], query)) { - res[++i] = new Word(lemmas[ref]); - } - } - return new ImmutableList<>(res, i + 1); - } - - /** - * @param query слово в любой корректной форме - * @return Набор объектов вида {исходная форма (1ое лицо ед. число) + характеристики исходной формы + всевозможные - * иные формы + их характеристики} для каждого из смыслов. Иногда их может быть несколько для одного запроса, например - * для запроса замок, это будет три объекта {@link Word} (строение, запор и замок в смысле промокнуть). - */ - public List lookup(String query) { - query = query.toLowerCase().replace('ё', 'е'); - int[] refsToLemmas = refs.get(query.hashCode()); - return refsToLemmas == null ? emptyList() : filterLemmas(refsToLemmas, query); - } - - /// *** /// - /// Отсюда и ниже начинается низкоуровневое API /// - /// *** /// - - /** - * @param lemmaId идентификатор леммы - * @return строка леммы - */ - public String getLemmaString(int lemmaId) { - return getFlexionString(lemmaId, 0); - } - - /** - * @param lemmaId идентификатор леммы - * @return набор морфологических тегов - */ - public MorphologyTag[] getLemmaTags(int lemmaId) { - return getFlexionTags(lemmaId, 0); - } - - /** - * @param lemmaId идентификатор леммы - * @return количество флексий (вариантов) леммы - */ - public int fexionsSize(int lemmaId) { - return lemmas[lemmaId].length / 2; - } - - /** - * @param lemmaId идентификатор леммы (исходной формы слова) - * @param flexionIndex индекс флексии (варианта) исходной формы слова - * @return строка этой флексии - */ - public String getFlexionString(int lemmaId, int flexionIndex) { - return allFlexionStrings[lemmas[lemmaId][flexionIndex * 2]]; - } - - /** - * @param lemmaId идентификатор леммы (исходной формы слова) - * @param flexionIndex индекс флексии (варианта) исходной формы слова - * @return набор морфологических тегов, характеризующих эту флексию - */ - public MorphologyTag[] getFlexionTags(int lemmaId, int flexionIndex) { - return allMorphologyTags[lemmas[lemmaId][flexionIndex * 2 + 1]]; - } - - /** - * @param query слово для поиска по нему - * @return набор идентификаторов лемм (исходных форм слова) - */ - public List lookupForLemmasIds(String query) { - query = query.toLowerCase().replace('ё', 'е'); - int[] ids = refs.get(query.hashCode()); - return ids == null ? emptyList() : filterLemmasIds(ids, query); - } - - private List filterLemmasIds(int[] refs, String query) { - List res = new ArrayList<>(); - for (int ref : refs) { - if (!isCollision(lemmas[ref], query)) { - res.add(ref); - } - } - return res; - } - - /// *** /// - /// Отсюда и ниже начинаются обновления низкоуровневого API от 2021-09-19, /// - // внедренные для обеспечения поддержки нового высокоуровневого API (WordMeaning). /// - /// *** /// - - /** - * Поиск смыслов слова в словаре - * - * @param query искомое слово - * @return набор пар вида (id леммы, id флексии), каждая из которых представляет вариант смысла слова. При помощи - * {@link HashDictionary#getFlexionString(int, int)} можно восстановить исходную форму искомого слова из любого - * смысла. При помощи {@link HashDictionary#getLemmaString(int)} можно получить лемму для каждого смысла. При помощи - * {@link HashDictionary#getFlexionTags(int, int)} можно получить морфологию для каждого смысла. При помощи {@link - * HashDictionary#getLemmaTags(int)} можно получить морфологию для каждой леммы каждого смысла. При помощи {@link - * HashDictionary#fexionsSize(int)} можно получить количество всех слов каждой леммы. - */ - List> lookupForFlexions(String query) { - query = query.toLowerCase().replace('ё', 'е'); - int[] ids = refs.get(query.hashCode()); - return ids == null ? emptyList() : filterLemmasAndFlexionIds(ids, query); - } - - private List> filterLemmasAndFlexionIds(int[] refs, String query) { - List> res = new ArrayList<>(); - 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; - } -} diff --git a/src/main/java/com/github/demidko/aot/Matchers.java b/src/main/java/com/github/demidko/aot/Matchers.java deleted file mode 100644 index 2d94601..0000000 --- a/src/main/java/com/github/demidko/aot/Matchers.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.github.demidko.aot; - -import java.util.function.Predicate; - -@Deprecated -public final class Matchers { - - 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 string(String str) { - return flexion -> flexion.toString().equals(str); - } - - public static Predicate has(Predicate predicate) { - return predicate; - } - - 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 deleted file mode 100644 index 6234871..0000000 --- a/src/main/java/com/github/demidko/aot/Word.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.github.demidko.aot; - -import static java.util.Arrays.asList; -import static java.util.stream.Collectors.toList; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; - -/** - * Морфологические данные смысла слова (их, и соответственно объектов Word, может быть несколько, как зАмок-строение, - * зАмок-запор и замОк-промок) - * - * @deprecated лучше используйте API {@link WordformMeaning} - */ -@Deprecated -public class Word { - - private final List flexions; - - Word(int[] flexionsLinks) { - Flexion[] flexions = new Flexion[flexionsLinks.length / 2]; - for (int i = 0, j = 0; i < flexions.length; ++i, j += 2) { - flexions[i] = new Flexion(flexionsLinks[j], flexionsLinks[j + 1]); - } - this.flexions = asList(flexions); - } - - /** - * @return всевозможные варианты преобразования исходной формы слова - */ - public List getFlexions() { - return flexions; - } - - /** - * @return исходная форма слова, первое лицо, единственное число - */ - public Flexion getLemma() { - return flexions.get(0); - } - - @SafeVarargs - private static Predicate joinPredicates(Predicate... predicate) { - return flex -> Arrays.stream(predicate).allMatch(p -> p.test(flex)); - } - - @SafeVarargs - public final boolean anyFlexion(Predicate... predicate) { - return flexions.stream().anyMatch(joinPredicates(predicate)); - } - - @SafeVarargs - public final List getFlexions(Predicate... predicate) { - return flexions.stream().filter(joinPredicates(predicate)).collect(toList()); - } -} diff --git a/src/main/java/com/github/demidko/aot/WordformMeaning.java b/src/main/java/com/github/demidko/aot/WordformMeaning.java index 1eeaca6..3e31d88 100644 --- a/src/main/java/com/github/demidko/aot/WordformMeaning.java +++ b/src/main/java/com/github/demidko/aot/WordformMeaning.java @@ -1,13 +1,22 @@ package com.github.demidko.aot; +import static com.github.demidko.aot.ByteBlock.readBlockFrom; import static com.github.demidko.aot.PartOfSpeech.partOfSpeech; +import static com.github.demidko.aot.Reader.readLemmas; +import static com.github.demidko.aot.Reader.readMorph; +import static com.github.demidko.aot.Reader.readRefs; +import static com.github.demidko.aot.Reader.readStrings; import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; import static java.util.Objects.hash; +import java.io.DataInputStream; import java.io.IOException; +import java.io.UncheckedIOException; import java.util.ArrayList; import java.util.List; -import java.util.Map.Entry; +import java.util.Map; +import java.util.zip.GZIPInputStream; /** * Словоформа одного определенного смысла. Зачем нужна эта абстракция вместо простого слова? Например, у слова "замок" @@ -18,32 +27,93 @@ */ public class WordformMeaning { - /** - * Словарь морфологии, низкоуровневый API. При вызове из методов экземпляра всегда инициализирован. При вызове из - * статических методов, нужно использовать {@link WordformMeaning#getDictionary()}. - */ - private static HashDictionary dictionary; + + private static final MorphologyTag[][] allMorphologyTags; + private static final String[] allFlexionStrings; + private static final int[][] lemmas; + private static final Map refs; /** - * Идентификатор леммы в {@link HashDictionary#getFlexionString(int, int)}(первый параметр) + * Идентификатор леммы */ private final int lemmaId; /** - * Индекс трансформации леммы в {@link HashDictionary#getFlexionString(int, int)}(второй параметр) + * Индекс трансформации леммы */ - private final int flexionIndex; + private final int transformationIndex; + + static { + try (DataInputStream file = + new DataInputStream(new GZIPInputStream(WordformMeaning.class.getResourceAsStream("/mrd.gz"))) + ) { + allMorphologyTags = readMorph(readBlockFrom(file)); + allFlexionStrings = readStrings(readBlockFrom(file)); + lemmas = readLemmas(readBlockFrom(file)); + refs = readRefs(readBlockFrom(file)); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } /** - * @param lemmaId Идентификатор леммы в {@link HashDictionary#getFlexionString(int, int)}(первый параметр) - * @param flexionIndex Индекс трансформации леммы в {@link HashDictionary#getFlexionString(int, int)}(второй - * параметр) + * @param lemmaId Идентификатор леммы + * @param transformationIndex Индекс трансформации леммы */ - private WordformMeaning(int lemmaId, int flexionIndex) { + WordformMeaning(int lemmaId, int transformationIndex) { this.lemmaId = lemmaId; - this.flexionIndex = flexionIndex; + this.transformationIndex = transformationIndex; + } + + private static int getTransformationsSize(int lemmaId) { + return lemmas[lemmaId].length / 2; + } + + private static String getTransformationString(int lemmaId, int transformationIndex) { + return allFlexionStrings[lemmas[lemmaId][transformationIndex * 2]]; + } + + private static List getTransformationMorphology(int lemmaId, int transformationIndex) { + return asList(allMorphologyTags[lemmas[lemmaId][transformationIndex * 2 + 1]]); } + /** + * Метод ищет все возможные значения слова + * + * @param w слово в любой форме + * @return список смыслов включая омонимии + */ + public static List lookupForMeanings(String w) throws IOException { + w = w.toLowerCase().replace('ё', 'е'); + int[] ids = refs.get(w.hashCode()); + if (ids == null) { + return emptyList(); + } + List meanings = new ArrayList<>(); + for (int lemmaId : ids) { + for (int flexionIdx = 0; flexionIdx < getTransformationsSize(lemmaId); ++flexionIdx) { + if (getTransformationString(lemmaId, flexionIdx).equals(w)) { + meanings.add(new WordformMeaning(lemmaId, flexionIdx)); + } + } + } + return meanings; + } + + /** + * Метод для получения словоформы по ее уникальному идентификатору + * + * @param id идентификатор полученный ранее + * @return словоформ смысла + */ + public static WordformMeaning lookupForMeaning(long id) throws IOException { + BitReader reader = new BitReader(id); + int lemmaId = reader.readInt(); + int flexionIndex = reader.readInt(); + return new WordformMeaning(lemmaId, flexionIndex); + } + + /** * @return Уникальный идентификатор, по которому можно восстановить словоформу, даже после перезапуска приложения. * Идентификатор состоит из 48 бит (32 бита индекс леммы, 16 бит смещение трансформации) записанных по порядку в @@ -52,7 +122,7 @@ private WordformMeaning(int lemmaId, int flexionIndex) { public long getId() { BitWriter w = new BitWriter(); w.writeInt(lemmaId); - w.writeInt(flexionIndex); + w.writeInt(transformationIndex); return w.toLong(); } @@ -61,7 +131,7 @@ public long getId() { */ @Override public String toString() { - return dictionary.getFlexionString(lemmaId, flexionIndex); + return getTransformationString(lemmaId, transformationIndex); } /** @@ -76,14 +146,14 @@ public WordformMeaning getLemma() { * @return Морфологические характеристики для заданного слова, род, число, падеж, спряжение и т. д. */ public List getMorphology() { - return asList(dictionary.getFlexionTags(lemmaId, flexionIndex)); + return getTransformationMorphology(lemmaId, transformationIndex); } /** * @return Варианты трансформации словоформы по правилам русского языка, всевозможные склонения, спряжения и т. д. */ public List getTransformations() { - WordformMeaning[] res = new WordformMeaning[dictionary.fexionsSize(lemmaId)]; + WordformMeaning[] res = new WordformMeaning[getTransformationsSize(lemmaId)]; for (int i = 0; i < res.length; ++i) { res[i] = new WordformMeaning(lemmaId, i); } @@ -97,46 +167,6 @@ public PartOfSpeech getPartOfSpeech() { return partOfSpeech(getMorphology()); } - /** - * Метод ищет все возможные значения слова - * - * @param w слово в любой форме - * @return список смыслов включая омонимии - */ - public static List lookupForMeanings(String w) throws IOException { - ArrayList result = new ArrayList<>(); - for (Entry meaning : getDictionary().lookupForFlexions(w)) { - result.add(new WordformMeaning(meaning.getKey(), meaning.getValue())); - } - return result; - } - - /** - * Метод для получения словоформы по ее уникальному идентификатору - * - * @param id идентификатор полученный ранее при помощи {@link WordformMeaning#getId()} - * @return словоформа смысла - */ - public static WordformMeaning lookupForMeaning(long id) throws IOException { - BitReader reader = new BitReader(id); - int lemmaId = reader.readInt(); - int flexionIndex = reader.readInt(); - getDictionary(); - return new WordformMeaning(lemmaId, flexionIndex); - } - - /** - * Инициализация {@link WordformMeaning#dictionary} - * - * @return словарь лемм и морфологии (низкоуровневое API) - */ - static HashDictionary getDictionary() throws IOException { - if (dictionary == null) { - dictionary = new HashDictionary(); - } - return dictionary; - } - @Override public boolean equals(Object o) { if (this == o) { @@ -146,11 +176,11 @@ public boolean equals(Object o) { return false; } WordformMeaning that = (WordformMeaning) o; - return lemmaId == that.lemmaId && flexionIndex == that.flexionIndex; + return lemmaId == that.lemmaId && transformationIndex == that.transformationIndex; } @Override public int hashCode() { - return hash(lemmaId, flexionIndex); + return hash(lemmaId, transformationIndex); } } diff --git a/src/test/java/com/github/demidko/aot/HashDictionaryTest.java b/src/test/java/com/github/demidko/aot/HashDictionaryTest.java deleted file mode 100644 index c5f2714..0000000 --- a/src/test/java/com/github/demidko/aot/HashDictionaryTest.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.github.demidko.aot; - -import static com.github.demidko.aot.WordformMeaning.getDictionary; -import static java.util.stream.Collectors.toList; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.hasItems; -import static org.hamcrest.Matchers.hasSize; - -import java.io.IOException; -import java.util.List; -import org.junit.jupiter.api.Test; - -public class HashDictionaryTest { - - private static HashDictionary d; - - static { - try { - d = getDictionary(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Test - public void dictionaryShouldBeAbleToFindExistentWords() throws IOException { - assertThat(d.lookup("краснеющий"), hasSize(1)); - assertThat(d.lookup("дорога"), hasSize(2)); - assertThat(d.lookup("клавиатура"), hasSize(1)); - //low level - assertThat(d.lookup("краснеющий"), hasSize(1)); - assertThat(d.lookup("дорога"), hasSize(2)); - assertThat(d.lookup("клавиатура"), hasSize(1)); - } - - @Test - public void dictionaryShouldNotFindNotRealWords() throws IOException { - assertThat(d.lookup("фентифлюшка"), hasSize(0)); - // low level - assertThat(d.lookupForLemmasIds("фентифлюшка"), hasSize(0)); - } - - private List collectNormsLowLevel(List ids) { - return ids.stream().map(d::getLemmaString).collect(toList()); - } - - @Test - public void lowerCaseWorkingCorrectly() { - List lemmas = d - .lookup("Германия") - .stream() - .map(w -> w.getLemma().toString()) - .collect(toList()); - assertThat(lemmas, containsInAnyOrder("германия", "германий")); - // low level - assertThat(collectNormsLowLevel(d.lookupForLemmasIds("Германия")), - containsInAnyOrder("германия", "германий")); - } - - @Test - public void testEmptyWordBases() throws IOException { - assertThat(d.lookup("человек"), hasSize(1)); - assertThat(d.lookup("люди"), hasSize(1)); - assertThat(d.lookup("ребёнок"), hasSize(1)); - assertThat(d.lookup("дети"), hasSize(1)); - //low level - assertThat(d.lookupForLemmasIds("человек"), hasSize(1)); - assertThat(d.lookupForLemmasIds("люди"), hasSize(1)); - assertThat(d.lookupForLemmasIds("ребёнок"), hasSize(1)); - assertThat(d.lookupForLemmasIds("дети"), hasSize(1)); - } - - @Test - public void shouldNotThrowExceptionIfWordHasUnknownCharacter() throws IOException { - assertThat(d.lookup("super#starnge@string"), hasSize(0)); - //low level - assertThat(d.lookupForLemmasIds("super#starnge@string"), hasSize(0)); - } - - - private static List collectNorms(final List l) { - return l.stream() - .map(w -> w.getLemma().toString()) - .collect(toList()); - } - - - @Test - public void dictionaryShouldBeAbleToReturnWordNorms() throws IOException { - assertThat(collectNorms(d.lookup("дорога")), hasItems("дорога", "дорогой")); - assertThat(collectNorms(d.lookup("черномырдину")), hasItems("черномырдин")); - - // low level - assertThat(collectNormsLowLevel(d.lookupForLemmasIds("дорога")), hasItems("дорога", "дорогой")); - assertThat(collectNormsLowLevel(d.lookupForLemmasIds("черномырдину")), hasItems("черномырдин")); - } - - @Test - public void regression1() { - assertThat(collectNorms(d.lookup("замок")), hasItems("замок", "замокнуть")); - //low level - assertThat(collectNormsLowLevel(d.lookupForLemmasIds("замок")), hasItems("замок", "замокнуть")); - } - - @Test - public void regression3() { - assertThat(d.lookup("и"), hasSize(2)); - // low level - assertThat(d.lookupForLemmasIds("и"), hasSize(2)); - } - - @Test - public void regression2() throws IOException { - assertThat(collectNorms(d.lookup("придет")), hasItems("прийти")); - // low level - assertThat(collectNormsLowLevel(d.lookupForLemmasIds("придет")), hasItems("прийти")); - } - - @Test - public void dictionaryShouldBeAbleToReturnWordNormsForEmptyBases() throws IOException { - List norms = collectNorms(d.lookup("люди")); - assertThat(norms, hasSize(1)); - assertThat(norms, hasItems("человек")); - // low level - List norms2 = collectNormsLowLevel(d.lookupForLemmasIds("люди")); - assertThat(norms2, hasSize(1)); - assertThat(norms2, hasItems("человек")); - } -} diff --git a/src/test/java/com/github/demidko/aot/WordformMeaningTest.java b/src/test/java/com/github/demidko/aot/WordformMeaningTest.java index c02369e..ed5266f 100644 --- a/src/test/java/com/github/demidko/aot/WordformMeaningTest.java +++ b/src/test/java/com/github/demidko/aot/WordformMeaningTest.java @@ -17,10 +17,6 @@ class WordformMeaningTest { void lookupForMeaningsTest() throws IOException { List meanings = lookupForMeanings("замок"); - for (WordformMeaning x : meanings) { - System.out.println(x.getLemma().getId() + " -> " + x + x.getMorphology()); - } - /* * замок может означать * 1. замок-строение (увидел что? - средневековый замок)