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?