Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 30
iaBestMatch
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
210.00
0.00% covered (danger)
0.00%
0 / 30
 set_possibleWords
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 5
 set_minimumScore
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 quizoDecir
0.00% covered (danger)
0.00%
0 / 1
110.00
0.00% covered (danger)
0.00%
0 / 20
 equalizeWord
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
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) );
    }
}