если кто-либо когда-либо подавал историю в digg, он проверяет, уже ли отправлена история, я предполагаю нечеткий поиск.
Я хотел бы реализовать что-то подобное и хочу знать, используют ли они php-класс с открытым исходным кодом?
Soundex не делает этого, предложения / строки могут быть до 250chars в длину
К сожалению, делать это на PHP является чрезмерно дорогостоящим (высокая загрузка процессора и памяти). Однако вы можете, конечно, применить алгоритм к небольшим наборам данных.
Чтобы конкретно рассказать о том, как вы можете создать кризис сервера: пара встроенных функций PHP определит «расстояние» между строками: levenshtein и similar_text .
Даммические данные: (притворяйтесь, что это новостные заголовки)
$ titles = <<< EOF яблоко яблоки оранжевый апельсины Банан EOF;
$ titles = explode ("\ n", $ titles);
На данный момент, $ titles должен быть просто массивом строк. Теперь создайте матрицу и сравните каждый заголовок с КАЖДОЙ другой заголовок для сходства. Другими словами, для 5 заголовков вы получите матрицу размером 5 х 5 (25 записей). Здесь идет загрузка процессора и памяти.
Вот почему этот метод (через PHP) не может применяться к тысячам записей. Но если вы хотели:
$ matches = array (); foreach ($ title как $ title) { $ matches [$ title] = array (); foreach ($ title как $ compare_to) { $ matches [$ title] [$ compare_to] = levenshtein ($ compare_to, $ title); } asort ($ matches [$ title], SORT_NUMERIC); }
На данный момент у вас в основном есть матрица с «текстовыми расстояниями». В концепции (не в реальных данных) она выглядит примерно так, как в приведенной ниже таблице. Обратите внимание на то, что существует набор значений 0, которые идут по диагонали – это означает, что в цикле соответствия два одинаковых слова – ну, идентичны.
Яблочные яблоки Оранжевые апельсины Банан Apple 0 1 5 6 6 Яблоки 1 0 6 5 6 Оранжевый 5 6 0 1 5 Апельсины 6 5 1 0 5 Банан 6 6 5 5 0
Фактический массив $ matches выглядит примерно так (усеченный):
массив ( [Apple] => Массив ( [Apple] => 0 [Яблоки] => 1 [Оранжевый] => 5 [Банан] => 6 [Апельсины] => 6 ) [Яблоки] => Массив ( ...
Во всяком случае, вам решать (путем экспериментов) определить, какое хорошее числовое перекрытие расстояния может в основном совпадать, – а затем применить его. В противном случае, прочитайте на sphinx-search и используйте его – поскольку в нем есть библиотеки PHP.
Оранжевый ты рад, что ты спросил об этом?
Я бы предложил взять URL-адреса пользователей и сохранить их в нескольких частях; имя домена, путь и строку запроса. Используйте функцию parse_url () PHP для получения частей представленного URL-адреса.
Укажите хотя бы доменное имя и путь. Затем, когда новый пользователь отправляет URL-адрес, вы просматриваете свою базу данных для записи, соответствующей домену и пути. Поскольку столбцы индексируются, вы сначала отфильтровываете все записи, которые не находятся в одном домене, а затем просматриваете оставшиеся записи. В зависимости от вашего набора данных это должно быть быстрее, просто индексируя весь URL. Убедитесь, что предложение WHERE настроено в правильном порядке.
Если это не соответствует вашим потребностям, я бы предложил попробовать Сфинкс. Sphinx – это полнотекстовый поисковый движок с открытым исходным кодом, который намного быстрее, чем MySQL, встроенный в полнотекстовый поиск. Он поддерживает создание и некоторые другие приятные функции.
Вы также можете взять заголовок или текстовый контент представления пользователей, запустить его через функцию для генерации ключевых слов и выполнить поиск в базе данных для существующих записей с теми или аналогичными ключевыми словами.
Вы можете (в зависимости от размера вашего набора данных) использовать поиск по FULLTEXT mySQL и искать элементы, которые имеют высокий балл и находятся в определенном таймфрейме, и предлагать это / им пользователю.
Подробнее о баллах здесь: MySQL Fulltext Search Score Explained