Event6 Edge — тип Edge для одновременного выражения 5W1H (Who, What, Whom, When, Where, Why) в одном событии.

Элементы 5W1H

ЭлементАнгл.БитЗначениеСсылка на TID
WhoAgent0Действующее лицоEntity Node
WhatAction1ДействиеVerb Edge
WhomPatient2Объект/пациенсEntity Node
WhenTime3ВремяQuantity/Entity
WhereLocation4МестоEntity Node
WhyReason5Причина/цельClause Edge/Entity

Структура пакета

1st WORD (16 бит)
┌────────────────────┬────────────────────┐
│      Prefix        │     Presence       │
│      10bit         │       6bit         │
└────────────────────┴────────────────────┘

2nd WORD (16 бит)
┌────────────────────────────────────────────┐
│                Edge TID                    │
└────────────────────────────────────────────┘

3rd+ WORD: TID элементов (в порядке Presence)

Битовая маска Presence (6 бит)

БитЭлементЕсли установлен
0WhoTID включён
1WhatTID включён
2WhomTID включён
3WhenTID включён
4WhereTID включён
5WhyTID включён

Всего слов = 2 (заголовок + Edge TID) + popcount(Presence). Диапазон: 3~8 слов (48~128 бит).

Структура по режимам

Минимальный режим (3 слова)

Пример: «Пошёл дождь» (только What)

1st: [Prefix] + [000010]      - только What
2nd: [Edge TID]
3rd: [What TID]               - "rain" Verb Edge

Ключевой режим (5 слов)

Who + What + Whom. Самая частая конфигурация.

Пример: «Иван ударил Петра»

1st: [Prefix] + [000111]      - Who, What, Whom
2nd: [Edge TID]
3rd: [Who TID]                - Иван
4th: [What TID]               - "hit" Verb Edge
5th: [Whom TID]               - Петр

Стандартный режим (6 слов)

Пример: «Иван вчера встретил Марию»

1st: [Prefix] + [001111]      - Who, What, Whom, When
2nd: [Edge TID]
3rd: [Who TID]                - Иван
4th: [What TID]               - "meet" Verb Edge
5th: [Whom TID]               - Мария
6th: [When TID]               - вчера

Полный режим (8 слов)

Пример: «Иван из любви вчера в школе подарил Марии подарок»

1st: [Prefix] + [111111]      - все элементы
2nd: [Edge TID]
3rd: [Who TID]                - Иван
4th: [What TID]               - "give" Verb Edge
5th: [Whom TID]               - Мария
6th: [When TID]               - вчера
7th: [Where TID]              - школа
8th: [Why TID]                - любовь (причина)

Подробности элементов

What (действие)

What ссылается на TID Verb Edge. В соответствующем Verb Edge содержится информация о времени, виде и других квалификаторах.

Why (причина)

Простая причина — TID Entity («любовь»), сложная — TID Clause Edge («из-за дождя»).

Сравнение Event6 и Verb Edge

Verb EdgeEvent6 Edge
ФокусПредикат/действиеЗавершённое событие
УчастникиСтруктура ParticipantTID по 5W1H
Пространство-времяОтдельное выражениеWhen/Where встроены
ПричинаОтдельный ClauseWhy встроен
Слов2~53~8
ПрименениеПредикативное выражениеХранение событий

Руководство по выбору: Для анализа предикатов/предложений — Verb Edge, для хранения событий/записей — Event6 Edge, для простых фактов — Triple Edge.

Примеры

«Apple приобрела Tesla»

Who:  Apple (Q312)     → Entity TID 0x0001
What: acquire          → Verb Edge TID 0x0100
Whom: Tesla (Q478214)  → Entity TID 0x0002

Event6 Edge:
  1st: [1100 000 011] + [000111]  - Prefix + Who,What,Whom
  2nd: [TID: 0x0200]              - Edge TID
  3rd: [TID: 0x0001]              - Apple (Who)
  4th: [TID: 0x0100]              - acquire (What)
  5th: [TID: 0x0002]              - Tesla (Whom)

Всего: 5 слов

«Суворов перешёл Альпы в 1799 году в Швейцарии»

Who:   Суворов          → Entity TID 0x0010
What:  cross (перейти)   → Verb Edge TID 0x0101
When:  1799             → Entity TID 0x0011
Where: Альпы            → Entity TID 0x0012

Event6 Edge:
  1st: [1100 000 011] + [011011]  - Who,What,When,Where
  2nd: [TID: 0x0202]
  3rd: [TID: 0x0010]              - Суворов
  4th: [TID: 0x0101]              - cross
  5th: [TID: 0x0011]              - 1799
  6th: [TID: 0x0012]              - Альпы

Всего: 6 слов

Разбор

def parse_event6(data: bytes) -> dict:
    word1 = int.from_bytes(data[0:2], 'big')

    prefix = word1 >> 6
    assert prefix == 0b1100000011, "Not Event6 Edge"

    presence = word1 & 0x3F
    edge_tid = int.from_bytes(data[2:4], 'big')

    elements = {}
    element_names = ['who', 'what', 'whom', 'when', 'where', 'why']
    offset = 4

    for i, name in enumerate(element_names):
        if presence & (1 << i):
            tid = int.from_bytes(data[offset:offset+2], 'big')
            elements[name] = tid
            offset += 2

    return {
        'presence': presence,
        'edge_tid': edge_tid,
        'elements': elements,
        'words': 2 + bin(presence).count('1')
    }