Niestety, robienie tego w PHP jest nadmiernie kosztowne (wysokie wykorzystanie procesora i pamięci). Jednak z pewnością możesz zastosować algorytm do małych zestawów danych.
Aby szczegółowo rozwinąć, w jaki sposób można utworzyć awarię serwera:kilka wbudowanych funkcji PHP określi „odległość” między ciągami:levenshtein i podobny_tekst .
Fikcyjne dane:(udawaj, że to nagłówki wiadomości)
$titles = <<< EOF Apple Apples Orange Oranges Banana EOF;$titles = explode("\n", $titles );
W tym momencie $titles powinna być po prostu tablicą ciągów. Teraz utwórz macierz i porównaj każdy nagłówek z KAŻDYM innym nagłówkiem pod kątem podobieństwa. Innymi słowy, w przypadku 5 nagłówków otrzymasz macierz 5 x 5 (25 wpisów). To właśnie tam trafia procesor i ujście pamięci.
Dlatego ta metoda (poprzez PHP) nie może być zastosowana do tysięcy wpisów. Ale jeśli chcesz:
$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 );
} W tym momencie masz w zasadzie macierz z „odległościami tekstu”. W koncepcji (nie w rzeczywistych danych) wygląda to tak, jak ta tabela poniżej. Zwróć uwagę, że istnieje zestaw wartości 0, które biegną po przekątnej - oznacza to, że w pętli dopasowywania dwa identyczne słowa są - no cóż, identyczne.
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
Rzeczywista tablica $matches wygląda mniej więcej tak (obcięta):
Array
(
[Apple] => Array
(
[Apple] => 0
[Apples] => 1
[Orange] => 5
[Banana] => 6
[Oranges] => 6
)
[Apples] => Array
(
...
W każdym razie od Ciebie zależy (poprzez eksperymentowanie) określenie, do czego może pasować dobre liczbowe odcięcie odległości – a następnie zastosowanie go. W przeciwnym razie przeczytaj o sphinx-search i użyj go - ponieważ ma biblioteki PHP.
Orange, cieszysz się, że o to pytałeś?