![]() |
![]() ![]() |
![]() |
![]()
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 |
|
|
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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! |
|
|
![]() ![]() |
![]() |
Aktualny czas: 16.09.2025 - 15:34 |