База данных результатов разбора
Все разборы предложений хранятся в базе данных Postgres.
Схема базы

Таблицы
fact_valencies (факты и семантические валентности)
Это центральная таблица базы, в ней хранятся семантические разборы предложений. Одна строка таблицы – один сегмент структуры: слово-вершина этого сегмента (поле lemma), семантическая валентность (valency_alias), которую этот сегмент занимает в этом факте (fact).
Поля таблицы fact_valencies:
- id, int
 - fact, int, id факта (поле id из таблицы facts)
 - referent, int, референт (поле id из таблицы referents)
 - valency_id, int, id семантической валентности
 - valency_alias, varchar, название семантической валентности
 - lemma_id, int, id лексемы
 - lemma, varchar, лексема
 - wordform_id, int, id словоформы
 - wordform, varchar, словоформа
 
Запрос, который выводит все предикаты, присутствующие в базе, с указанием id факта:
select lemma, fact
    from  fact_valencies
    where valency_alias = 'p'Результат:
| lemma | fact | 
|---|---|
| превращаться | 3602304 | 
| перевезти | 3602363 | 
| смочь | 3602378 | 
| мочь | 3602381 | 
| подумать | 3602386 | 
Объединив таблицу саму с собой, можно делать более сложные запросы. Например, вывести всё, что пьют, для этого нужно найти все факты, в которых место предиката занимает лексема пить, после чего вывести значения лексем, занимающих в этих фактах место пациенса (в конструкции пить Икс Икс занимает валентность пациенса при предикате пить).
select FV2.fact, FV2.lemma  
    from fact_valencies FV1
    join fact_valencies FV2 on FV1.fact = FV2.fact
    where FV1.valency_alias = 'p' 
    and FV1.lemma = 'пить'  
    and FV2.valency_alias = 'pat'Результат:
| lemma | fact | 
|---|---|
| вода | 3604495 | 
| чай | 3604512 | 
| вода | 3604547 | 
| пиво | 3626456 | 
facts (все факты)
В этой таблице хранится список фактов. Факт – это семантическая структура предложения: предикат (и его семантические признаки) и его актанты (и их семантические признаки). Из одного предложения может быть извлечено несколько фактов – по числу предикатов в этом предложении. Из предложений без предиката извлекается один факт, однако его семантические валентности (см fact_valencies) остаются незаполненными.
Поля таблицы facts:
- id, int
 - meta, jsonb, метаинформация о факте: версии всех компонентов анализа
 - hash, varchar, hash конкретного запуска
 
Запрос, который выводит все предложения, из которых были извлечены факты:
select id, meta->'metadata'->'splitter'->>'text' sentence
    from factsРезультат:
| id | sentence | 
|---|---|
| 870645 | себе испортил, людям испортил. | 
| 870639 | цокал языком, стыдил, укорял- я его почти не слушала. | 
| 870640 | цокал языком, стыдил, укорял- я его почти не слушала. | 
| 870642 | - крутил башкой турок,- зачем все испортил? | 
| 870644 | себе испортил, людям испортил. | 
Видно, что из предложения цокал языком, стыдил, укорял- я его почти не слушала извлечено по крайней мере два факта: 870639, 870640, всего в этом предложении четыре факта: 1) цокал языком, 2) стыдил, 3) укорял, 4) я его почти не слушала
Можно это проверить. Запрос, который выводит id фактов, которые были извлечены из конкретного предложения:
select id, meta->'metadata'->'splitter'->>'text' sentence
    from facts
    where meta->'metadata'->'splitter'->>'text' = 'цокал языком, стыдил, укорял- я его почти не слушала.'Результат подтверждает: фактов действительно четыре:
| id | sentence | 
|---|---|
| 870638 | цокал языком, стыдил, укорял- я его почти не слушала. | 
| 870641 | цокал языком, стыдил, укорял- я его почти не слушала. | 
| 870639 | цокал языком, стыдил, укорял- я его почти не слушала. | 
| 870640 | цокал языком, стыдил, укорял- я его почти не слушала. | 
Теперь объединим таблицы facts и fact_valencies, чтобы увидеть, какие лексемы занимают какие валентности в этих четырёх фактах:
select F.id fact_id, FV.lemma, FV.valency_alias
    from facts F
    join fact_valencies FV on FV.fact = F.id
    where F.id in (870638, 870641, 870639, 870640)Результат:
| fact_id | lemma | valency_alias | 
|---|---|---|
| 870638 | цокать | p | 
| 870638 | язык | instr | 
| 870639 | стыдить | p | 
| 870640 | укорять | p | 
| 870641 | я | ag | 
| 870641 | он | pat | 
| 870641 | слушать | p | 
fact_markers (семантические признаки сегментов факта)
В этой таблице хранится информация о том, какие семантические признаки (маркеры) есть у сегмента, занимающего некоторую валентность в некотором факте. Для каждого объекта из таблицы fact_valencies в таблице fact_markers может быть как множество строк (по одной на каждый семантический признак каждой лексемы, входящей в сегмент), так и ни одной строки (в случае, если у всех лексем, входящих в этот сегмент, не размечено ни одного семантического признака).
Поля таблицы fact_markers:
- id, int
 - valency, int, ссылка на объект из таблицы fact_valencies
 - marker_id, int, идентификатор семантического признака (поле sql_id таблицы markers)
 - marker, в настоящее время не используется
 - attr, int, семантическая зона
 
Выведем семантические признаки для всех сегментов конкретного факта, например, для факта я его почти не слушала (id 870641). Для этого нужно объединить таблицы fact_valencies и fact_markers:
select FV.fact fact_id, FV.lemma, FV.valency_alias, FM.marker_id
    from fact_valencies FV
    join fact_markers FM on FM.valency = FV.id
    where FV.fact = 870641Результат:
| fact_id | lemma | valency_alias | marker_id | 
|---|---|---|---|
| 870641 | я | ag | 1 | 
| 870641 | я | ag | 11 | 
| 870641 | я | ag | 14 | 
| 870641 | я | ag | 62 | 
| 870641 | он | pat | 14 | 
| 870641 | слушать | p | 31 | 
| 870641 | слушать | p | 36 | 
| 870641 | слушать | p | 187 | 
| 870641 | слушать | p | 389 | 
Видно, что у сегмента с вершиной он только один семантический признак, в то время как у сегмента с вершиной слушать их четыре. Из этой таблицы непонятно, что это за признаки, они описаны в таблице markers.
h3. markers (все семантические признаки)
В этой таблице перечислены все семантические признаки. Важно, что с таблицей fact_markers таблица markers связана полем sql_id.
Поля таблицы markers:
- id, int
 - sql_id, int, реальный идентификатор семантического признака
 - name, varchar, название семантического признака
 
Усовершенствуем запрос, выводящий семантические признаки для всех сегментов конкретного факта, из главы про таблицу fact_markers. Теперь запрос будет выводить не просто идентификаторы семантических признаков сегментов факта я его почти не слушала (id 870641), но и названия этих признаков:
select FV.fact fact_id, FV.lemma, FV.valency_alias, FM.marker_id, M."name" marker_name
    from fact_valencies FV
    join fact_markers FM on FM.valency = FV.id
    join markers M on M.sql_id = FM.marker_id 
    where FV.fact = 870641Результат:
| fact_id | lemma | valency_alias | marker_id | marker_name | 
|---|---|---|---|---|
| 870641 | я | ag | 1 | ч-некто | 
| 870641 | я | ag | 11 | ч-другой | 
| 870641 | я | ag | 14 | о-об | 
| 870641 | я | ag | 62 | ч-ПРИНЦИПАЛ | 
| 870641 | он | pat | 14 | о-об | 
| 870641 | слушать | p | 31 | пм-думать | 
| 870641 | слушать | p | 36 | пм-слышать | 
| 870641 | слушать | p | 187 | пм-внимание | 
| 870641 | слушать | p | 389 | л-не | 
Рассмотрим запрос, который обращён не к конкретному факту, а ко всей базе. Он выводит все предикаты, имеющие конкретный семантический признак, на примере семантического признака пф-ингест, обозначающего приём пищи.
select FV.fact fact_id, FV.valency_alias, FV.lemma, M."name" marker_name
    from fact_valencies FV
    join fact_markers FM on FV.id = FM.valency
    join markers M on M.sql_id = FM.marker_id
    where FV.valency_alias = 'p' 
    and M.name = 'пф-ингест'  Результат:
| fact_id | lemma | valency_alias | marker_name | 
|---|---|---|---|
| 799889 | p | есть | пф-ингест | 
| 799893 | p | есть | пф-ингест | 
| 800138 | p | хлебнуть | пф-ингест | 
| 800142 | p | выпить | пф-ингест | 
| 800116 | p | хлебнуть | пф-ингест | 
| 800117 | p | закусить | пф-ингест | 
sentences (все предложения со всеми словами)
В эту таблицу сохраняются все прошедшие анализ предложения. Если в таблице fact_valencies перечислены только лексемы-вершины сегмента, то в таблице sentences в поле sentence в формате json перечислены все слова предложения со всеми возможными омонимами.
Поля таблицы sentences:
- id, int
 - meta, jsonb, метаинформация о предложении: версии всех компонентов анализа
 - sentence, jsonb, все сегменты предложения
 - hash, varchar, хэш от версий всех компонентов разбора: морфологии и синтаксиса
 
Запрос, который выводит все предложения, в которых есть конкретное слово, например, слово смеяться:
select meta->'metadata'->'splitter'->>'text' sentence
    from sentences
    where sentence @@ '*.token_lemma = "смеяться"'Результат:
| sentence | 
|---|
| но ольга умеет смеяться над собой тайский трансвестит развлёк российских туристов, спародировав песню ольги бузовой” под звуки поцелуев”. | 
| ( and today our royal navy is about as powerful as a f@rt in a teacup- от переводчика, долго смеялся и не стал заменять английскую идиому на русскую, решил сохранить британский колорит))). | 
| и обязательно продолжайте шутить и смеяться— это удлиняет жизнь,— закончил своё поздравление министр. | 
| глава мид рф сергей лавров поздравил россиян с новым годом и посоветовал как можно больше смеяться и шутить. | 
| ( смеётся. | 
| несмотря на полную адекватность и ориентированность, он то смеялся над обращённой к нему фразой, то пытался вспоминать молодость, которая, по его мнению, тоже была полна веселья и радости. | 
| пятиминутка ещё не закончена,— заведующий, уже устав смеяться, взывал к порядку. | 
| — она так здорово играет, так здорово смеется, так здорово читает и катается на роликах, что я не верю тем докторам, о которых ты говорил. | 
| она смеётся, радуется отличной погоде и отправляется на прогулку. | 
| во время выступления бирна она много смеялась и одновременно ела m&m. | 
syntax (синтаксические разборы)
В этой таблице хранятся синтаксические разборы предложений.
Поля таблицы syntax:
- id, int
 - meta, jsonb, метаинформация о дереве: версии всех компонентов анализа
 - tree, jsonb, синтаксическое дерево в формате json
 - hash, varchar, хэш от версий всех компонентов разбора: морфологии и синтаксиса
 
referents (референты)
В этой таблице хранятся референты – то есть объекты, обозначаемые в тексте. Обычно референтами считаются существительные-актанты. В высказывании Вася считал стол удобным референтами обычно считаются Вася и стол. Мы также рассматриваем как референт глагол считал (занимает валентность p) и прилагательное удобным (занимает валентность it). То есть мы рассматриваем в качестве отдельного референта каждую валентность в предложении, включая сам предикат.
- id, int
 - lemmata, jsonb, частотный словарь лексем, которыми обозначался в тексте данный референт, например: Вася, студент, он
 - grammar, jsonb, частотный словарь граммем, которые используются в обозначениях данного референта, например: единственное число (sing), мужской род (masc); эти граммемы позволят выбрать для референта точное местоимение, например, он (ед. ч, муж. род).