acts_as_ferret i polskie znaki

Mam bazę polskich tekstów indeksowaną Ferretem.
Muszę go zmusić, żeby na zapytanie “polka” znajdował hasła “półka” i “polka”.
A na zapytanie “półka” tylko “półka”.

Czy ktoś ma pomysł jak się do tego zabrać?

Z grubsza rozwiązanie jest następujące - musisz napisać własny TokenStream, który będzie dla słów zawierających polskie znaki diakrytyczne zwracał dwa tokeny - w wersji zwykłej i polskawej.
Więcej szczegółów na ten temat możesz znaleźć w mojej prezentacji z SFI 2008, w szczególności w okolicach slajdu 22.
Co prawda ja koncentrowałem się głównie na obsłudze fleksji, ale problem jest podobny, bo w obu przypadkach dla niektórych słów musimy dostarczyć do indeksu ich dwie wersje (tak mi się przynajmniej wydaje :D).

Indeksuj dodatkowe pole (wirtualne) – ja wiem że używając ferreta robi się to aż za często, ale trudno. W każdym razie dla każdego rekordu trzymaj dodatkowo jego “nazwę w gołym ASCII”. Powinno dać radę.

@apohllo: dzięki wielkie, o czymś takim myślałem - tylko nie wiedziałem od której strony ugryźć :slight_smile: Właśnie uruchomiłem i działa jak na razie fantastycznie. Swoją drogą - świetna prezentacja!

@Tomash: właśnie nie chciałem tego robić, bo to duże pole (długie opisy, pomijając sprawę polskich znaków i tak je poważnie podjeżdżam przed indeksowaniem)

@aphollo Pytanie a propos prezentacji. Czy istnieją słowniki fleksyjne dostępne do zastosowań komercyjnych? Z tego co pamiętam to na AGH zgodę na użycie CLP było ciężko dostać nawet dla projektów studenckich poza katerą lingwistyki :slight_smile:

@czek :slight_smile:

@piachoo

Z tym ogólnie jest problem. Nie słyszałem o żadnym słowniku tego rodzaju, który byłby darmowy i bez żadnych uwarunkowań pozwalał na zastosowanie w aplikacjach komercyjnych.

W miarę aktualna lista słowników znajduje się na stronie: http://nlp.ipipan.waw.pl/CLIP/resources.html - szczególnie
ciekawie prezentuje się produkt Neurosoft Gram, kosztuje jedyne 4K PLN :slight_smile:

O ile dobrze się orientuję to wykorzystanie CLP w projektach komercyjnych jest możliwe, trzeba jednak za tym trochę pochodzić.

Warto też zainteresować się morfologikiem, bo wykorzystywany jest w OpenOffice. Nie wiem jednak jak dokładnie wygląd jego API oraz zdaje się, że jest napisany w Javie = jest powolny.

Polecam zainteresowanie się sphinxem albo full-text search na poziomie postgresql - ferret bywa niestabilny i ma parę innych wad. Więcej informacji, testów, benchmarków można łatwo wygooglać.

Jak już jesteśmy w temacie innych enginów do szukania, to warto poczytać:
http://locomotivation.com/2008/07/15/mulling-over-our-ruby-on-rails-full-text-search-options
http://locomotivation.com/2008/07/23/simple-ruby-on-rails-full-text-search-using-xapian

acts_as_solr

Tutaj należało by zwrócić uwagę na licencje. Jeśli nie chcemy otwierać kodu aplikacji to przy sphinksie:

a acts_as_ferret posiada licencje MIT.

pozdrawiam

Obczajał ktoś Xapiana? Ferret jest paskudny, Sphinx ma srogą licencję (i jest dość niewygodny w użyciu) i rozglądam się za alternatywami.

Ale przecież to sphinx jako taki ma GPL, ale nie włączasz go do aplikacji a np. ultrasphinx już jest MIT. No chyba, że robisz aplikację, którą będziesz dystrybuować za kasę, ale wtedy licencja na sphinxa to ok. $100 - to chyba nie za dużo?

Nie można mylić kodu plugina włączonego do aplikacji jako takiej (a takim jest np. acts_as_ferret, czy ultrasphinx) z zewnętrzną z technologicznego punktu widzenia aplikacją jaką jest Sphinx. Włączenie tego pierwszego na GPLu powoduje, że aplikacja też powinna być GPL. Jeśli jest zewnętrzna aplikacja GPL, jak Sphinx to licencja jest łamana dopiero przy redystrybuowaniu skompilowanej wersji bez podania źródła.

Ostatnio dodawałem ultrasphinxa do kolejnych aplikacji i coś jest nie tak z indeksowaniem… Thinking sphinx z kolei ma problemy ze sphinxem 0.9.8… jak nie wygram ze sphinxem, to chyba będę zmuszony sprawdzić xapiana :slight_smile:

Spróbuj oficjalnego Sphinx Ruby API. Używam go od ponad 6 miesięcy, indeksuje 500,000 rekordów co 30 minut i nigdy nie było z tym problemu. Napisałem sphinx rake task który robi start/stop/index/rotate bezpośrednio na searchd. Dodałem go do vendor/plugins/sphinx/tasks/sphinx.rake

Nigdy nie przepadałem za tymi sphinx’owymi pluginami typu ultrasphinx/thinkingsphinx. IMHO dodają zbędną warstwę abstrakcji (przynajmniej w przypadku mojej aplikacji) i czasami komplikują setup zamiast go ułatwiać.

Chcę wykorzystać do indeksowania polskich słów ultrasphinxa. W którym miejscu mogę zdefiniować język. Z tego co się orientuję można korzystać z języka angielskiego (i o ile się nie mylę także dla rosyjskiego). Gdzie zatem mogę określić, że chcę korzystać ze słownika języka polskiego albo “podpiąć” słownik/plik z polskimi słowami.

Czy ktoś się orientuje, czy jest możliwość korzystania ze słownika wyrazów bliskoznacznych podobnego do tego który jest przykładowo w OpenOffice? W tamtym słowniku wyrazy bliskoznaczne są oddzielone papjami ("|"). Na przykład tak: