sql >> Databáze >  >> RDS >> Mysql

php (fuzzy) hledání shody

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?



  1. Jak mohu zřetězit řetězce z poddotazu do jednoho řádku v mysql?

  2. Vložit blob do databáze Oracle pomocí C#

  3. Cheat Sheet pro výkon pro PostgreSQL

  4. aktualizace řádků namísto vytváření nové databáze záznamů pro Android