За последние 24 часа нас посетили 17664 программиста и 1595 роботов. Сейчас ищут 1614 программистов ...

Псевдолевенштейн

Тема в разделе "Решения, алгоритмы", создана пользователем armadillo, 12 янв 2009.

  1. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    В былые времена мужик мне показывал свою функцию (сейчас с ним потеряна связь), которая создает для поля/ей ФИО число для сортировки так, что Абдурахманов и Пдурахманов находились рядом, а в основном сортировка совпадала с алфавитной. У него было что-то свое и очень простое, что-то типа суммы квадратов или произведения букв друг на друга.
    Левенштейн отличается тем, что он сравнивает две строки, а тут поле сорт и заполняется заранее при добавлении, независимо от других.
    Цель - автоматом демонстрировать опечатки ввода.

    Сам левенштейн для сравнения с пустой строкой не подходит
    PHP:
    1.  
    2. <?php
    3. function sortf($str) {
    4. $base='';
    5. return levenshtein  ($base  , $str  );
    6. }
    7. $a=array('Абдурахманов','Пдурахманов','Абдулаев','башибузуков','Васильков','пешеходов');
    8. $b=array();
    9. foreach ($a as $c) {
    10.     $b[$c]=sortf($c);
    11. }
    12. echo '<pre>';
    13. print_r($b);
    14. echo '</pre>';
    15. ?>
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Я нечто подобное делал на сайте с каптчами (когда вводишь сайт и ошибаешься, то выдает наиболее подходящий вариант из базы). Правда алгоритм достаточно неточен, но, вроде бы работает =)
    А сам алгоритм прост -- у каждого слова есть вес, вес этот составляется на сравнении вводимого и существующего: если схожи три буквы, то +1 к слову в базе, если схожи 2 буквы, то снова +1, ну и по одной. У кого самый большой вес, тот и наиболее подходит. Можно за три буквы три балла давать, думаю, что так лучше даже будет.
    Не знаю, на сколько это поможет в данной ситуации)
     
  3. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
  4. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Нет, срс32 не покатит.
    попробуем так:
    сделаем близкими фамилии с одинаковыми длинами.
    PHP:
    1. </php
    2. function sort($str) {
    3. $n=0;
    4. for($i=0;$i<strlen($str);$i++) {
    5.     $n+=(ord($str{$i})+1000);
    6. }
    7. return $n;
    8. }
    9. ?>
    правда, если в поле не только фамилии - то надо наверно обрезать по длине, точнее по первому пробелу.
     
  5. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    ну и? это не о том