Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

correspondência de pesquisa php (difusa)


Infelizmente, fazer isso em PHP é proibitivamente caro (alta utilização de CPU e memória). No entanto, você certamente pode aplicar o algoritmo a pequenos conjuntos de dados.

Para expandir especificamente como você pode criar um colapso do servidor:algumas funções internas do PHP determinarão a "distância" entre as strings:levenshtein e texto_similar .

Dados fictícios:(finja que são manchetes de notícias)
$titles = <<< EOF
Apple
Apples
Orange
Oranges
Banana
EOF;

$titles = explode("\n", $titles );


Neste ponto, $titles deve ser apenas um array de strings. Agora, crie uma matriz e compare cada título com TODOS os outros títulos para similaridade. Em outras palavras, para 5 títulos, você obterá uma matriz 5 x 5 (25 entradas). É aí que entram a CPU e o dissipador de memória.

É por isso que este método (via PHP) não pode ser aplicado a milhares de entradas. Mas se você quiser:
$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  );
}

Neste ponto, o que você basicamente tem é uma matriz com "distâncias de texto". Em conceito (não em dados reais), parece com esta tabela abaixo. Observe como há um conjunto de valores 0 que vão diagonalmente - isso significa que no loop correspondente, duas palavras idênticas são - bem, idênticas.
       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


O array $matches real se parece com isso (truncado):
Array
(
    [Apple] => Array
        (
            [Apple] => 0
            [Apples] => 1
            [Orange] => 5
            [Banana] => 6
            [Oranges] => 6
        )

    [Apples] => Array
        (
      ...

De qualquer forma, cabe a você (por experimentação) determinar o que um bom corte de distância numérica pode corresponder principalmente - e depois aplicá-lo. Caso contrário, leia o sphinx-search e use-o - já que ele possui bibliotecas PHP.

Orange, você está feliz por ter perguntado sobre isso?