Skip to content

Модель данных

Dmitry Granovsky edited this page Mar 26, 2015 · 11 revisions

Здесь будет описание устройства базы данных 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    |       |
+----------+--------------+------+-----+---------+-------+