Я разработал функцию для той же цели в PHP, потому что хотел посмотреть, смогу ли я использовать ее для анализа строк, чтобы выяснить, могут ли они быть спамом.
Это для клавиатуры QWERTZ, но ее можно легко изменить. Первое число в массиве $keys
— это приблизительное расстояние слева, а второе — номер строки сверху.
function string_distance($string){
$keys=array(
'q'=>array(1,1),
'w'=>array(2,1),
'e'=>array(3,1),
'r'=>array(4,1),
't'=>array(5,1),
'z'=>array(6,1),
'u'=>array(7,1),
'i'=>array(8,1),
'o'=>array(9,1),
'p'=>array(10,1),
'a'=>array(1.25,2),
's'=>array(2.25,2),
'd'=>array(3.25,2),
'f'=>array(4.25,2),
'g'=>array(5.25,2),
'h'=>array(6.25,2),
'j'=>array(7.25,2),
'k'=>array(8.25,2),
'l'=>array(9.25,2),
'y'=>array(1.85,3),
'x'=>array(2.85,3),
'c'=>array(3.85,3),
'v'=>array(4.85,3),
'b'=>array(5.85,3),
'n'=>array(6.85,3),
'm'=>array(7.85,3)
);
$string=preg_replace("/[^a-z]+/",'',mb_strtolower($string));
for($i=0;$i+1<mb_strlen($string);$i++){
$char_a=mb_substr($string,$i,1);
$char_b=mb_substr($string,$i+1,1);
$a=abs($keys[$char_a][0]-$keys[$char_b][0]);
$b=abs($keys[$char_a][1]-$keys[$char_b][1]);
$distance=sqrt($a^2+$b^2);
$distances[]=$distance;
}
return array_sum($distances)/count($distances);
}
Вы можете использовать его следующим образом.
string_distance('Boat') # output 2.0332570942187
string_distance('HDxtaBQrGkjny') # output 1.4580596252044
Я использовал многобайтовые функции, потому что думал о расширении их для других символов. Можно расширить его, проверив регистр символов.
person
B. Martin
schedule
30.06.2021