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?