你可以音譯詞拉丁字符和使用語音算法像Soundex從你的單詞中獲得本質並將它與你所擁有的相比較。在你的情況下,除了最後一個是C250
之外,你的所有單詞都是C252
。
編輯與像levenshtein
或similar_text
比較功能的問題是,需要調用它們的每對輸入值和可能的匹配值的。這意味着如果你有一個有100萬條記錄的數據庫,你將需要調用這些函數100萬次。
但功能soundex
或metaphone
,計算某種摘要,可以幫助減少實際比較的數量。如果存儲數據庫中每個已知單詞的soundex
或metaphone
值,則可以非常快地減少可能的匹配數。之後,當可能的匹配值的集合減少時,則可以使用比較函數來獲得最佳匹配。
下面是一個例子:
// building the index that represents your database
$knownWords = array('Čakánka', 'Cakaka');
$index = array();
foreach ($knownWords as $key => $word) {
$code = soundex(iconv('utf-8', 'us-ascii//TRANSLIT', $word));
if (!isset($index[$code])) {
$index[$code] = array();
}
$index[$code][] = $key;
}
// test words
$testWords = array('cakanka', 'cákanká', 'ČaKaNKA', 'CAKANKA', 'CAAKNKA', 'CKAANKA', 'cakakNa');
echo '<ul>';
foreach ($testWords as $word) {
$code = soundex(iconv('utf-8', 'us-ascii//TRANSLIT', $word));
if (isset($index[$code])) {
echo '<li> '.$word.' is similar to: ';
$matches = array();
foreach ($index[$code] as $key) {
similar_text(strtolower($word), strtolower($knownWords[$key]), $percentage);
$matches[$knownWords[$key]] = $percentage;
}
arsort($matches);
echo '<ul>';
foreach ($matches as $match => $percentage) {
echo '<li>'.$match.' ('.$percentage.'%)</li>';
}
echo '</ul></li>';
} else {
echo '<li>no match found for '.$word.'</li>';
}
}
echo '</ul>';
口音都沒有問題,我會做的第一件事就是'uppercase'的字符串,然後替換的重音字符與非重音版本('ž'=>'z') –
我只是可能檢查你,其中一個功能將是有益的,我100%確定。 –
出於好奇,當你說「其中一個功能」時,你究竟在考慮哪一個? levenshtein之一,還是另一個? –