За последние 24 часа нас посетил 17791 программист и 1646 роботов. Сейчас ищут 960 программистов ...

Сравнение строк на похожесть по тексту

Тема в разделе "PHP для новичков", создана пользователем VLK, 3 авг 2014.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Смотрите есть входная строка и есть массив строк, надо сравнить входную строку со всеми элементами массива и выдать результат какие элементы и на сколько схожи с входной строкой (ну или просто показать какой элемент больше всего схож с входной строкой)

    В MySQL такое можно сделать следующим образом:
    при создании таблицы тот столбец по которому надо осуществлять поиск указать как FULLTEXT, так:
    Код (Text):
    1. CREATE TABLE pages (
    2. id BIGINT(20) unsigned NOT NULL auto_increment primary key,
    3. content TEXT NOT NULL,
    4. FULLTEXT (content)
    5. )
    потом такой запрос составить:
    Код (Text):
    1. "SELECT * FROM `pages` WHERE MATCH (content) AGAINST ('?')" // за место ? входная строка
    А есть встроенные функции реализующие подобное в РНР? и если нет, то как бы вы реализовали подобное?
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    in_array
     
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Интересует НЕ точное сравнение (я почему завел речь об MySQL)

    Добавлено спустя 24 минуты 57 секунд:
    Я так понимаю это что то из разряда - Алгоритм шинглов

    Вопрос, есть ли встроенная функция осуществляющая такое, есть ли еще какие то алгоритмы кроме шинглов

    Добавлено спустя 49 минут 23 секунды:
    Выискал такие функции: similar_text и levenshtein, но levenshtein не очень, далеко не так как надо работает.
     
  4. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    он же не работает с русским языком, возвращает всегда 0000.

    Я так понял тут одной функцией не обойтись.

    Вообще similar_text мне от части подходит, но тут проблема, она возвращает 2 значения, просто цифры и в процентном соотношении, так вот бывает такое что в одном случае эти цифры показывают то что надо, а вот проценты нет, и на оборот цифры врут, а вот проценты то что надо, зашел на доску объявлений, срисовал название некоторых разделов, ищу допустим - бизнес услуги, результат такой:
    а по процентам:
    автозапчасти:
    причем тут Животные и растения я вообще не понимаю.

    и еще какая то была фраза, сейчас не могу вспомнить, она совпадала с тем, что надо так: по цифрам она была где то в конце, а по процентам как раз 80%
     
  6. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    А! блин. Задача не простая.
    Если тебе нужен сгодный инструмент, тут капец какая запара будет.

    Считать слова и сравнивать, если равно, смотрим по буквам, сначала по 1, потом по 2, потом по 3 и т. д.
    Потом смотрим сколько операции по словам было выполнено и по буквам (в возрастающем порядке) которые равны и если они не совпадают с количеством " которое можно сделать на приходящей строке ", то от суда можно вычислить уже цифру от 100% " имеющем на приходящей строке операций ", а потом вернуть, что нужно.
     
  7. xobotyi

    xobotyi Новичок

    С нами с:
    18 авг 2013
    Сообщения:
    10
    Симпатии:
    0
    Вы наверное не поняли что возвращает функция similar_text.
    Значение которое возвращает функция количество совпавших символов, вне зависимости от количество совпадений, т.е.:
    Код (Text):
    1.  
    2.     $text1 = "oo";
    3.     $text2 = "ao";
    4.  
    5.     $pres = 0;
    6.     $res  = similar_text ( $text1, $text2, $pres );
    7.     // $res = 1
    8.     // $pres = 50
    т.е. получается что совпала буква "o", поэтому функция вернула 1, а в третий параметр было передано процентное сходство: 50% - из двух букв различается одна.

    как раз сходство "как есть" начинается минимум с 80%, ибо:
    Код (Text):
    1.  
    2.     $text1 = "торт";
    3.     $text2 = "трот";
    4.  
    5.     $pres = 0;
    6.     $res  = similar_text ( $text1, $text2, $pres );
    7.     // $res = 4
    8.     // $pres = 75
    да просто это скорее всего не органическая выдача, реклама короче.