База данных результатов разбора
Все разборы предложений хранятся в базе данных 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); эти граммемы позволят выбрать для референта точное местоимение, например, он (ед. ч, муж. род).