php (fuzzy) поиск соответствия - PullRequest
6 голосов
/ 09 июля 2010

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

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

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

Ответы [ 3 ]

5 голосов
/ 09 августа 2010

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

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

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

$titles = <<< EOF
Apple
Apples
Orange
Oranges
Banana
EOF;</p>

<p>$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, вы рады, что спросили об этом?

2 голосов
/ 10 августа 2010

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

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

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

http://sphinxsearch.com/

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

0 голосов
/ 09 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...