Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Porównanie ze sobą 2 fraz
Forum PHP.pl > Forum > PHP
sniver
Witam

Mam zagadnienie typu: "szukam i nie mogę nic znaleźć...". Więc pomysł jest następujący, zapamiętuję przy wyszukiwaniu szukane frazy. Narobiło sie ich około 2000 unikatowych wpisów. Teraz gdy ktoś wpisze powiedzmy "zabawka" to podpowiedz powie czy chodziło może o "zabawka pluszowa", a przy tym dowiąże konkretne rzeczy...

Ale co wtedy jeśli ktoś zamiast ta "zabawka" wpisze "zabaka"? Wiadomo że przy takim podejściu nic nie znajdzie. Znalazłem podejśćie w stylu porównywanie 2 ciągów znaków metoda ngram. Niestety tyle wiem co zjem, a na ten temat ciemniak ze mnie wielki. Na google znalazłem troche informacji, ale nadal nic z tego nie zrozumiałem.

Chciałbym by mi to działało w miare szybko, więc w gre wchodza wyłącznie operacje w bazie danych (procedury i funkcje sql). Czy ktoś zna sposób jak zrobić cos takiego:

1. Wpisałem "zabaka"
2. Funkcja lub procedura porównuje "zabaka" z "zabawka" i mówi że wpisana fraza jest podobna np. w 95%
3. Ponieważ prawdopodobieństwo że chodzi właśnie o tę frazę jest wysokie, podaje jak na tacy: "Czy chodziło może o: 'zabawka'?"

Jeśli to możliew proszę o pomoc. Wytrwale walcze z tym prawie miesiąc i chyba dostane apopleksji od tego sciana.gif

PS. Jeśli ktoś wie jak to zrobić w PHP niech mi też napisze winksmiley.jpg
Postaram sie przepisac kod w sql..

Z góry dziękuje
mike
levenshtein()
sniver
Dzięki wielkie smile.gif

Odrazu znalazłem funkcje i gotowy "dodatek" do mysql'a smile.gif
Teraz wiem już jak to ma działać smile.gif

Aha...gotowiec wygląda tak:

CREATE FUNCTION levenshtein( s1 VARCHAR(255), s2 VARCHAR(255) )
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
DECLARE s1_char CHAR;
-- max strlen=255
DECLARE cv0, cv1 VARBINARY(256);
SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0;
IF s1 = s2 THEN
RETURN 0;
ELSEIF s1_len = 0 THEN
RETURN s2_len;
ELSEIF s2_len = 0 THEN
RETURN s1_len;
ELSE
WHILE j <= s2_len DO
SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
END WHILE;
WHILE i <= s1_len DO
SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
WHILE j <= s2_len DO
SET c = c + 1;
IF s1_char = SUBSTRING(s2, j, 1) THEN
SET cost = 0; ELSE SET cost = 1;
END IF;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
IF c > c_temp THEN SET c = c_temp; END IF;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
IF c > c_temp THEN
SET c = c_temp;
END IF;
SET cv0 = CONCAT(cv0, UNHEX(HEX©)), j = j + 1;
END WHILE;
SET cv1 = cv0, i = i + 1;
END WHILE;
END IF;
RETURN c;
END;

..może sie komus przyda smile.gif
jeszcze raz dzięki wielgaśne!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.