Устройство морфологических списков

Для хранения информации о взаимосвязи форм слова (без указаниях грамматических характеристик – рода, времени, числа, падежа и т.п.) используется набор морфологических списков – с типами eWordListType_MorphologyBaseForm и eWordListType_MorphologyInflectionForm

При этом сами списки структурно аналогичны спискам полнотекстового поиска, т.е. каждая запись такого списка имеет ссылки на несколько соответствующих им записей другого списка: например, слово из списка базовых форм будет ссылаться на одно или несколько слов списка производных, и наоборот. При этом роль полного набора базовых форм, на которые можно ссылаться, обычно выполняет обычный словарный список, а полный набор производных приходится составлять отдельно. Более детально с описанием и структурой списков FTS можно ознакомиться здесь.

Списки с морфологическими формами обычно используются для:

  • подготовки запросов поиска и сортировки его результатов
  • получения информации о базовых формах для отображения морфологических подсказок

Подготовка поисковых запросов

Для подготовки поисковых запросов (для поиска по шаблону и полнотекстового поиска) используются следующие функции:

/// Преобразует строку поиска, введенную пользователем, в расширенный запрос, использую морфологию встроенную в базу
ESldError PrepareQueryForFullTextSearch(const UInt16 *aText, CSldDictionary *aDict, Int32 aListIndex, SldU16String& aResultQuery, SldU16WordsArray * aMorphoForms = NULL);

/// Преобразует строку поиска, введенную пользователем, в расширенный запрос для поиска по шаблону, использую морфологию встроенную в базу.
ESldError PrepareQueryForWildCardSearch(const UInt16* aText, CSldDictionary* aDict, Int32 aListIndex, TExpressionBox* aExpressionBox);

/// Преобразует строку поиска, введенную пользователем, в расширенный запрос для полнотекстового поиска
ESldError PrepareQueryForSortingSearchResults(const UInt16* aText, CSldDictionary* aDict, UInt32 aLangCode, CSldVector<TSldMorphologyWordStruct>& aMorphologyForms);

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

Получение морфологических форм

Для получения всех морфоформ используется:

ESldError GetMorphoForms(const UInt16 *aText, CSldDictionary *aDict, UInt32 aLangFrom, CSldVector<TSldMorphologyWordStruct> & aMorphologyForms, UInt32 aWithoutRequest, const EMorphoFormsType aType)

При этом последний аргумент позволяет отфильтровать выдачу, добавив в результаты только один из следующих типов форм:

/// Тип получаемых морфоформ
enum EMorphoFormsType
{
    /// Все морфоформы
    eMorphoAll = 0,
    /// Только базовые формы
    eMorphoBase,
    /// Только производные формы
    eMorphoDerivative
};

Сами элементы вектора результатов также содержат в себе тип морфоформы:

/// Перечисление, описывающее типы слов, получаемых из морфологии
enum ESldMorphologyWordTypeEnum
{
    /// Базовая форма слова
    eMorphologyWordTypeBase = 0,
    /// Одна из словоформ
    eMorphologyWordTypeWordform,
};

/// Структура для хранения слова, полученного из морфологии
typedef struct TSldMorphologyWordStruct
{
	/// Слово
	SldU16String				MorphologyForm;

	/// Тип слова
	ESldMorphologyWordTypeEnum	MorphologyFormType;

	...
} TSldMorphologyWordStruct;

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.