Грамматические пометы существительных в словаре

Определение рода существительного

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

С помощью SQL запроса мы можем получить первичный ключ записи в таблице sg_entry:

SELECT DISTINCT E.id, E.name
 FROM  sg_lexem L, sg_form F, sg_entry E
 WHERE L.name='ГАЛАКТИКАМИ' AND F.id_lexem=L.id AND E.id=F.id_entry

Зная первичный ключ статьи, мы можем получить список грамматических атрибутов данной статьи в таблице sg_entry_coord. Одной записи в sg_entry может соответствовать несколько записей в sg_entry_coord. Например, у существительных в русском языке кроме грамматического рода есть еще признак одушевленности. Поэтому мы должны задать дополнительное требование к записям в sg_entry_coord, указав требуемое значение идентификатора для рода. Грамматический род, как и все другие признаки, объявлены в таблице sg_coord. Таким образом, следующий запрос позволит определить, к какому роду относится существительное галактика:

SELECT DISTINCT E.id, E.name, S.name
 FROM  sg_lexem L, sg_form F, sg_entry E, sg_coord C, sg_entry_coord EC, sg_state S
 WHERE L.name='ГАЛАКТИКАМИ' AND F.id_lexem=L.id AND E.id=F.id_entry AND
       C.name='РОД' AND
       EC.id_entry=E.id AND EC.icoord=C.id AND
       S.id_coord=C.id AND S.id=EC.istate

Результаты его выполнения:

idnamename
1073922118галактикаЖЕН

Одушевленность существительных

Немного модифицировав запрос из первой части урока, можно вывести признак одушевленности вместо рода. Для этого достаточно вместо строки 'РОД' подставить строку 'ОДУШ':

SELECT DISTINCT E.id, E.name, S.name
 FROM  sg_lexem L, sg_form F, sg_entry E, sg_coord C, sg_entry_coord EC, sg_state S
 WHERE L.name='ГАЛАКТИКАМИ' AND F.id_lexem=L.id AND E.id=F.id_entry AND
       C.name='ОДУШ' AND
       EC.id_entry=E.id AND EC.icoord=C.id AND
       S.id_coord=C.id AND S.id=EC.istate

В качестве закрепления посмотрим, как вывести одновременно оба признака, и род и одушевленность, для любого существительного.

Как уже было сказано, одна запись в sg_entry может быть связана с несколькими записями в sg_entry_coord, в частности для каждого существительного будет одна запись для рода, вторая для одушевленности и третья для признака перечислимости. В рамках одного SQL запроса мы можем включить таблицу sg_entry_coord несколько раз, вводя для каждой новой копии осмысленный синоним. Разумеется, таблицы sg_coord и sg_state можно тоже указать в запросе по 2 раза:

SELECT DISTINCT E.id, E.name, S_Gender.name, S_Animacy.name
 FROM  sg_lexem L, sg_form F, sg_entry E, sg_coord C_Gender, sg_entry_coord EC_Gender, sg_state S_Gender, sg_entry_coord EC_Animacy, sg_coord C_Animacy, sg_state S_Animacy
 WHERE L.name IN ('ГАЛАКТИКАМИ','МЕДВЕДЮ') AND F.id_lexem=L.id AND E.id=F.id_entry AND
       C_Gender.name='РОД' AND EC_Gender.id_entry=E.id AND EC_Gender.icoord=C_Gender.id AND S_Gender.id_coord=C_Gender.id AND S_Gender.id=EC_Gender.istate AND
       C_Animacy.name='ОДУШ' AND EC_Animacy.id_entry=E.id AND EC_Animacy.icoord=C_Animacy.id AND S_Animacy.id_coord=C_Animacy.id AND S_Animacy.id=EC_Animacy.istate

Так как поиск по таблице SG_LEXEM сделан через оператор IN, то результаты содержат информацию для двух существительных:

idnamenamename
1073922118галактикаЖЕННЕОДУШ
1073903203медведьМУЖОДУШ

Дополнительные материалы по работе со словарной базой

Купить словарную базу русской морфологии

Реляционная схема словарной базы

  © Козиев Илья 2019
изменено 13-Mar-12