За съжаление, правенето на това в PHP е непосилно скъпо (високо използване на процесора и паметта). Въпреки това, със сигурност можете да приложите алгоритъма към малки набори от данни.
За да разширите конкретно как можете да създадете срив на сървъра:няколко вградени PHP функции ще определят "разстоянието" между низовете:levenshtein и подобен_текст .
Фиктивни данни:(преструвайте се, че са заглавия на новини)
$titles = <<< EOF Apple Apples Orange Oranges Banana EOF;$titles = explode("\n", $titles );
В този момент $titles трябва да бъде просто масив от низове. Сега създайте матрица и сравнете всяко заглавие с ВСЯКО друго заглавие за сходство. С други думи, за 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
Действителният масив $matches изглежда така (съкратено):
Array ( [Apple] => Array ( [Apple] => 0 [Apples] => 1 [Orange] => 5 [Banana] => 6 [Oranges] => 6 ) [Apples] => Array ( ...
Както и да е, от вас зависи (чрез експериментиране) да определите на какво най-вече може да съвпадне едно добро цифрово прекъсване на разстоянието - и след това да го приложите. В противен случай прочетете sphinx-search и го използвайте - тъй като има PHP библиотеки.
Orange, радваш ли се, че попита за това?