Структура данных для базы данных текстовых материалов

Текстовый корпус обычно представлен в xml как таковой:

<corpus name="foobar" date="08.09.13" authors="mememe"> <document filename="br-392"> <paragraph pnumber="1"> <sentence snumber="1"> <word wnumber="1" partofspeech="VB" sensetag="012345678-v" nameentity="None">Hello</word> <word wnumber="2" partofspeech="NN" sensetag="876543210-n" nameentity="World">Foo bar</word> </sentence> </paragraph> </document> </corpus> 

Когда я пытаюсь поместить корпус в базу данных, каждая строка должна представлять слово, а столбцы таковы:

| uid | corpusname | docfilename | pnumber | snumber | wnumber | токен | pos | sensetag | Небраска

| 198317 | foobar | br-392 | 1 | 1 | 1 | Привет! VB | 012345678-v | Нет |

| 192184 | foobar | br-392 | 1 | 1 | 1 | foobar | NN | 87654321-n | Мир |

Я помещал данные в базу данных sqlite3 как таковую:

 # I read the xml file and now it's in memory as such. w1 = (198317,'foobar','br-392',1,1,1,'hello','VB','12345678-n','Hello') w2 = (192184,'foobar','br-392',1,1,1,'foobar','NN','87654321-n','World') con = sqlite3.connect('semcor.db', isolation_level=None) cur = con.cursor() engtable = "CREATE TABLE eng(uid INT, corpusname TEXT, docname TEXT,"+\ "pnum INT, snum INT, tnum INT,"+\ "word TEXT, pos TEXT, sensetag TEXT, ne TEXT)" cur.execute(engtable) cur.executemany("INSERT INTO eng VALUES(?,?,?,?,?,?,?,?,?,?)", \ wordtokens) 

Цель базы данных состоит в том, чтобы я мог запускать запросы как таковые

 SELECT * from ENG if paragraph=1; SELECT * from ENG if sentence=1; SELECT * from ENG if sentence=1 and pos="NN" or sensetag="87654321-n" SELECT * from ENG if pos="NN" and sensetag="87654321-n" SELECT * from ENG if docfilename="br-392" SELECT * from ENG if corpusname="foobar" 

Похоже, что когда я структурирую базу данных, как указано выше, мой размер базы данных взрывается, потому что количество токенов в каждом корпусе может увеличиваться до миллионов или миллиардов.

Помимо структурирования корпуса, поскольку каждая строка для слова и столбцов имеет свой атрибут и родительский атрибут, как еще я могу структурировать базу данных, я могу выполнять запросы и получать один и тот же результат?

Для индексации крупноформатного корпуса,

  1. Должен ли я использовать некоторые другие программы баз данных, отличные от sqlite3?

  2. И должен ли я использовать ту же схему для таблицы, как я определил выше?

И должен ли я использовать ту же схему для таблицы, как я определил выше?

В перспективе реляционной базы данных, из-за 1NF , я буду использовать таблицу для каждого элемента XML-файла.
Мы сэкономим место, и мы поможем работать с СУБД.
Используя модель, требуемые запросы будут применяться
Проект модели будет:

модель

Должен ли я использовать некоторые другие программы баз данных, отличные от sqlite3?

На это можно ответить на основе вашей спецификации приложения, например, сколько записей данных вы будете иметь после месяца, года, …, сколько пользователей будет подключено, это OLTP или OLAP или смешанный, бюджет проектов и … ,
BTW взглянуть на бесплатные R-DBMS, такие как PostgreSQL, MySQL и коммерческие, такие как Oracle.
Для решений NoSql, которые смотрят на сообщение, может быть полезно

Я предполагаю, что очевидным ответом является «нормализация» … у вас есть огромное количество дублированной информации для каждой строки, и это значительно увеличит размер вашей базы данных.

Вы должны выработать из каждой строки то, что дублируется, а затем создать таблицу для хранения этих данных, а затем вы уменьшите, например, дублируемую строку, содержащую длину тела, скажем, 20 символов, до указателя на строку в таблица «corpus name», которая для аргументов может просто взять 4 символа в качестве значения идентификатора этой записи.

Вы не говорите, какую платформу вы используете. Если это мобильное устройство, оно действительно действительно платит, чтобы нормализовать ваши данные как можно больше. Это делает код немного более сложным, но это всегда компромисс между пространством и временем с такими вещами. Я предполагаю, что это какое-то ссылочное приложение, и в этом случае чистая ослепляющая скорость, вероятно, является вторичной для того, чтобы заставить ее работать.

Обязательная ссылка на википедию для нормализации

и это видео на YouTube

Google – ваш друг, надеюсь, что это поможет. 🙂 Шон