К сожалению, делать это в PHP непозволительно дорого (высокая загрузка ЦП и памяти.) Однако вы, безусловно, можете применить алгоритм к небольшим наборам данных.
Чтобы конкретно рассказать о том, как вы можете создать распад сервера: пара встроенных функций PHP будет определять «расстояние» между строками: Левенштейн и Similar_text .
Фиктивные данные: (представьте, что они заголовки новостей)
$titles = <<< EOF
Apple
Apples
Orange
Oranges
Banana
EOF;</p>
<p>$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, вы рады, что спросили об этом?