文本语料库数据库的数据结构

时间:2013-09-08 08:10:50

标签: python database database-design sqlite nlp

文本语料库通常用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 |笨蛋| wnumber |代币   | pos | sensetag | NE

     

| 198317 | foob​​ar | br-392 | 1 | 1 | 1 |你好| VB | 012345678-v |   无|

     

| 192184 | foob​​ar | br-392 | 1 | 1 | 1 | foob​​ar | 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. 我是否应该使用与上面定义的表格相同的架构?

2 个答案:

答案 0 :(得分:3)

我想明显的答案是“规范化”......每行有大量的重复信息,这将大大增加数据库的大小。

你应该从每一行中找出重复的内容,然后创建一个包含该数据的表,然后你将减少一个重复的字符串,例如,包含长度为20个字符的语料库长度指向“语料库名称”表中的一行,为了参数起见,可能只需要4个字符作为该条目的ID值。

您没有说出您正在使用的平台。如果它是移动设备,那么它确实需要付费以尽可能地规范化您的数据。它使代码变得更复杂,但总是与这样的东西进行空间/时间权衡。我猜这是一种参考应用程序,在这种情况下,纯粹的炫目速度可能只是让它起作用。

normalisation

的强制性维基百科链接

YouTube video

Google是您的朋友,希望有所帮助。 :)肖恩

答案 1 :(得分:3)

  

我是否应该使用与我定义的表相同的模式   以上?

从关系数据库设计的角度来看,由于1NF,我将使用xml文件的每个元素的表。
我们将节省空间,我们将帮助DBMS性能。
使用该模型,可以应用所需的查询 草案模型将是:

model

  

我应该使用除sqlite3之外的其他一些数据库程序吗?

这可以根据您的应用程序规范来回答,例如您在一个月,一年后会有多少数据记录,...,将连接多少用户,是OLTP还是OLAP还是混合,项目预算和...
BTW看看免费的R-DBMS,如PostgreSQL,MySQL和像Oracle这样的商业版。
对于查看post的NoSql解决方案可能会有所帮助