Temat: Koncepcje wyszukiwarek treści w serwisie (shared hosting)

Załóżmy, że powstaje strona firmowa.

Ważnym elementem owej strony ma być baza wiedzy, którą można ogólnie podzielić na:
1. krótkie artykuły poświęcone usługom realizowanym przez firmę (opis procesów, związane z nimi, poboczne zagadnienia)
2. rzeczywistą KB/blog (zwał jak zwał) - dłuższe artykuły z danej dziedziny
3. coś na kształt "biblioteczki" zawierającej okładki i spisy treści istotnych, z punktu widzenia dziedziny, pozycji literatury (silnie skorelowane z ofertą)
4. agregator RSSowy "zajawek" artykułów z "zaprzyjaźnionych serwisów"

Wszystko to trzeba ugryźć wyszukiwarką. Wydawałoby się, że sprawa jest prosta, ale...

1. w branży wykorzystywane są terminy polskie i angielskie. Jeśli polskie - to mamy problem z odmianą,
2. niektóre terminy są skomplikowane i długie (w dodatku wielowyrazowe), łatwo więc o literówki,
3. o daną rzecz można zapytać na wiele sposobów, nie mogę zakładać konkretnej postaci zapytania. Ba, dana procedura może mieć wiele różnych nazw, gdzie słowa kluczowe są od siebie oddalone w tekście,
4. wyszukiwanie w dłuższych tekstach nie musi być za dokładne, wyszukiwanie w biblioteczce i usługach już tak. W spisie będą linki do podstron opisujących usługi i artykuły.
5. strona firmowa to nie jest wielki serwis, nie będzie na jakimś drogim hostingu z Bóg wie jakimi "ficzerami". W sumie, to mogłyby to być statyczne strony html, gdyby nie kwestie szablonu (master page) i wyszukiwarki. Na początek nie będą czynione żadne większe inwestycje tylko pod wyszukiwarkę(!),
6. Google ma fajną funkcje "Czy chodziło ci o?". I właśnie coś takiego potrzebuję.

Do dyspozycji jest hosting z .NET 4 i SQL Server 2008, niestety, na początek wyłącznie "shared".

Co brałem pod uwagę:

1. Full Text Search oferujący mi FREETEXT i CONTAINS. Świetnie nada się do długich artykułów i do zapytań zawierających słowa kluczowe "odległe od siebie" (rozdzielone) w tekście oraz do synonimów. Pozwala korzystać z operatorów logicznych, ustalać wagi ważności słów, wybrać język wyszukiwania (odmiana wyrazów) i sto innych rzeczy.

Ale też trzeba umieć tworzyć w nim zapytanie - jak ma to zrobić użytkownik?

Dodatkowo leży i kwiczy w przypadku literówek wynikających np. z nieznajomości pisowni bądź zagadnienia. Przykładowo: "Helwig" zamiast "Hellwig", "analiza wariacji" zamiast "wariancji". Nie mówiąc już o "kowariancji", gdzie wyniki dotyczące "wariancji" też powinny zostać wyświetlone, tylko "nieco dalej".

Poza tym musi być udostępniony na hostingu i to z obsługą języka polskiego. Na razie coś takiego jest chyba tylko na Webio.

2. Zaawansowany text mining, np. z użyciem pakietu statystycznego GNU R. Problem w tym, ze to jest regularna DLLka, która "może wszystko". Kto mi da prawa do uruchamiania niezarządzanego kodu na "shared"? Na to przyjdzie czas, jak będzie stawiany dedyk z aplikacjami SAAS, a nie prosta strona firmowa z niemal statycznym HTMLem.

3. Literówki, odmiany wyrazów i trudno przewidywalne zapytania najbardziej dadzą się we znaki w biblioteczce i spisie usług. Tam są krótkie frazy, powiedzmy 5-10 wyrazów (każda pozycja spisu to może być osobny rekord w tabeli). Do takich zapytań mogę zaprząc różne metryki, np. Levensteina, Smitha-Watermana-Gotoha czy Jaro-Winklera (jest ich sporo więcej, ale tylko te się nadają do fraz dłuższych niż 2-3 wyrazy). Mogę sobie porangować wyniki i wziąć np. pierwsze 10.


Obrazek


Obrazek


I sprawdza się to rewelacyjnie, ale... implementacja w SQLu głupiego "Double metaphone" to już hardcor, a co tu mówić o takim "Smith-Waterman-Gotoh Windowed Affine" gdzie jest rachunek macierzowy. Spokojnie da się zrobić, ale to za dużo roboty.

Jest gotowa biblioteka do tego i można ją spokojnie podpiąć do SQLa, czego wyniki widać powyżej, ale kto mi da na "sharedzie" prawa do wykorzystania CLR w SQL?

No dobra, mogę sobie raz na początku pobrać kolekcję rekordów stanowiących elementy spisu treści i usług (nie jest tego dużo, a userów na stronie będzie może kilku-kilkunastu) i jechać po tym w C# wspomnianą biblioteką.

Problem w tym, że nie "obrzucę" tym dłuższego artykułu, no bo jak policzyć metryki dla wektorów o długości różniącej się kilkadziesiąt razy... Tu przydałby się pakiet statystyczny, a tego nie uruchomię. No OK, mogę "pociąć" główny artykuł na frazy po, powiedzmy, 5-10 wyrazów i w nich wyszukiwać. Jest to jakieś rozwiązanie, zakładając, że nie będzie tam "zdań 20 razy podrzędnie złożonych", ale wtedy mogę się pożegnać z wieloma frazami, ich słowa zostaną rozdzielone.

4. Do dłuższych tekstów wykorzystać Google search API. Działa tu obsługa prostych literówek, ale nie jest to jakiś cud. No i "for noncommercial use". Darmowe jest API do MS Binga, ale nie wiem, na jak długo.

----

No i wychodzi na to, że mam 2 wyszukiwarki. Jedną ogólną, ale bardzo prostą, niewiele bardziej złożoną od SQLowego "LIKE'a po UPPERcasie", drugą, o dużych możliwościach dopasowywania wyników, ale działającą tylko w kilku miejscach na stronie - a to już z uwagi na algorytmy, które działają dobrze na jednym - góra kilku wyrazach.

Można się bawić tak, że jeśli główna wyszukiwarka nie znajdzie nic w całym serwisie, odpali się odpowiedni algorytm "fuzzy search" na podzbiorze danych, w kilku tylko działach. Zawsze to coś. Jeśli obie wyszukiwarki coś znajdą, no to suma zbiorów.

Macie jakieś inne pomysły na darmową wyszukiwarkę odporną na literówki, "oddalone słowa kluczowe", odmianę, a jednocześnie działające na tekście o objętości 10-30kB, nie wymagające CLR ani "zewnętrznych" unmanaged DLLek (która pójdzie mi na "sharedzie")?

Może znacie jakieś SQLowe (bo nie ukrywam, że nie chcę zaciągać artów z bazy tylko po to, żeby coś w nich znaleźć) wersje przydatnych algorytmów, które działają dla długich tekstów, a nie tylko krótkich fraz albo inne, podobne do Googla wyszukiwarki? A może już zetknęliście się z takim problemem i macie swoje koncepcje, którymi możecie się podzielić?Adrian Olszewski edytował(a) ten post dnia 30.03.12 o godzinie 17:45

Temat: Koncepcje wyszukiwarek treści w serwisie (shared hosting)

OK, poradziłem sobie :)

Chciałem wyważyć otwarte drzwi i wynaleźć od nowa koło, przecież jest .NETowy port Javovego silnika wyszukiwania Lucene, czyli Lucene.NET.

Apache Lucene(TM) is a high-performance, full-featured text search engine library written entirely in Java. It is a technology suitable for nearly any application that requires full-text search, especially cross-platform.

Za cenę tworzenia indeksu plikowego mam rewelacyjną wyszukiwarkę. Indeks będzie zasilany artykułami przechowywanymi w plikach html (partiale), które zostaną przepuszczone przez "clenaer" czyszczący je z tagów HTMLa (Regex albo Xml) i wrzucający do indeksu.

Co prawda do fuzzy search wykorzystywana jest metryka Levensteina, którą średnio lubię z moich doświadczeń, ale tutaj, w połączeniu z pozostałymi algorytmami silnika działa akceptowalnie zadowalająco. Ponieważ są źródła, spróbuję przy okazji podmienić Lev. na S-W-G.

Prawie jak w Google - czasem trzeba pokombinować z cudzysłowami i operatorami.


Obrazek


Obrazek


Jeśli ktoś lubi i potrzebuje, to jest też LINQ2Lucene.Adrian Olszewski edytował(a) ten post dnia 10.04.12 o godzinie 11:01

Następna dyskusja:

Hosting ASP.NET




Wyślij zaproszenie do