Intereting Posts
Как преобразовать строку запроса в URI сегмента? Измените размер изображения без искажения, сохраняя пропорции, а затем избыток урожая с помощью WideImage Почему PHP назначает контекст вызову статического метода и не дает уведомления E_STRICT? Проверка входа пользователя при определенных условиях Кодировать URL из C #, расшифровывать URL-адрес в PHP (добавляются дополнительные символы) как подсчитать посетителей сайта с помощью java-скрипта или php Передача объекта в массив – странное поведение Как сделать аутентификацию с помощью SOAP? softlayer api: как получить дополнительные адреса виртуальной машины Получить подсчитанный массив для документа Получение числовых символов из строки Заполнить флажок из массива Как найти положение пробела с регулярным выражением Ошибка PHPMailer с вызовом неопределенного метода PHPMailer :: SetFrom () отправка формы, когда установлен флажок

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

если кто-либо когда-либо подавал историю в 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, встроенный в полнотекстовый поиск. Он поддерживает создание и некоторые другие приятные функции.

http://sphinxsearch.com/

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

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

Подробнее о баллах здесь: MySQL Fulltext Search Score Explained