-
Notifications
You must be signed in to change notification settings - Fork 23
Модель данных
Здесь будет описание устройства базы данных OpenCorpora для разработчиков.
Корпус -- это коллекция размеченных текстов. Как хранятся тексты?
Самая крупная единица организации контента в корпусе -- это текст (или "книга"). Тексты организованы иерархически и хранятся в таблице books
:
+---------------------+-----------------------+------+-----+---------+----------------+
| book_id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment |
| book_name | varchar(255) | NO | | NULL | |
| parent_id | int(10) unsigned | NO | MUL | 0 | |
| syntax_on | tinyint(3) unsigned | NO | MUL | NULL | |
| old_syntax_moder_id | smallint(5) unsigned | NO | | NULL | |
| ne_on | tinyint(3) unsigned | NO | MUL | NULL | |
+---------------------+-----------------------+------+-----+---------+----------------+
Последние три поля связаны с экспериментальными уровнями разметки и вам неинтересны.
Текст состоит из параграфов (таблица paragraphs
), тут всё просто. Колонка pos
задаёт порядок следования.
+---------+-----------------------+------+-----+---------+----------------+
| par_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| book_id | mediumint(8) unsigned | NO | MUL | NULL | |
| pos | smallint(5) unsigned | NO | MUL | NULL | |
+---------+-----------------------+------+-----+---------+----------------+
Аналогично параграф состоит из предложений (таблица sentences
). У предложения есть поле source, где для разных целей записывается его исходный текст до токенизации. Последняя колонка полуэкспериментальная, не важна.
+--------------+-----------------------+------+-----+---------+----------------+
| sent_id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment |
| par_id | smallint(5) unsigned | NO | MUL | NULL | |
| pos | smallint(5) unsigned | NO | MUL | NULL | |
| source | text | NO | | NULL | |
| check_status | smallint(5) unsigned | NO | | NULL | |
+--------------+-----------------------+------+-----+---------+----------------+
Наконец, предложение состоит из токенов (таблица tokens
). У токена есть текст. Если взять все токены предложения и слить подряд их тексты, расставляя кое-где пробелы, должен получиться source этого предложения.
+---------+-----------------------+------+-----+---------+----------------+
| tf_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| sent_id | mediumint(8) unsigned | NO | MUL | NULL | |
| pos | smallint(5) unsigned | NO | MUL | NULL | |
| tf_text | varchar(100) | NO | | NULL | |
+---------+-----------------------+------+-----+---------+----------------+
Метаинформация о текстах хранится в тегах (таблица book_tags
). Тег -- это просто строка. В реальности большинство тегов представляют собой строку вида "ключ:значение".
+----------+-----------------------+------+-----+---------+-------+
| book_id | mediumint(8) unsigned | NO | MUL | NULL | |
| tag_name | varchar(512) | NO | MUL | NULL | |
+----------+-----------------------+------+-----+---------+-------+
Некоторые из тегов имеют вид url:http://...
, они указывают на первоисточник текста. Первоисточники мы скачиваем и храним у себя. Для их учёта существует таблица downloaded_urls
, в которой filename
-- имя локального файла:
+----------+--------------+------+-----+---------+-------+
| url | varchar(512) | NO | MUL | NULL | |
| filename | varchar(100) | NO | | NULL | |
+----------+--------------+------+-----+---------+-------+