Skip to content

Commit

Permalink
Исправил ошибку падения + рефакторинг
Browse files Browse the repository at this point in the history
  • Loading branch information
demidko committed Oct 10, 2021
1 parent 2485b2f commit 0b453d1
Show file tree
Hide file tree
Showing 13 changed files with 100 additions and 81 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
71 changes: 37 additions & 34 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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());
/*
* человек [С, мр, им, ед]
* человека [рд, С, мр, ед]
* человеку [С, мр, ед, дт]
* человека [С, мр, ед, вн]
* человеком [тв, С, мр, ед]
* человеке [С, мр, ед, пр]
* люди [С, мр, им, мн]
* людей [рд, С, мр, мн]
* человек [рд, С, мр, мн]
* людям [С, мр, мн, дт]
* человекам [С, мр, мн, дт]
* людей [С, мр, мн, вн]
* людьми [тв, С, мр, мн]
* человеками [тв, С, мр, мн]
* людях [С, мр, мн, пр]
* человеках [С, мр, мн, пр]
*/
}
}
}
```

Expand Down
7 changes: 5 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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<MavenPublication>("library") {
create<MavenPublication>("aot") {
groupId = "com.github.demidko"
artifactId = "aot"
from(components["java"])
}
}
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion src/main/java/com/github/demidko/aot/BitReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
/**
* Класс предназначен для побитового чтения из примитивов
*/
public class BitReader {
class BitReader {

private final BitSet bs;
private int pos = -1;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/github/demidko/aot/BitWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
/**
* Класс предназначен для побитовой записи в примитивы
*/
public class BitWriter {
class BitWriter {

private final BitSet bs;
private int pos = -1;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/github/demidko/aot/Bytecode.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
/**
* Класс хранит константы байткода
*/
public final class Bytecode {
final class Bytecode {

public static final byte endOfCompiledLine = 100;

Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/github/demidko/aot/Flexion.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@

/**
* Словоформа исходной леммы
*
* @deprecated лучше используйте современный API из {@link WordformMeaning}
*/
@Deprecated
public class Flexion {

// оптимизация
Expand Down
28 changes: 12 additions & 16 deletions src/main/java/com/github/demidko/aot/HashDictionary.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -152,29 +156,21 @@ private List<Integer> filterLemmasIds(int[] refs, String query) {
* HashDictionary#getLemmaTags(int)} можно получить морфологию для каждой леммы каждого смысла. При помощи {@link
* HashDictionary#fexionsSize(int)} можно получить количество всех слов каждой леммы.
*/
public List<Entry<Integer, Integer>> lookupForFlexions(String query) {
List<Entry<Integer, Integer>> 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<Entry<Integer, Integer>> filterLemmasAndFlexionsIds(int[] refs, String query) {
private List<Entry<Integer, Integer>> filterLemmasAndFlexionIds(int[] refs, String query) {
List<Entry<Integer, Integer>> 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;
}
}
32 changes: 16 additions & 16 deletions src/main/java/com/github/demidko/aot/Matchers.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,26 @@

import java.util.function.Predicate;


@Deprecated
public final class Matchers {

public static Predicate<Flexion> tags(MorphologyTag... tags) {
return flexion -> flexion.hasAllOf(tags);
}
public static Predicate<Flexion> tags(MorphologyTag... tags) {
return flexion -> flexion.hasAllOf(tags);
}

public static Predicate<Flexion> partOfSpeech(PartOfSpeech pos) {
return flexion -> flexion.getPartOfSpeech() == pos;
}
public static Predicate<Flexion> partOfSpeech(PartOfSpeech pos) {
return flexion -> flexion.getPartOfSpeech() == pos;
}

public static Predicate<Flexion> string(String str) {
return flexion -> flexion.toString().equals(str);
}
public static Predicate<Flexion> string(String str) {
return flexion -> flexion.toString().equals(str);
}

public static Predicate<Flexion> has(Predicate<Flexion> predicate) {
return predicate;
}
public static Predicate<Flexion> has(Predicate<Flexion> predicate) {
return predicate;
}

public static Predicate<Flexion> not(Predicate<Flexion> predicate) {
return predicate.negate();
}
public static Predicate<Flexion> not(Predicate<Flexion> predicate) {
return predicate.negate();
}
}
3 changes: 3 additions & 0 deletions src/main/java/com/github/demidko/aot/Word.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@
/**
* Морфологические данные смысла слова (их, и соответственно объектов Word, может быть несколько, как зАмок-строение,
* зАмок-запор и замОк-промок)
*
* @deprecated лучше используйте API {@link WordformMeaning}
*/
@Deprecated
public class Word {

private final List<Flexion> flexions;
Expand Down
5 changes: 2 additions & 3 deletions src/main/java/com/github/demidko/aot/WordformMeaning.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,8 @@ public List<MorphologyTag> getMorphology() {
* @return Варианты трансформации словоформы по правилам русского языка, всевозможные склонения, спряжения и т. д.
*/
public List<WordformMeaning> 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);
Expand Down
20 changes: 16 additions & 4 deletions src/test/java/com/github/demidko/aot/WordformMeaningTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

import java.io.IOException;
import java.util.List;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;


Expand All @@ -17,7 +16,20 @@ class WordformMeaningTest {
@Test
void lookupForMeaningsTest() throws IOException {
List<WordformMeaning> 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)
Expand All @@ -27,7 +39,7 @@ void lookupForMeaningsTest() throws IOException {
);

assertThat(
meanings.get(1)
meanings.get(4)
.getLemma()
.toString(),
equalTo("замокнуть")
Expand All @@ -51,7 +63,7 @@ void lookupForMeaningsTest() throws IOException {

// а вот если для двух смыслов отличается хотя бы одна словоформа или хотя бы одна морфология, то словарь их разделит
assertThat(
meanings.get(1)
meanings.get(4)
.getTransformations()
.stream()
.map(WordformMeaning::toString)
Expand Down

0 comments on commit 0b453d1

Please sign in to comment.