Wdrażając wyszukiwarkę w naszym serwisie, warto mieć na uwadze, oprócz typowych wymagań takich jak filtrowanie wyników, sortowanie czy znajdywanie tych najtrafniejszych, także intuicyjność przyjętego rozwiązania. Użytkownik, korzystając z wyszukiwarki, nie powinien zastanawiać się w jakiej formie szukana fraza znajduje się w przeszukiwanych zasobach. Szukając wyników dla Gdańsk możemy oczekiwać, że znajdziemy także te które zawierają Gdansk, gdansk czy też Gdańsku bądź gdanskiem. Kwestia obsługi polskich znaków diakrytycznych przez SphinxSearch opisana została w jednym z poprzednich artykułów. Natomiast obsługa różnych form wyrażeń wydaje się tematem dużo bardziej zaawansowanym i skomplikowanym.
Lematyzacja, stemming
Zagadnieniami odmiany różnych form wyrażeń, jak i innymi kwestiami przetwarzania tekstu zajmuje się dziedzina znana jako NLP. W przypadku pełnotekstowych silników wyszukiwania, takich jak choćby SphinxSearch, szczególnie istotne są dwa terminy wywodzące się właśnie z NLP - lematyzacja (ang. lemmatization) oraz stemming. Pierwszy z nich oznacza sprowadzenie grupy wyrazów stanowiących odmianę danego zwrotu do wspólnej postaci, umożliwiającej traktowanie ich wszystkich jako to samo wyrażenie, np. running - run. Stemming natomiast to proces polegający na wydobyciu z wybranego wyrażenia tzw. rdzenia czyli usuwanie końcówek wyrazów i sprowadzenie ich do gramatycznej formy podstawowej, np. czekasz - czekać. Rezultaty lematyzacji i stemmingu mogą być podobne, dla danego wyrażenia, tyle że w przypadku stemmingu nie ma gwarancji, że wynik będzie prawidłowym wyrażeniem. Przykładowo, często stosowany dla języka angielskiego, Stemmer Portera zwraca busi dla słowa business.
Morphology
SphinxSearch posiada wbudowany lematyzer dla języka rosyjskiego oraz stemmery dla angielskiego, czeskiego i arabskiego. Natomiast, począwszy od wersji 2.2.1-beta, oprócz wspomnianego lematyzera dla języka rosyjskiego i stemmerów angielskiego, czeskiego i arabskiego, zawiera również lematyzery języka angielskiego i niemieckiego oraz stemmer rosyjskiego. Ponadto istnieje możliwość podpięcia stemmerów oferowanych w ramach projektu Snowball. Aby skorzystać z wyżej wymienionych wbudowanych narzędzi (lematyzery i stemmer) trzeba odpowiednio skonfigurować indeksy - opcja morphology w sekcji index, np. morphology = stem_en, lemmatize_ru.
W przypadku języka polskiego sytuacja jest dużo bardziej złożona - nie istnieją wbudowane bądź gotowe (Snowball - libstemmer) biblioteki, konieczne jest skorzystanie z uprzednio przygotowanego słownika wyrazów. Przykładowy słownik można znaleźć tutaj, załączamy go konfigurując opcję wordforms w sekcji index podając ścieżkę do pliku słownika.
Efekty wprowadzonych zmian będą następujące: szukając wyrażenia cats otrzymamy także wyniki zawierające słowo cat (dla indeksu test_eng_stemmer) oraz szukając żółwiem znajdziemy także te ze słowami żółw, żółwiowi, żółwiami itd. (w przypadku indeksu test_pl_wordforms).
Konfigurując indeks, tak aby korzystał z wbudowanych lematyzerów, stemmerów, alternatywnych bibliotek (libstemmer) czy też spreparowanego słownika, należy pamiętać o tym, że przetwarzanie tekstu będzie miało miejsce zarówno na etapie wyszukiwania jak i indeksowania. Dodatkowo, operacje te będą wymagały dodatkowych zasobów (RAM, CPU), ale mimo to warto rozważyć wprowadzenie opisanego powyżej rozwiązania mając na uwadze, oczywiście, satysfakcje i zadowolenie użytkowników naszego serwisu.
Przydatne linki:
- http://search.blox.pl/2010/01/Myslec-po-polsku.html
- http://horusiath.blogspot.com/2012/08/nlp-stemming-i-lematyzacja.html
- http://sphinxsearch.com/blog/2013/07/15/morphology-processing-with-sphinx/
- http://sphinxsearch.com/docs/current.html#conf-morphology
- http://sphinxsearch.com/docs/current.html#conf-wordforms
- http://snowball.tartarus.org/
- http://blog.thedigitals.pl/wdrozenie-sphinx-search/
- http://sysmagazine.com/posts/147745/
tagi: indexer , lemmatization , morphology , stemming , search , sphinx , sphinxsearch