Porównanie analizatorów Lucene

104

Czy ktoś mógłby wyjaśnić różnicę między różnymi analizatorami w Lucene? Otrzymuję wyjątek maxClauseCount i rozumiem, że mogę tego uniknąć, używając narzędzia KeywordAnalyzer, ale nie chcę zmieniać programu StandardAnalyzer bez zrozumienia problemów związanych z analizatorami. Dziękuję bardzo.

Czeladnik
źródło

Odpowiedzi:

209

Ogólnie rzecz biorąc, każdy analizator w Lucene to tokenizer + stemmer + filtr słów zatrzymujących.

Tokenizer dzieli twój tekst na fragmenty, a ponieważ różne analizatory mogą używać różnych tokenizatorów, możesz uzyskać różne strumienie tokenów wyjściowych , tj. Sekwencje fragmentów tekstu. Na przykład, KeywordAnalyzerwspomniałeś, w ogóle nie dzieli tekstu i przyjmuje całe pole jako pojedynczy token. Jednocześnie StandardAnalyzer(i większość innych analizatorów) używa spacji i znaków interpunkcyjnych jako punktów podziału. Na przykład dla frazy „Jestem bardzo szczęśliwy” wyświetli listę [„i”, „jestem”, „bardzo”, „szczęśliwy”] (lub coś w tym rodzaju). Więcej informacji na temat konkretnych analizatorów / tokenizatorów można znaleźć w dokumentacji Java .

Stemmery są używane do uzyskania podstawy danego słowa. W dużej mierze zależy to od używanego języka. Na przykład, dla poprzedniego wyrażenia w języku angielskim będzie coś takiego jak ["i", "be", "veri", "happi"], a dla francuskiego "Je suis très heureux" jakiś francuski analizator (np. SnowballAnalyzerZainicjowany z „francuskim”) wygeneruje [„je”, „être”, „tre”, „heur”]. Oczywiście, jeśli użyjesz analizatora jednego języka do wyodrębnienia tekstu w innym, zostaną użyte reguły z innego języka, a stemmer może dać niepoprawne wyniki. Nie jest to błąd całego systemu, ale wyniki wyszukiwania mogą być wtedy mniej dokładne.

KeywordAnalyzernie używa żadnych stempli, przechodzi przez całe pole bez modyfikacji. Tak więc, jeśli masz zamiar wyszukać jakieś słowa w tekście angielskim, nie jest dobrym pomysłem używanie tego analizatora.

Słowa „stop” to najczęściej występujące i prawie bezużyteczne słowa. Ponownie, w dużym stopniu zależy to od języka. W przypadku języka angielskiego te słowa to „a”, „the”, „I”, „be”, „have” itd. Filtry słów pomijanych usuwają je ze strumienia tokenów, aby zmniejszyć szum w wynikach wyszukiwania, więc ostatecznie nasza fraza „I StandardAnalyzerJestem bardzo zadowolony "z zostanie przekształcony w listę [" veri "," happi "].

I KeywordAnalyzerznowu nic nie robi. Tak więc KeywordAnalyzerjest używany do takich rzeczy, jak identyfikator lub numery telefonów, ale nie w przypadku zwykłego tekstu.

A jeśli chodzi o twój maxClauseCountwyjątek, myślę, że dostaniesz to, szukając. W tym przypadku najprawdopodobniej jest to spowodowane zbyt złożonym zapytaniem. Spróbuj podzielić to na kilka zapytań lub użyj więcej funkcji niskiego poziomu.

ffriend
źródło
1
@ffriend: nie sądzę, że Stemmer (używając śnieżki lub innych algorytmów) może przekonwertować am -> być, ponieważ jest to zadanie Lemmatizera. Możesz to sprawdzić tutaj snowball.tartarus.org/demo.php
czw
Więc gdzie Tika pasuje do tego? Czy nie jest to technicznie analizator?
anon
1
@anon: Tika to osobny projekt z kilkoma kluczowymi funkcjami. Zakładając, że masz na myśli parsery Tika, powiedziałbym, że Tika pobiera strumień bajtów i wyświetla tekst + metadane, podczas gdy analizatory Lucene pobierają tekst i wyprowadzają przetworzony strumień tokenów. Na przykład, możesz najpierw przeanalizować plik PDF lub XML za pomocą Tika, tworząc dokumenty z polami takimi jak „tytuł”, „autor” i „tekst”, a następnie przeanalizować niektóre lub wszystkie z tych pól za pomocą analizatorów Lucene.
ffriend
po prostu zastanawiam się, „bardzo” i „szczęśliwy” nie są odrzuconymi słowami, dlaczego są przekształcane w „veri” i „happi”? czy jest to dopasowanie i <-> y różnic, ponieważ brzmią podobnie?
oguzalb
0

Z mojej perspektywy użyłem StandAnalyzeri SmartCNAnalyzer. Ponieważ muszę wyszukiwać tekst po chińsku. Oczywiście SmartCnAnalyzerlepiej radzi sobie z chińskim. Do innych celów musisz wybrać odpowiedni analizator.

neal
źródło