parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Кому стеммер?

Саян 23.11.2013 19:38

Стеммер Портера для русского языка: отсекает окончания слов, пытается выделить основные словоформы.
Буду благодарен за дополнения/исправления. В планах сделать кэширование на хэшфайле.
@CLASS
stemmer
#by father_gorry for Aktar CMS 
#after http://forum.dklab.ru/php/advises/HeuristicWithoutTheDictionaryExtractionOfARootFromRussianWord.html

@auto[]
$Stem_Caching(0)
$Stem_Cache[^hash::create[]]
$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[[^^аеиоуыэюя][аеиоуыэюя]+[^^аеиоуыэюя]+[аеиоуыэюя].*(?<=о)сть?^$]]
$EREP[^table::create{f	t
ё	t}]

@s[RV;regex]
$caller.RV[^RV.match[$regex][]{}]
$result(^if($RV ne $caller.RV){1;0})

@stem_word[word]
$word[^word.lower[]]
$word[^word.replace[$EREP]]

$tmp[^word.match[$RVRE][]{$start[$match.1]$RV[$match.2]}]

^if(!def $RV){
#	Nothing to stem
	$result[$word]
;^actual_stem[$word;$RV;$start]}

@actual_stem[word;RV;start]
$stem[$word]

^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[ость?^$][]{}]}
^if(!^s[$RV;^regex::create[ь^$]]){
	$RV[^RV.match[ейше?][]{}]
	$RV[^RV.match[нн^$][]{н}]
}
$result[${start}$RV]