Skip to content

Commit

Permalink
stemmer update
Browse files Browse the repository at this point in the history
  • Loading branch information
arysin committed Dec 15, 2023
1 parent 1ab6700 commit 167090a
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 10 deletions.
31 changes: 29 additions & 2 deletions src/main/groovy/org/dict_uk/tools/Stemmer.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import groovy.transform.CompileStatic


class Stemmer {
public static final boolean REMOVE_PREFIXES = false

Map<String, Set<String>> roots = [:].withDefault { [] as Set }.asSynchronized()
Map<String, Set<String>> rootsPref = [:].withDefault { [] as Set }.asSynchronized()
Map<String, String> preStems = [:]
Expand Down Expand Up @@ -49,6 +51,21 @@ class Stemmer {
stemSet << stem
}

if( ! REMOVE_PREFIXES ) {
def parts = words.split(/ +/)
if( parts.length > 1 ) {
words = parts[0]
def wordsWithPrefix = parts[1]

wordsWithPrefix.split(/ /).findAll{ it }.each { w ->
if( w in preStems ) println "duplicate word: $w"
int idx = w.indexOf(stem)
def stem2 = w[0..idx] + stem
preStems[w] = stem2
}
}
}

words.split(/ /).findAll{ it }.each { w ->
if( w in preStems ) println "duplicate word: $w"
preStems[w] = stem
Expand Down Expand Up @@ -219,7 +236,10 @@ class Stemmer {
// (Pattern.compile(/(мебл|магл)ьований/)): '$1',
(Pattern.compile(/(бу|секре|компози|зекуц|бі|ди|ститу|моц)(ційний|торний)$/)): '$1т',
(Pattern.compile(/((?<!нс)тру)(юва(ль)?ний|й(ова)?ний)$/)): '$1й',
(Pattern.compile(/(.{3})((ов)?о|е)подібний$/)): '$1',
(REMOVE_PREFIXES ?
(Pattern.compile(/(.{3})((ов)?о|е)подібний$/))
: (Pattern.compile(/--------/)))
: '$1',

(Pattern.compile(/(.{3})([нт])\2євий$/)): '$1$2',

Expand Down Expand Up @@ -300,7 +320,11 @@ class Stemmer {
(Pattern.compile(/(буд)ова$/)): '$1',
(Pattern.compile(/(реал)(іст(ка)?|ізм|ьність)$/)): '$1',
(Pattern.compile(/((?<!нс)тру)(юваність|й(ова)?ність)$/)): '$1й',
(Pattern.compile(/(.{3})((ов)?о|е)подібність$/)): '$1',

(REMOVE_PREFIXES ?
(Pattern.compile(/(.{3})((ов)?о|е)подібність$/))
: (Pattern.compile(/--------/)))
: '$1',

(Pattern.compile(/(.{3})нісність?$/)): '$1',
(Pattern.compile(/(?<![аеєиіїоуюя])ну(тість|ття)$/)): '',
Expand Down Expand Up @@ -566,6 +590,9 @@ class Stemmer {

@CompileStatic
private String removePrefixes(String root, String origW) {
if( ! REMOVE_PREFIXES )
return root

if( ! (/^($noprefixes)/ =~ root ) ) {
def m = PREFIX_REMOVE_STRONG.matcher(root)
if( m ) {
Expand Down
21 changes: 13 additions & 8 deletions src/test/groovy/org/dict_uk/tools/StemmerTest.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,8 @@ class StemmerTest {
assertEquals "вціл", stemmer.findStem(["вцілілість вцілілість noun:inanim:n:v_naz"])
assertEquals "еволюц", stemmer.findStem(["еволюціоністка еволюціоністка noun:anim:f:v_naz"])
assertEquals "віст", stemmer.findStem(["вістовець вістовець noun:anim:m:v_naz"])
assertEquals "спал", stemmer.findStem(["газоспалювальний газоспалювальний adj:m:v_naz"])
assertEquals "біонік", stemmer.findStem(["біоніка біоніка noun:inanim:f:v_naz"])
assertEquals "контрар", stemmer.findStem(["контрарний контрарний adj:m:v_naz"])
assertEquals "кейнсіан", stemmer.findStem(["неокейнсіанець неокейнсіанець noun:anim:m:v_naz"])
assertEquals "вріз", stemmer.findStem(["врізувальний врізувальний adj:m:v_naz"])
assertEquals "ворон", stemmer.findStem(["вороненький вороненький adj:m:v_naz"])
assertEquals "ворон", stemmer.findStem(["вороненький вороненький noun:anim:m:v_naz"])
Expand All @@ -45,16 +43,23 @@ class StemmerTest {
// assertEquals "стел", Roots.findRoot("простелити /v1")
assertEquals "лікар", stemmer.findStem(["лікарський лікарський adj:m:v_naz"])
assertEquals "морож", stemmer.findStem(["морожений морожений adj:m:v_naz"])

assertEquals "дів", stemmer.findStem(["дівка дівка noun:anim:f:v_naz"])
assertEquals "канад", stemmer.findStem(["канадійка канадійка noun:anim:f:v_naz"])

// prefixes
assertEquals "плакат", stemmer.findStem(["агітплакат агітплакат noun:inanim:n:v_naz"])
assertEquals "мит", stemmer.findStem(["автомито автомито noun:inanim:n:v_naz"])
assertEquals "імпер", stemmer.findStem(["авіаімперія авіаімперія noun:inanim:f:v_naz"])
assertEquals "файл", stemmer.findStem(["авдіофайл авдіофайл noun:inanim:m:v_naz"])

if( Stemmer.REMOVE_PREFIXES ) {
assertEquals "спал", stemmer.findStem(["газоспалювальний газоспалювальний adj:m:v_naz"])
assertEquals "кейнсіан", stemmer.findStem(["неокейнсіанець неокейнсіанець noun:anim:m:v_naz"])
assertEquals "плакат", stemmer.findStem(["агітплакат агітплакат noun:inanim:n:v_naz"])
assertEquals "мит", stemmer.findStem(["автомито автомито noun:inanim:n:v_naz"])
assertEquals "імпер", stemmer.findStem(["авіаімперія авіаімперія noun:inanim:f:v_naz"])
assertEquals "файл", stemmer.findStem(["авдіофайл авдіофайл noun:inanim:m:v_naz"])
assertEquals "щит", stemmer.findStem(["щитоподібний щитоподібний adj:m:v_naz"])
}
else {
assertEquals "авдіофайл", stemmer.findStem(["авдіофайл авдіофайл noun:inanim:m:v_naz"])
assertEquals "щитоподіб", stemmer.findStem(["щитоподібний щитоподібний adj:m:v_naz"])
}
}

@Test
Expand Down

0 comments on commit 167090a

Please sign in to comment.