Naneštěstí je to v PHP neúměrně drahé (vysoké využití CPU a paměti). Určitě však můžete algoritmus použít na malé datové sady.
Abychom konkrétně rozšířili, jak můžete vytvořit zhroucení serveru:"vzdálenost" mezi řetězci určí několik vestavěných funkcí PHP:levenshtein a similar_text .
Falešná data:(předstírat, že jde o novinové titulky)
$titles = <<< EOF Apple Apples Orange Oranges Banana EOF;$titles = explode("\n", $titles );
V tuto chvíli $titles by mělo být pouze polem řetězců. Nyní vytvořte matici a porovnejte každý nadpis s KAŽDÝM jiným nadpisem kvůli podobnosti. Jinými slovy, pro 5 titulků získáte matici 5 x 5 (25 záznamů). To je místo, kde se nachází CPU a paměťová jímka.
Proto tuto metodu (přes PHP) nelze aplikovat na tisíce záznamů. Ale pokud byste chtěli:
$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 ); }
V tomto okamžiku máte v podstatě matici s „vzdálenostmi textu“. V konceptu (nikoli v reálných datech) to vypadá asi jako tato tabulka níže. Všimněte si, že existuje sada 0 hodnot, které jdou diagonálně - to znamená, že ve slučovací smyčce jsou dvě identická slova -- no, identická.
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
Skutečné pole $matches vypadá asi takto (zkrácené):
Array ( [Apple] => Array ( [Apple] => 0 [Apples] => 1 [Orange] => 5 [Banana] => 6 [Oranges] => 6 ) [Apples] => Array ( ...
V každém případě je na vás, abyste (experimentováním) určili, čemu by se mohl dobrý numerický limit vzdálenosti nejvíce shodovat – a pak to použijete. V opačném případě si přečtěte o sphinx-search a použijte jej - protože má knihovny PHP.
Orange, jsi rád, že ses na to zeptal?