Уменьшительные слова stemming / лемматизация

В настоящее время я использую 'lucene' и'asticsearch'и имею следующую проблему. Мне нужно получить форму или лемму для сокращения слова. Например:

  • собачка -> собака
  • котенок -> кот

и т.п.

Но я получаю следующие результаты:

  • собачка -> собачка
  • Китти -> Китти

Есть ли какой-либо способ (не важно, готов ли он использовать библиотеку, какой-либо алгоритм, подход и т. Д.), Чтобы получить корневую / оригинальную словесную форму для миниатюрных словоформ?

Целевой язык: русский. Например:

  • собачка -> собака
  • кошечка -> кошка

Заранее спасибо!

1 ответ

Решение

Во-первых, как примечание: то, что вы пытаетесь сделать, обычно не называется стеммированием или лемматизацией.

Вашей первой проблемой было бы сопоставление наблюдаемого токена (например, собачка) с его нормализованной формой (например, собака). Наивно это можно сделать, создав SynonymFilter который использует SynonymMap сопоставление димунитивных форм с их каноническими формами. Тем не менее, вы, вероятно, столкнетесь с проблемами с любым естественным языком, потому что не все деривации однозначны: например, на немецком языке, Mädel ('girl'/'lass') может быть уменьшительной формой Magd (архаичное слово, означающее 'молодой женщина '/' горничная ') или Made (' опарыш ').

Одним из способов устранения неоднозначности этих двух форм было бы вычисление вероятности появления каждой канонической формы в данном контексте (например, истории предыдущих n токенов), а затем замена димунитивной формы на наиболее вероятную каноническую форму (с использованием пользовательского TokenFilter чтобы сделать это)- см., например, статью в Википедии для устранения неоднозначности в смысле слова для различных подходов.

Другие вопросы по тегам