0) && self::replaceLetter(3,"ee"); return; } if ((self::matchLetter("ed"))&&(self::stemContainVowel(2))){ self::replaceLetter(2,""); self::step1b2(); return; } if ((self::matchLetter("ing"))&&(self::stemContainVowel(3))){ self::replaceLetter(3,""); self::step1b2(); } } /** * step 1b2 */ private static function step1b2(){ (self::matchLetter("at")) && self::replaceLetter(2, "ate"); (self::matchLetter("bl")) && self::replaceLetter(2, "ble"); (self::matchLetter("iz")) && self::replaceLetter(2, "ize"); if (self::stemEndWithCC(0) && !(self::stemEndWithLetter(0,'l') || self::stemEndWithLetter(0,'s') || self::stemEndWithLetter(0,'z'))){ self::$word = substr(self::$word, 0 ,-1); } else if ((self::getStemM(0) == 1) && self::stemEndWithCVC(0)){ self::$word = self::$word."e"; } } /** * step 1c */ private static function step1c(){ (self::matchLetter("y")) && (self::stemContainVowel(1)) && self::replaceLetter(1,"i"); } /** * step 2 */ private static function step2(){ switch (substr(self::$word, -2, 1)){ case 'a' : if(self::matchLetter("ational")){ (self::getStemM(7)>0) && self::replaceLetter(7,"tion"); break; } else if (self::matchLetter("tional")){ (self::getStemM(6)>0) && self::replaceLetter(6,"tion"); break; } break; case 'c' : if(self::matchLetter("enci")){ (self::getStemM(4)>0)&& self::replaceLetter(4,"ence"); break; } else if (self::matchLetter("anci")){ (self::getStemM(4)>0) && self::replaceLetter(4,"ance"); break; } break; case 'e' : if(self::matchLetter("izer")){ (self::getStemM(4)>0) && self::replaceLetter(4,"ize"); break; } break; case 'g' : if(self::matchLetter("logi")){ (self::getStemM(4)>0) && self::replaceLetter(4,"log"); break; } break; case 'l' : if(self::matchLetter("bli")){ (self::getStemM(3)>0) && self::replaceLetter(3,"ble"); break; } else if (self::matchLetter("alli")){ (self::getStemM(4)>0) && self::replaceLetter(4,"al"); break; } else if (self::matchLetter("entli")){ (self::getStemM(5)>0) && self::replaceLetter(5,"ent"); break; } else if (self::matchLetter("eli")){ (self::getStemM(3)>0) && self::replaceLetter(3,"e"); break; } else if (self::matchLetter("ousli")){ (self::getStemM(5)>0) && self::replaceLetter(5,"ous"); break; } break; case 'o': if(self::matchLetter("ization")){ (self::getStemM(7)>0) && self::replaceLetter(7,"ize"); break; } else if (self::matchLetter("ation")){ (self::getStemM(5)>0) && self::replaceLetter(5,"ate"); break; } else if (self::matchLetter("ator")){ (self::getStemM(4)>0) && self::replaceLetter(4,"ate"); break; } break; case 's': if(self::matchLetter("alism")){ (self::getStemM(5)>0) && self::replaceLetter(5,"al"); break; } else if (self::matchLetter("iveness")){ (self::getStemM(7)>0) && self::replaceLetter(7,"ive"); break; } else if (self::matchLetter("fulness")){ (self::getStemM(7)>0) && self::replaceLetter(7,"ful"); break; } else if (self::matchLetter("ousness")){ (self::getStemM(7)>0) && self::replaceLetter(7,"ous"); break; } break; case 't': if(self::matchLetter("aliti")){ (self::getStemM(5)>0) && self::replaceLetter(5,"al"); break; } else if (self::matchLetter("iviti")){ (self::getStemM(5)>0) && self::replaceLetter(5,"ive"); break; } else if (self::matchLetter("biliti")){ (self::getStemM(6)>0) && self::replaceLetter(6,"ble"); break; } break; } } /** * step 3 */ private static function step3(){ switch (substr(self::$word, -1, 1)){ case 'e' : if(self::matchLetter("icate")){ (self::getStemM(5)>0) && self::replaceLetter(5,"ic"); break; } else if (self::matchLetter("ative")){ (self::getStemM(5)>0) && self::replaceLetter(5,""); break; } else if (self::matchLetter("alize")){ (self::getStemM(5)>0) && self::replaceLetter(5,"al"); break; } break; case 'i' : if(self::matchLetter("iciti")){ (self::getStemM(5)>0) && self::replaceLetter(5,"ic"); break; } break; case 'l' : if(self::matchLetter("ical")){ (self::getStemM(4)>0) && self::replaceLetter(4,"ic"); break; } else if (self::matchLetter("ful")){ (self::getStemM(3)>0) && self::replaceLetter(3,""); break; } break; case 's' : if(self::matchLetter("ness")){ (self::getStemM(4)>0) && self::replaceLetter(4,""); break; } break; } } /** * step 4 */ private static function step4(){ switch (substr(self::$word, -2, 1)){ case 'a' : if(self::matchLetter("al")){ (self::getStemM(2)>1) && self::replaceLetter(2,""); break; } break; case 'c' : if(self::matchLetter("ance")){ (self::getStemM(4)>1) && self::replaceLetter(4,""); break; } else if (self::matchLetter("ence")){ (self::getStemM(4)>1) && self::replaceLetter(4,""); break; } break; case 'e' : if(self::matchLetter("er")){ (self::getStemM(2)>1) && self::replaceLetter(2,""); break; } break; case 'i' : if(self::matchLetter("ic")){ (self::getStemM(2)>1) && self::replaceLetter(2,""); break; } case 'l' : if(self::matchLetter("able")){ (self::getStemM(4)>1) && self::replaceLetter(4,""); break; } else if (self::matchLetter("ible")){ (self::getStemM(4)>1) && self::replaceLetter(4,""); break; } break; case 'n' : if(self::matchLetter("ant")){ (self::getStemM(3)>1) && self::replaceLetter(3,""); break; } else if (self::matchLetter("ement")){ (self::getStemM(5)>1) && self::replaceLetter(5,""); break; } else if (self::matchLetter("ment")){ (self::getStemM(4)>1) && self::replaceLetter(4,""); break; } else if (self::matchLetter("ent")){ (self::getStemM(3)>1) && self::replaceLetter(3,""); break; } break; case 'o' : if(self::matchLetter("sion")){ (self::getStemM(3)>1) && self::replaceLetter(3,""); break; } else if (self::matchLetter("tion")){ (self::getStemM(3)>1) && self::replaceLetter(3,""); break; } else if (self::matchLetter("ou")){ (self::getStemM(2)>1) && self::replaceLetter(2,""); break; } break; case 's' : if(self::matchLetter("ism")){ (self::getStemM(3)>1) && self::replaceLetter(3,""); break; } break; case 't' : if(self::matchLetter("ate")){ (self::getStemM(3)>1) && self::replaceLetter(3,""); break; } else if (self::matchLetter("iti")){ (self::getStemM(3)>1) && self::replaceLetter(3,""); break; } break; case 'u' : if(self::matchLetter("ous")){ (self::getStemM(3)>1) && self::replaceLetter(3,""); break; } break; case 'v' : if(self::matchLetter("ive")){ (self::getStemM(3)>1) && self::replaceLetter(3,""); break; } break; case 'z' : if(self::matchLetter("ize")){ (self::getStemM(3)>1) && self::replaceLetter(3,""); break; } break; } } /** * step 5 */ private static function step5(){ if (self::matchLetter("e")){ if (self::getStemM(1)>1){ self::replaceLetter(1,""); }else if ((self::getStemM(1)==1) && !self::stemEndWithCVC(1)){ self::replaceLetter(1,""); } } if (((self::matchLetter("dd"))||(self::matchLetter("ll")))&&(self::getStemM(0)>1)){ self::$word = substr(self::$word, 0 ,-1); } } /** * check whether the suffix of the word matches $strOld * @param (string) $strOld String to check * @return (bool) Result */ private static function matchLetter($strOld){ return (substr(self::$word, -strlen($strOld)) == $strOld); } /** * replace the last ($offset) letters with $strNew * @param (int) $offset offset intiger * @param (string) $strNew String to replace with */ private static function replaceLetter($offset, $strNew){ self::$word = self::getSubString($offset).$strNew; } /** * get the substring without the last ($offset) letters * @param (int) $offset offset intiger * @return (bool) Result */ private static function getSubString($offset){ return ($offset) ? substr(self::$word, 0, -$offset) : (self::$word); } /** * get M of the substring without the last ($offset) letters * @param (int) $offset offset intiger * @return (bool) Result */ private static function getStemM($offset){ $stem = self::getSubString($offset); preg_match_all(PorterStemmer::$regexVC, $stem, $matched); return sizeOf($matched[1]); } /** * check whether the last letters of the substring * without the last ($offset) letters matches $chLetter * @param (int) $offset offset intiger * @param (string) $Letter String to check * @return (bool) Result */ private static function stemEndWithLetter($offset, $Letter){ $stem = self::getSubString($offset); return (substr($stem, -1 ,1) == $Letter); } /** * check whether the substring without the last ($offset) letters * contains a vowel * @param (int) $offset offset intiger * @return (bool) Result */ private static function stemContainVowel($offset){ $stem = self::getSubString($offset); return preg_match(self::$regexVowel, $stem); } /** * check whether the last letters of the substring * without the last ($offset) letters matches double Consonant * @param (int) $offset offset intiger * @return (bool) Result */ private static function stemEndWithCC($offset){ $stem = self::getSubString($offset); $temp1 = substr($stem, -1, 1); $temp2 = substr($stem, -2, 1); return (($temp1==$temp2) && (preg_match(self::$regexConsonant, $temp1))); } /** * check whether the last letters of the substring * without the last ($offset) letters matches CVC * @param (int) $offset offset intiger * @return (bool) Result */ private static function stemEndWithCVC($offset){ $stem = self::getSubString($offset); $temp = substr($stem, -3, 3); return (preg_match(self::$regexCVC, $temp)); } } ?>