Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Inteligentne wyszukiwanie, rozpoznawanie prostych bledow
slash^
post 27.12.2007, 12:59:48
Post #1





Grupa: Zarejestrowani
Postów: 278
Pomógł: 36
Dołączył: 9.04.2003
Skąd: Płock

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


Witam

Zaczalem pisac zaawansowana wyszukiwarke do sklepu internetowego, napotkalem jednak nastepujacy problem:
co zrobic jezeli uzytkownik w wyszukiwanej frazie zrobi literowke??

tzn. mam sklep internetowy i wyszukiwarke typu "wpisz slowo", skrypt przeszukuje baze danych i wyswietla znalezione rzeczy i teraz wszystko jest super jezeli wpisze np. laptop to znajduje laptop xxx, laptop xyz, abc laptop itp. ale co zrobic jezeli ktos omylkowo wpisze "laotop" - literowka przy szybkim pisaniu o blisko p? wyskakuje ze nic nie znaleziono - problem jest niby nikly gdyz latwo to wypatrzyc, ale co jezeli np. ktos szuka po nazwie firmy, ktora to tylko slyszal a nie potrafi jej dokladnie przeliterowac? zamiast coca-cola wpisze koka-kola??

poszukuje jakiegos rozwiazania, ktore mnie naprowadzi na wlasciwe rozwiazanie tego problemu, czy ktos sie juz z czyms takim spotkal? jak to zostalo rozwiazane?

Znalazlem tylko cos w stylu takim:
  1. SELECT *, MATCH (nazwa) AGAINST ('abc') AS cnt FROM produkt WHERE MATCH (nazwa) AGAINST ('abc') ORDER BY cnt DESC


...ale to kompletnie nie to o co mi chodzi smile.gif

pozdrawiam


--------------------
d(^^)b
Go to the top of the page
+Quote Post
glorification
post 27.12.2007, 17:56:08
Post #2





Grupa: Zarejestrowani
Postów: 9
Pomógł: 2
Dołączył: 22.12.2007

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


to trywialne co pisze ale im bardziej zasady beda uogólnione tym rezultat bedzie mniej wlasciwy do teg co szukasz ... takie cos jak piszesz robi sie miedzy innymi w javascript , popatrz sobie na przyklady autouzupełniania stosowane przez google ... To zaawansowana rzecz, wyamaga uzycia ajaxu i slownika z wyrazami ... Moim zdaniem lepiej pojsc na latwizne i przy rezultacie wyszukiwania rownym zero dodac cos w stylu 'sprawdz czy podana fraza zostala poprawinie wpisana'. Naprawa bledów przy wpisywaniu to po prostu duzo roboty a i tak nie obejmi
sz skryptem wszystkich mozliwych bledów, pomnóż sobie dodatkowo liczbe roboty pr
ez 
ilość specyficznych znaków jakie wystepuja w jezyku polskim ... 
poza tym czlowiek szukajac za pomoca przegladarki oczekuje scislych rezultatow ... jak chcesz cos takiego budowac to musisz dopisac jeszcze skrypt ktory ulozy 
ezultaty od najbardziej scislych do najmniej , a co jezeli ten najbardziej scisl
 jest bledny 
wodniesienie tego czego uzytkownik oczekiwal questionmark.gif zaczyna sie szukanie po podstronach z rezultatami ... szkoda czasu jak dla mnie ...

g.
Go to the top of the page
+Quote Post
seaquest
post 27.12.2007, 19:41:39
Post #3





Grupa: Przyjaciele php.pl
Postów: 790
Pomógł: 7
Dołączył: 6.02.2003
Skąd: Polska

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


Po 1. Poczytaj trochę o Lucene i jego implementacji w PHP (Zend_Search_Lucene). Całkiem niezłe rozwiązanie jeśli chodzi o trafność wynikow.

Po 2. Co do samego problemu, to jeśli masz do dyspozycji słownik to możesz napisać algorytm, który wykorzystuje np similar_text" title="Zobacz w manualu PHP" target="_manual.

Poza tym możesz jeszcze poczytać o: http://pl.wikipedia.org/wiki/Odległość_Hamminga i http://pl.wikipedia.org/wiki/Odległość_Levenshteina


--------------------
Michał Płachta
Warsztat: Mac OS X Leopard, PostgreSQL, Text Mate, Retrospectiva + SVN
Go to the top of the page
+Quote Post
slash^
post 27.12.2007, 23:24:25
Post #4





Grupa: Zarejestrowani
Postów: 278
Pomógł: 36
Dołączył: 9.04.2003
Skąd: Płock

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


Dzieki to powinno wystarczyc.
Teraz tylko pytanie jak zrobic najprosciej similar_text w mysql?questionmark.gif


--------------------
d(^^)b
Go to the top of the page
+Quote Post
seaquest
post 28.12.2007, 10:10:17
Post #5





Grupa: Przyjaciele php.pl
Postów: 790
Pomógł: 7
Dołączył: 6.02.2003
Skąd: Polska

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


Wydaje mi się, że lepiej i szybciej będzie to działać w PHP.

Słownik polskich wyrazów możesz pobrać tutaj: http://www.kurnik.pl/slownik/

Musisz go sobie tylko jakoś sparsować i zserializować tak, żeby wyszukiwanie było bardzo szybkie.

Wydaje mi się, że w Twoim przypadku najlepiej pogrupować wyrazy po ilości liter, a następnie jak dostaniesz jakieś słowo, to dołączać taki plik, żeby ilość liter była taka sama. Później liczysz odległość Hamminga dla każdego ze słów i jeśli żadna nie równa się 0 (słowo nie istnieje w słowniku), to bierzesz słowo, które najbardziej pasuje i wyszukujesz w bazie po jednym i drugim.

Jednak zastanawiam się teraz, czy nie powinieneś jakoś inaczej liczyć odległości między słowami dla słowa laptop np: laotop i labtop będą miały taką samą odległość, a "o" jest bliżej "p". Więc może by stworzyć tablicę z odległościami liter od siebie i np jeśli algorytm zwróci Ci na podstawie podanego laotop: [laptop, labtop] to sprawdzasz, która litera jest bliżej "o" na klawiaturze i wybierasz lepsze słowo do wyszukiwania, czyli laptop.

Mam nadzieję, że wystarczająco jasno to opisałem.


--------------------
Michał Płachta
Warsztat: Mac OS X Leopard, PostgreSQL, Text Mate, Retrospectiva + SVN
Go to the top of the page
+Quote Post
slash^
post 29.12.2007, 14:20:16
Post #6





Grupa: Zarejestrowani
Postów: 278
Pomógł: 36
Dołączył: 9.04.2003
Skąd: Płock

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


Dzieki az takiego zaawansowanego skryptu nie potrzebuje.
Wystarczy, ze jako slownik podepne wszystkie slowa wystepujace w nazwach i opisach produktow (zastanawiam sie jak to automagicznie sparsowac, czy np. po dodaniu kolejnego produktu explode po spacji i jesli slowo nie istniej to dodac do slownika)

Teraz tylko czy aby metoda z porownywaniem po dlugosci wyrazow jest w 100% dobra, mam przypadki w statystykach ze ktos napisal "napend dvd" ...

Ale tak czy inaczej wiem juz jak sie za to zabrac, dzieki za pomoc.


--------------------
d(^^)b
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 00:54