За съжаление, правенето на това в 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, радваш ли се, че попита за това?