Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Porównanie ze sobą 2 fraz
sniver
post
Post #1





Grupa: Zarejestrowani
Postów: 159
Pomógł: 5
Dołączył: 31.08.2007

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/sciana.gif)

PS. Jeśli ktoś wie jak to zrobić w PHP niech mi też napisze (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Postaram sie przepisac kod w sql..

Z góry dziękuje

Ten post edytował sniver 30.04.2008, 08:19:31
Go to the top of the page
+Quote Post
mike
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


levenshtein()
Go to the top of the page
+Quote Post
sniver
post
Post #3





Grupa: Zarejestrowani
Postów: 159
Pomógł: 5
Dołączył: 31.08.2007

Ostrzeżenie: (0%)
-----


Dzięki wielkie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Odrazu znalazłem funkcje i gotowy "dodatek" do mysql'a (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Teraz wiem już jak to ma działać (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
jeszcze raz dzięki wielgaśne!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.09.2025 - 15:34