Tyvärr är det oöverkomligt dyrt att göra detta i PHP (högt CPU- och minnesutnyttjande.) Men du kan säkert tillämpa algoritmen på små datamängder.
För att specifikt utöka hur du kan skapa en serverhärdsmälta:ett par inbyggda PHP-funktioner kommer att bestämma "avstånd" mellan strängar:levenshtein och similar_text .
Dummydata:(låtsas att det är nyhetsrubriker)
$titles = <<< EOF Apple Apples Orange Oranges Banana EOF;$titles = explode("\n", $titles );
Vid det här laget, $titles bör bara vara en rad strängar. Skapa nu en matris och jämför varje rubrik med VARJE annan rubrik för likheter. Med andra ord, för 5 rubriker får du en 5 x 5 matris (25 poster.) Det är där CPU- och minnessänkan går in.
Det är därför den här metoden (via PHP) inte kan tillämpas på tusentals poster. Men om du vill:
$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 ); }
Vid det här laget har du i princip en matris med "textavstånd". I konceptet (inte i verkliga data) ser det ut ungefär som den här tabellen nedan. Notera hur det finns en uppsättning 0-värden som går diagonalt - det betyder att i matchningsslingan är två identiska ord - ja, identiska.
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
Den faktiska $matches-arrayen ser ungefär ut så här (trunkerad):
Array ( [Apple] => Array ( [Apple] => 0 [Apples] => 1 [Orange] => 5 [Banana] => 6 [Oranges] => 6 ) [Apples] => Array ( ...
Hur som helst, det är upp till dig att (genom experiment) avgöra vad en bra numerisk avståndsgräns mestadels kan matcha - och sedan tillämpa den. Annars, läs upp på sphinx-search och använd den - eftersom den har PHP-bibliotek.
Orange är du glad att du frågade om detta?