Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 30 |
| iaBestMatch | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
210.00 | |
0.00% |
0 / 30 |
| set_possibleWords | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 5 |
|||
| set_minimumScore | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 2 |
|||
| quizoDecir | |
0.00% |
0 / 1 |
110.00 | |
0.00% |
0 / 20 |
|||
| equalizeWord | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 3 |
|||
| <?php | |
| /** | |
| * @author Informática Asocaida SA de CV | |
| * @version 1.0.0 | |
| * @copyright 2017 | |
| */ | |
| namespace ia\Lib; | |
| use ia\Util\Str; | |
| /** | |
| * Best match trying to offset common spanish misspellings | |
| * | |
| */ | |
| class iaBestMatch { | |
| protected $possibleStandarized = []; | |
| protected $palabraCache = []; | |
| protected $minimumScore = 0.8; | |
| /** | |
| * iaBestMatch::set_possibleWords() | |
| * | |
| * @param array $possibleWords | |
| * @return void | |
| */ | |
| public function set_possibleWords($possibleWords) { | |
| $this->possibleStandarized = []; | |
| foreach($possibleWords as $key => $word) { | |
| $this->possibleStandarized[$key] = ['id' => $key, 'palabra' => $word, 'standarized' => $this->equalizeWord($word)]; | |
| } | |
| $this->palabraCache = []; | |
| } | |
| /** | |
| * iaBestMatch::set_minimumScore() | |
| * | |
| * @param float $minimumScore | |
| * @return void | |
| */ | |
| public function set_minimumScore($minimumScore) { | |
| $this->minimumScore = $minimumScore; | |
| } | |
| /** | |
| * Quizo decir?, regresa la palabra mas cercana o null | |
| * | |
| * @param string $palabra | |
| * @return array La palabra mas cercana a $palabra o null [id=>key en possibleWords, 'palabra'=>'La palabra en possible words', 'standarized'=>'ajustada para buscar'] | |
| */ | |
| public function quizoDecir($palabra) { | |
| if(empty($palabra) || empty($this->possibleWords)) { | |
| return null; | |
| } | |
| // standarize word | |
| $checkWord = $this->equalizeWord($palabra); | |
| // check Cache | |
| if(!empty($palabraCache[$checkWord])) { | |
| return $palabraCache[$checkWord]; | |
| } | |
| // find best match | |
| $bestScore = 0; | |
| foreach($this->possibleStandarized as $key => $wordInfo) { | |
| if(strcasecmp($palabra, $wordInfo['palabra']) === 0) { | |
| return $palabraCache[$checkWord] = $wordInfo; | |
| } | |
| if(strcasecmp($checkWord, $wordInfo['palabra']) === 0) { | |
| return $palabraCache[$checkWord] = $wordInfo; | |
| } | |
| if($palabra !== $possible) { | |
| $levenshtein = new \Oefenweb\DamerauLevenshtein\DamerauLevenshtein($checkWord, $wordInfo['standardized']); | |
| $score = $levenshtein->getRelativeDistance(); | |
| if($score > $bestScore ) { | |
| $bestScore = $score; | |
| $bestWord = $wordInfo; | |
| } | |
| } | |
| } | |
| // Cache and return | |
| if($bestScore >= $this->minimumScore) { | |
| return $palabraCache[$checkWord] = $bestWord; | |
| } | |
| return $palabraCache[$checkWord] = null; | |
| } | |
| /** | |
| * @param string $palabra | |
| * @return string | |
| */ | |
| protected function equalizeWord($palabra) { | |
| static $find = array('z', 'v', 'ce', 'ci', 'lt', 'lb', 'zt', 'h'); | |
| static $replace = array('s', 'b', 'se', 'si', 'tl', 'bl', 'tz', ''); | |
| return str_replace($find, $replace, Str::standardize($palabra) ); | |
| } | |
| } |