Робот
Устройство и подключение
Управляющее ПО
Язык BML
Словарь жестов
SSSender
API робота
Когнитивный компонент
Обработка текста
Парсер
Массивы текстов
База разборов

База данных результатов разбора

Все разборы предложений хранятся в базе данных Emotional.

Схема

Схема базы данных

Таблицы

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, id семантического признака (поле 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, hash конкретного запуска

Запрос, который выводит все предложения, в которых есть конкретное слово, например слово смеяться:

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, синтаксическое дерево
  • hash, varchar, hash конкретного запуска

referents (референты)