Soundex: различия между версиями
[непроверенная версия] | [непроверенная версия] |
CiaPan (обсуждение | вклад) м <source lang="perl"> |
|||
Строка 16: | Строка 16: | ||
my($result) = "0000"; |
my($result) = "0000"; |
||
my($idx,$prev,$perhaps,$thechar); |
my($idx,$prev,$perhaps,$thechar); |
||
$useword =~ tr/ //d; # rid spaces |
$useword =~ tr/ //d; # rid spaces |
||
$useword = lc($useword); # lower-case for consistency |
$useword = lc($useword); # lower-case for consistency |
||
Строка 22: | Строка 22: | ||
return($result); |
return($result); |
||
} |
} |
||
$result = substr($useword,0,1); # first letter |
$result = substr($useword,0,1); # first letter |
||
$prev = "0"; |
$prev = "0"; |
||
Строка 42: | Строка 42: | ||
$idx++; |
$idx++; |
||
} #endwhile |
} #endwhile |
||
$result .= "0000"; # pad with zeros to ensure min length |
$result .= "0000"; # pad with zeros to ensure min length |
||
$result = substr($result,0,4); # only return first four |
$result = substr($result,0,4); # only return first four |
Версия от 16:18, 22 марта 2009
Soundex — алгоритм сравнения двух строк по их звучанию. Он устанавливает одинаковый индекс для строк имеющих схожее звучание.
Этот алгоритм имеет сильную зависимость от языка, слова которого сравниваются.
Soundex был разработан Робертом Расселлом (Robert Russel) и Маргарет Обелл (Margaret Obell) и запатентован в 1918 и 1922 годах (U.S. Patent 1,261,167 и U.S. Patent 1,435,663). Этот алгоритм стал популярным в 1960-х годах после того как стал темой нескольких статей в журналах «Communications of the Association for Computing» и «Journal of the Association for Computing Machinery» (CACM и JACM). Еще большую популярность этот алгоритм получил после того как был опубликован в книге Дональда Кнута. Искусство программирования, том 1. Основные алгоритмы.
Пример исполнения
Ниже приведен пример реализации алгоритма на языке программирования Perl.
sub soundex { # return soundex code
my($useword) = $_[0];
my($result) = "0000";
my($idx,$prev,$perhaps,$thechar);
$useword =~ tr/ //d; # rid spaces
$useword = lc($useword); # lower-case for consistency
if (length($useword) < 1) {
return($result);
}
$result = substr($useword,0,1); # first letter
$prev = "0";
$idx = 1;
while ($idx <= length($useword)) {
$perhaps = "0";
$thechar = substr($useword,$idx - 1,1);
if (index("bfpv", $thechar) >= 0) { $perhaps = "1"; }
if (index("cgjkqsxz",$thechar) >= 0) { $perhaps = "2"; }
if (index("dt", $thechar) >= 0) { $perhaps = "3"; }
if (index("l", $thechar) >= 0) { $perhaps = "4"; }
if (index("mn", $thechar) >= 0) { $perhaps = "5"; }
if (index("r", $thechar) >= 0) { $perhaps = "6"; }
if ($perhaps != $prev && $perhaps != "0"
&& $idx != 1) { # avoid dups and ignore first
$result .= $perhaps;
}
$prev = $perhaps;
$idx++;
} #endwhile
$result .= "0000"; # pad with zeros to ensure min length
$result = substr($result,0,4); # only return first four
return($result);
}
Ссылки на попытки создания soundex для русского языка
http://community.livejournal.com/ru_php/1062493.html
http://kankowski.narod.ru/dev/metaphoneru.htm