php (нечеткое) поисковое соответствие

если кто-либо когда-либо отправлял историю digg, это проверяет, отправлена ли история уже, я принимаю нечетким поиском.

Я хотел бы реализовать что-то подобное и хотеть знать, используют ли они php класс, который является открытым исходным кодом?

Soundex не делает его, предложения/строки могут составить 250chars в длине

7
задан chris 8 July 2010 в 23:16
поделиться

3 ответа

Вы можете (в зависимости от размера вашего набора данных) использовать поиск mySQL FULLTEXT и искать элементы, которые имеют высокий балл и находятся в пределах определенного периода времени, и предлагать это / эти пользователю.

Подробнее об оценке здесь: Объяснение оценки полнотекстового поиска MySQL

1
ответ дан 7 December 2019 в 05:17
поделиться

К сожалению, выполнение этого в PHP непомерно дорого (высокая загрузка ЦП и памяти). Однако вы, безусловно, можете применить алгоритм к небольшим наборам данных.

Чтобы подробно рассказать о том, как можно создать отказ сервера: пара встроенных функций PHP будет определять «расстояние» между строками: levenshtein и similar_text .

Фиктивные данные: (представьте, что это заголовки новостей)

$titles = <<< EOF
Apple
Apples
Orange
Oranges
Banana
EOF;

$titles = explode("\n", $titles );

На этом этапе $ title должен быть просто массивом строк. Теперь создайте матрицу и сравните каждый заголовок с КАЖДЫМ другим заголовком на предмет сходства. Другими словами, для 5 заголовков вы получите матрицу 5 x 5 (25 записей). Вот где задействованы ЦП и приемник памяти.

Вот почему этот метод (через PHP) не может быть применен к тысячам записи. Но если вы хотите:

$matches = array();
foreach( $titles as $title ) {
    $matches[$title] = array();
    foreach( $titles as $compare_to ) {
        $matches[$title][$compare_to] = levenshtein( $compare_to, $title );
    }
    asort( $matches[$title], SORT_NUMERIC  );
}

На данный момент у вас в основном есть матрица с «текстовыми расстояниями». Концептуально (не в реальных данных) это выглядит примерно так, как в приведенной ниже таблице.Обратите внимание, как есть набор из 0 значений, идущих по диагонали - это означает, что в цикле сопоставления два идентичных слова - ну, идентичны.

       Apple Apples Orange Oranges Banana
Apple    0     1      5      6       6
Apples   1     0      6      5       6
Orange   5     6      0      1       5
Oranges  6     5      1      0       5
Banana   6     6      5      5       0

Фактический массив $ match выглядит примерно так (усеченный):

Array
(
    [Apple] => Array
        (
            [Apple] => 0
            [Apples] => 1
            [Orange] => 5
            [Banana] => 6
            [Oranges] => 6
        )

    [Apples] => Array
        (
      ...

В любом случае, вам решать (экспериментально) определить, какому хорошему числовому отсечению расстояния может в основном соответствовать - и затем применить его. В противном случае прочтите sphinx-search и используйте его, поскольку в нем есть библиотеки PHP.

Orange, вы рады, что спросили об этом?

5
ответ дан 7 December 2019 в 05:17
поделиться

Я бы посоветовал взять отправленные пользователями URL-адреса и хранить их в нескольких частях; доменное имя, путь и строка запроса. Используйте функцию PHP parse_url () для получения частей отправленного URL.

Индексируйте хотя бы доменное имя и путь. Затем, когда новый пользователь отправляет URL-адрес, вы ищите в своей базе данных запись, соответствующую домену и пути. Поскольку столбцы проиндексированы, вы сначала отфильтруете все записи, которые не находятся в том же домене, а затем выполните поиск по оставшимся записям. В зависимости от вашего набора данных это должно быть быстрее, чем простая индексация всего URL. Убедитесь, что ваше предложение WHERE настроено в правильном порядке.

Если это не соответствует вашим потребностям, я бы посоветовал попробовать Sphinx. Sphinx - это система полнотекстового поиска на базе SQL с открытым исходным кодом, которая намного быстрее, чем встроенный полнотекстовый поиск в MySQL. Он поддерживает стемминг и некоторые другие полезные функции.

http://sphinxsearch.com/

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

2
ответ дан 7 December 2019 в 05:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: