Desafortunadamente, hacer esto en PHP es prohibitivamente caro Sin embargo, ciertamente puede aplicar el algoritmo para pequeños conjuntos de datos (alta utilización de CPU y de memoria.).
Para ampliar específicamente en cómo se puede crear una fusión servidor: par de funciones integradas de PHP va a determinar la "distancia" entre las cuerdas: levenshtein y similar_text.
Maniquí de datos: (pretenden ser titulares de noticias)
$titles = <<< EOF
Apple
Apples
Orange
Oranges
Banana
EOF;
$titles = explode("\n", $titles);
En este punto, $ títulos solo debe ser una matriz de cadenas. Ahora, crea una matriz y compara cada titular con CADA otro título para ver si hay similitud. En otras palabras, para 5 titulares, obtendrá una matriz 5 x 5 (25 entradas). Ahí es donde entra la CPU y el receptor de memoria.
Es por eso que este método (a través de PHP) no se puede aplicar a miles de entradas Pero si quisiera:
$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 ve más o menos como en esta tabla a continuación. Tenga en cuenta que hay un conjunto de 0 valores que van en diagonal, lo que significa que en el ciclo de coincidencia, 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
El $ real coincida con arreglo parece algo como esto (truncada):
Array
(
[Apple] => Array
(
[Apple] => 0
[Apples] => 1
[Orange] => 5
[Banana] => 6
[Oranges] => 6
)
[Apples] => Array
(
...
De todos modos, le toca a usted para (mediante experimentación) determinar que una buena distancia numérica de corte podría mayormente partido - y luego aplicarlo. De lo contrario, lea en sphinx-search y úselo, ya que tiene librerías PHP.
Naranja, ¿te alegras de haber preguntado por esto?
¿Estás seguro de que no solo coinciden con el título o la URL? ... He tenido un gran éxito con la fórmula de Levenshtein, pero estoy seguro de que comenzaría a fallar con grandes conjuntos de datos. – Fosco
lo estoy intentando ahora, pero estoy pensando que podría derretir una cuenta de alojamiento barata con cualquier tipo de tracción – chris