Уменьшительные слова stemming / лемматизация
В настоящее время я использую 'lucene' и'asticsearch'и имею следующую проблему. Мне нужно получить форму или лемму для сокращения слова. Например:
- собачка -> собака
- котенок -> кот
и т.п.
Но я получаю следующие результаты:
- собачка -> собачка
- Китти -> Китти
Есть ли какой-либо способ (не важно, готов ли он использовать библиотеку, какой-либо алгоритм, подход и т. Д.), Чтобы получить корневую / оригинальную словесную форму для миниатюрных словоформ?
Целевой язык: русский. Например:
- собачка -> собака
- кошечка -> кошка
Заранее спасибо!
1 ответ
Во-первых, как примечание: то, что вы пытаетесь сделать, обычно не называется стеммированием или лемматизацией.
Вашей первой проблемой было бы сопоставление наблюдаемого токена (например, собачка) с его нормализованной формой (например, собака). Наивно это можно сделать, создав SynonymFilter
который использует SynonymMap
сопоставление димунитивных форм с их каноническими формами. Тем не менее, вы, вероятно, столкнетесь с проблемами с любым естественным языком, потому что не все деривации однозначны: например, на немецком языке, Mädel ('girl'/'lass') может быть уменьшительной формой Magd (архаичное слово, означающее 'молодой женщина '/' горничная ') или Made (' опарыш ').
Одним из способов устранения неоднозначности этих двух форм было бы вычисление вероятности появления каждой канонической формы в данном контексте (например, истории предыдущих n токенов), а затем замена димунитивной формы на наиболее вероятную каноническую форму (с использованием пользовательского TokenFilter
чтобы сделать это)- см., например, статью в Википедии для устранения неоднозначности в смысле слова для различных подходов.