Desafortunadamente, hacer esto en PHP es prohibitivamente costoso (alta utilización de CPU y memoria). Sin embargo, ciertamente puede aplicar el algoritmo a pequeños conjuntos de datos.
Para ampliar específicamente cómo puede crear un colapso del servidor:un par de funciones PHP integradas determinarán la "distancia" entre las cadenas:levenshtein y texto_similar .
Datos ficticios:(finja que son titulares de noticias)
$titles = <<< EOF Apple Apples Orange Oranges Banana EOF;$titles = explode("\n", $titles );
En este punto, $titles debería ser solo una matriz de cadenas. Ahora, crea una matriz y compara cada titular con TODOS los demás titulares para ver si hay similitudes. En otras palabras, para 5 titulares, obtendrá una matriz de 5 x 5 (25 entradas). Ahí es donde entra la CPU y el sumidero de memoria.
Es por eso que este método (a través de PHP) no se puede aplicar a miles de entradas. Pero si quisieras:
$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 ); }
En este punto, lo que básicamente tiene es una matriz con "distancias de texto". En concepto (no en datos reales) se parece a esta tabla a continuación. Tenga en cuenta que hay un conjunto de valores 0 que van en diagonal, lo que significa que en el bucle coincidente, dos palabras idénticas son... bueno, idénticas.
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
La matriz real de $coincidencias se parece a esto (truncada):
Array ( [Apple] => Array ( [Apple] => 0 [Apples] => 1 [Orange] => 5 [Banana] => 6 [Oranges] => 6 ) [Apples] => Array ( ...
De todos modos, depende de usted (mediante la experimentación) determinar qué un buen límite numérico de distancia podría coincidir en su mayoría, y luego aplicarlo. De lo contrario, lea sphinx-search y utilícelo, ya que tiene bibliotecas PHP.
Naranja, ¿te alegra haber preguntado sobre esto?