Порівняння аналізаторів люцена


104

Чи може хтось пояснити, будь ласка, різницю між різними аналізаторами в межах Lucene? Я отримую виняток maxClauseCount, і я розумію, що я можу цього уникнути, використовуючи KeywordAnalyzer, але я не хочу переходити на StandardAnalyzer, не розуміючи проблем навколо аналізаторів. Дуже дякую.

Відповіді:


209

Взагалі, будь-який аналізатор у люцені - це токенізатор + стовбур + фільтр стоп-слів.

Токенізатор розбиває ваш текст на шматки, і оскільки різні аналізатори можуть використовувати різні токенізатори, ви можете отримувати різні потоки вихідних токенів , тобто послідовності фрагментів тексту. Наприклад, KeywordAnalyzerзгаданий вами текст зовсім не розділяє текст і приймає все поле як один маркер. У той же час StandardAnalyzer(і більшість інших аналізаторів) використовують пробіли та розділові знаки як точки розщеплення. Наприклад, для фрази "я дуже радий" вона створить список ["i", "am", "very", "happy"] (або щось подібне). Для отримання додаткової інформації про конкретні аналізатори / токенізатори див. Її Документи Java .

Стебла використовуються для отримання основи відповідного слова. Це сильно залежить від мови, що використовується. Наприклад, для попередньої фрази англійською мовою буде щось на зразок ["i", "be", "veri", "happi"], а для французької "Je suis très heureux" якийсь французький аналізатор (наприклад SnowballAnalyzer, ініціалізований з "французькою") вироблять ["je", "être", "tre", "heur"]. Звичайно, якщо ви будете використовувати аналізатор однієї мови для виведення тексту в іншу, будуть використані правила з іншої мови, і стовбур може дати неправильні результати. Це не збій у всій системі, але результати пошуку можуть бути менш точними.

KeywordAnalyzerне використовує жодних стовбурів, воно передає все поле немодифікованим. Отже, якщо ви збираєтесь шукати деякі слова в англійському тексті, не дуже добре використовувати цей аналізатор.

Слова стоп - це найчастіші і майже марні слова. Знову ж таки, це сильно залежить від мови. Для англійської мови ці слова є "a", "the", "I", "be", "have" тощо. Фільтри стоп-слів видаляють їх з потоку токенів, щоб знизити рівень шуму в результатах пошуку, тому нарешті наша фраза "Я "я дуже задоволений" з StandardAnalyzerбуде перетворений на список ["veri", "happi"].

І KeywordAnalyzerзнову нічого не робить. Отже, KeywordAnalyzerвикористовується для таких речей, як ідентифікаційні або телефонні номери, але не для звичайного тексту.

А що стосується вашого maxClauseCountвинятку, я вважаю, що ви отримаєте це на пошуках. У цьому випадку, швидше за все, це через занадто складний пошуковий запит. Спробуйте розділити його на кілька запитів або скористайтеся функціями більш низького рівня.


1
@ffriend: я не думаю, що Stemmer (використовуючи сніжний ком або інші алгоритми) не може перетворити am -> бути, тому що це робота Lemmatizer. Перевірити це можна тут snowball.tartarus.org/demo.php
Tho

То де ж Тіка вписується в це? Хіба це технічно не аналізатор?
анонім

1
@anon: Tika - це окремий проект з кількома ключовими особливостями. Припускаючи, що ви маєте на увазі парники Tika, я б сказав, що Tika приймає байтовий потік та видає текст + метадані, тоді як аналізатори люцена беруть текст та виводять оброблений потік токенів. Наприклад, ви можете спочатку проаналізувати файл PDF або XML разом з Tika, створивши документи з такими полями, як "заголовок", "автор" та "текст", а потім проаналізувати деякі чи всі ці поля за допомогою аналізаторів люцена.
подруга

просто цікаво, "дуже" і "щасливий" не є відхиленими словами, чому вони перетворюються на "вери" і "хаппі"? це відповідати i <-> y відмінностям, оскільки вони звучать схоже?
огузальб

0

З моєї точки зору, я використав StandAnalyzerі SmartCNAnalyzer. Оскільки я повинен шукати текст китайською мовою. Очевидно, SmartCnAnalyzerкраще поводитися з китайською. Для різних цілей потрібно вибрати найпростіший аналізатор.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.