Сравнение анализаторов люцена

104

Может кто-нибудь объяснить разницу между разными анализаторами в Lucene? Я получаю исключение maxClauseCount, и я понимаю, что могу избежать этого, используя KeywordAnalyzer, но я не хочу отказываться от StandardAnalyzer, не понимая проблем, связанных с анализаторами. Огромное спасибо.

Подмастерье
источник

Ответы:

209

В общем, любой анализатор в Lucene - это токенизатор + стеммер + фильтр стоп-слов.

Токенизатор разбивает ваш текст на части, и, поскольку разные анализаторы могут использовать разные токенизаторы, вы можете получить разные потоки выходных токенов , то есть последовательности фрагментов текста. Например, KeywordAnalyzerвы упомянули, что не разделяет текст вообще и принимает все поля как один токен. В то же время StandardAnalyzer(и большинство других анализаторов) используют пробелы и знаки препинания как точки разделения. Например, для фразы «Я очень счастлив» будет получен список [«я», «я», «очень», «счастлив»] (или что-то в этом роде). Дополнительную информацию о конкретных анализаторах / токенизаторах см. В документации по Java .

Stemmers используются для получения основы рассматриваемого слова. Это сильно зависит от используемого языка. Например, для предыдущей фразы на английском языке будет создано что-то вроде ["i", "be", "veri", "happyi"], а для французского "Je suis très heureux" будет произведен какой-то французский анализатор (например SnowballAnalyzer, инициализированный с «французским») будет производить [«je», «être», «tre», «heur»]. Конечно, если вы будете использовать анализатор одного языка для обработки текста на другом, будут использоваться правила другого языка, и стеммер может дать неверные результаты. Это не сбой всей системы, но тогда результаты поиска могут быть менее точными.

KeywordAnalyzerне использует никаких стеммеров, он проходит все поле без изменений. Итак, если вы собираетесь искать какие-то слова в английском тексте, использовать этот анализатор - не лучшая идея.

Стоп-слова - самые частые и почти бесполезные слова. Опять же, это сильно зависит от языка. Для английского языка это слова «a», «the», «I», «be», «have» и т. Д. Фильтры стоп-слов удаляют их из потока токенов, чтобы снизить уровень шума в результатах поиска, поэтому, наконец, наша фраза «I» очень доволен "с StandardAnalyzerпреобразуется в список [" вери "," хаппи "].

И KeywordAnalyzerснова ничего не делает. Так,KeywordAnalyzer используется для таких вещей, как идентификатор или номера телефонов, но не для обычного текста.

А что касается вашего maxClauseCountисключения, я думаю, вы его поймете при поиске. В данном случае, скорее всего, из-за слишком сложного поискового запроса. Попробуйте разбить его на несколько запросов или используйте более низкоуровневые функции.

друг
источник
1
@ffriend: я не думаю, что Stemmer (используя снежный ком или другие алгоритмы) может преобразовать am -> потому что это работа Lemmatizer. Вы можете проверить это здесь snowball.tartarus.org/demo.php
Tho
Так где же тут Тика? Разве это технически не анализатор?
анон
1
@anon: Tika - это отдельный проект с несколькими ключевыми особенностями. Предполагая, что вы имеете в виду парсеры Tika, я бы сказал, что Tika принимает поток байтов и выводит текст + метаданные, в то время как анализаторы Lucene принимают текст и выводят обработанный поток токенов. Например, вы можете сначала проанализировать PDF- или XML-файл с помощью Tika, создав документы с такими полями, как «название», «автор» и «текст», а затем проанализировать некоторые или все эти поля с помощью анализаторов Lucene.
ffriend
просто интересно, «очень» и «счастливый» не отклоняемые слова, почему они преобразованы в «вери» и «хаппи»? это для соответствия i <-> y различиям, поскольку они звучат одинаково?
oguzalb
0

На мой взгляд, я использовал StandAnalyzerи SmartCNAnalyzer. Поскольку мне нужно искать текст на китайском языке. Очевидно, SmartCnAnalyzerлучше справляется с китайцами. Для разных целей вам нужно выбрать анализатор properest.

Нил
источник