если кто-либо когда-либо отправлял историю digg, это проверяет, отправлена ли история уже, я принимаю нечетким поиском.
Я хотел бы реализовать что-то подобное и хотеть знать, используют ли они php класс, который является открытым исходным кодом?
Soundex не делает его, предложения/строки могут составить 250chars в длине
Вы можете (в зависимости от размера вашего набора данных) использовать поиск mySQL FULLTEXT и искать элементы, которые имеют высокий балл и находятся в пределах определенного периода времени, и предлагать это / эти пользователю.
Подробнее об оценке здесь: Объяснение оценки полнотекстового поиска MySQL
К сожалению, выполнение этого в 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, вы рады, что спросили об этом?
Я бы посоветовал взять отправленные пользователями URL-адреса и хранить их в нескольких частях; доменное имя, путь и строка запроса. Используйте функцию PHP parse_url () для получения частей отправленного URL.
Индексируйте хотя бы доменное имя и путь. Затем, когда новый пользователь отправляет URL-адрес, вы ищите в своей базе данных запись, соответствующую домену и пути. Поскольку столбцы проиндексированы, вы сначала отфильтруете все записи, которые не находятся в том же домене, а затем выполните поиск по оставшимся записям. В зависимости от вашего набора данных это должно быть быстрее, чем простая индексация всего URL. Убедитесь, что ваше предложение WHERE настроено в правильном порядке.
Если это не соответствует вашим потребностям, я бы посоветовал попробовать Sphinx. Sphinx - это система полнотекстового поиска на базе SQL с открытым исходным кодом, которая намного быстрее, чем встроенный полнотекстовый поиск в MySQL. Он поддерживает стемминг и некоторые другие полезные функции.
Вы также можете взять заголовок или текстовое содержимое представления пользователей, запустить его через функцию генерации ключевых слов и выполнить поиск в базе данных для существующих записей с этими или похожими ключевыми словами.