| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Саян 24.11.2013 18:30
- внес большинство рекомендаций. Спасибо, реально в тему:)@USE
lib_aktar.p
@CLASS
stemmer
#by father_gorry for Aktar CMS
#after http://forum.dklab.ru/php/advises/HeuristicWithoutTheDictionaryExtractionOfARootFromRussianWord.html
@OPTIONS
partial
#easy to add languages by adding partial files with @init_lang and @stem_word_lang
@auto[]
$noword[^table::create{f t
?
.
,
!
:
&
^;
-
^taint[^#0A]
^taint[^#20] }]
$EREP_ru[^table::create{f t
ё е}]
@s[RV;regex] #this not only matches, but replaces caller RV
$caller.RV[^RV.match[$regex][]{}]
$result(^if($RV ne $caller.RV){1;0})
@stem[phrase;ln;minlen]
^if(!def $ln){$ln[ru]}$language[$ln]
$initial_phrase[$phrase]
$minlen($minlen)
$prephrase[^ph2tab[$phrase]]
$wache[^hafala:open[/cache/stemmer/$language]]
$donephrase[^table::create{word}]
^prephrase.menu{
$w[^cache_word[$prephrase.piece]]
^if(^w.length[] >= $minlen){^donephrase.append{$w}}
}
$result[^donephrase.menu{$donephrase.word}[ ]]
@ph2tab[phrase]
$phrase[^apply-taint[optimized-as-is][^phrase.replace[$noword]]]
$result[^phrase.split[ ;v]]
@new[phrase;ln;minlen]
$tmp[^stem[$phrase;$ln;$minlen]]
@4MBTS[]
$result[^donephrase.menu{$donephrase.word*}[ ]]
@cache_word[word]
$word[^word.lower[]]
^try{$ccn[EREP_$language]$word[^word.replace[$$ccn]]}{^blad[]}
^if(^word.length[] <= 3){$result[$word]}{
^if(def $wache.$word){
$result[$wache.$word]
}{
^if(!$stemmer_initialized){
$jInit[init_$language]
^self.$jInit[]
$stemmer_initialized(1)
}
$jWord[stem_word_$language]
$result[^self.$jWord[$word]]
$wache.$word[$result]
}
}
@init_ru[]
$VOWEL[аеиоуыэюя]
$PERFECTIVEGROUND[^regex::create[((?:ив|ивши|ившись|ыв|ывши|ывшись)|((?<=[ая])(в|вши|вшись)))^$]]
$REFLEXIVE[^regex::create[(с[яь])^$]]
$ADJECTIVE[^regex::create[(?:ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|еых|ую|юю|ая|яя|ою|ею)^$]]
$PARTICIPLE[^regex::create[((ивш|ывш|ующ)|((?<=[ая])(ем|нн|вш|ющ|щ)))^$]]
$VERB[^regex::create[((?:ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ены|ить|ыть|ишь|ую|ю)|((?<=[ая])(ла|на|ете|йте|ли|й|л|ем|н|ло|но|ет|ют|ны|ть|ешь|нно)))^$]]
$NOUN[^regex::create[^^(?:а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|ией|ей|ой|ий|й|и|ы|ь|ию|ью|ю|ия|ья|я)^$]]
$RVRE[^regex::create[^^(.*?[аеиоуыэюя])(.*)^$]]
$DERIVATIONAL[^regex::create[[^^аеиоуыэюя][аеиоуыэюя]+[^^аеиоуыэюя]+[аеиоуыэюя].*(?<=о)сть?^$]]
$ADJNOUN[^regex::create[ость?^$]]
$SOFT[^regex::create[ь^$]]
$SUPERLATIVE[^regex::create[ейше?]]
$NN[^regex::create[нн^$]]
@stem_word_ru[word]
$tmp[^word.match[$RVRE][]{$start[$match.1]$RV[$match.2]}]
^if(!def $RV){
# Nothing to stem
$result[$word]
;
$result[^actual_stem_ru[$word;$RV;$start]]
}
@actual_stem_ru[word;RV;start]
^if(!^s[$RV;$PERFECTIVEGROUND]){^s[$RV;$REFLEXIVE]}
^if(^s[$RV;$ADJECTIVE]){^s[$RV;$PARTICIPLE]}{
^if(!^s[$RV;$VERB]){^s[$RV;$NOUN]}
}
$RV[^RV.match[и^$][]{}]
^if(^s[$RV;$DERIVATIONAL]){$RV[^RV.match[$ADJNOUN][]{}]}
^if(!^s[$RV;$SOFT]){
$RV[^RV.match[$SUPERLATIVE][;]]
$RV[^RV.match[$NN][;н]]
}
$result[${start}$RV]