Purtroppo, a far questo in PHP è proibitivo Tuttavia, si può certamente applicare l'algoritmo di piccoli insiemi di dati (ad alto utilizzo della CPU e della memoria.).
Per espandere in particolare su come è possibile creare un tracollo server: paio di funzioni built-in PHP determinerà "distanza" tra le stringhe: levenshtein e similar_text.
Dummy dati: (finta sono titoli di notizie)
$titles = <<< EOF
Apple
Apples
Orange
Oranges
Banana
EOF;
$titles = explode("\n", $titles);
A questo punto, $ titoli dovrebbe essere solo un array di stringhe. Ora crea una matrice e confronta ogni titolo con OGNI altro titolo per similarità. In altre parole, per 5 titoli, otterrai una matrice 5 x 5 (25 voci). Ecco dove entra la CPU e il memory sink.
Ecco perché questo metodo (tramite PHP) non può essere applicato a migliaia di voci. Ma se si voleva:
$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 );
}
A questo punto quello che in fondo hai è una matrice con "distanze di testo." Nel concetto (non in dati reali) sembra un po 'come questa tabella qui sotto. Nota come c'è un insieme di valori 0 che vanno in diagonale - questo significa che nel ciclo di matching, due parole identiche sono - beh, identiche.
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
Il $ reale corrisponde gamma si presenta un po 'come questo (troncato):
Array
(
[Apple] => Array
(
[Apple] => 0
[Apples] => 1
[Orange] => 5
[Banana] => 6
[Oranges] => 6
)
[Apples] => Array
(
...
In ogni caso, è a voi (per la sperimentazione) determinare ciò che una buona distanza numerica cutoff potrebbe per lo più match - e poi applicarlo. Altrimenti, leggi su sphinx-search e usalo - dato che ha librerie PHP.
Orange sei contento di averlo chiesto?
Sei sicuro che non stanno solo abbinando il titolo o l'url? .. Ho avuto un grande successo con la formula di Levenshtein, ma sono sicuro che inizierebbe a fallire con i set di dati di grandi dimensioni. – Fosco
sto provando ora, ma sto pensando che si fonderebbe un account di hosting a basso costo con qualsiasi tipo di trazione – chris