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

3

一个文本语料库通常在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 | token | pos | sensetag | ne | | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | | 198317 | foobar | br-392 | 1 | 1 | 1 | Hello | VB | 012345678-v | None | | 192184 | foobar | br-392 | 1 | 1 | 1 | foobar | NN | 87654321-n | World |
我将这些数据存储到了一个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个回答

3
我认为显而易见的答案是“规范化”...每行都有大量重复的信息,这将极大地增加数据库的大小。
您应该从每行中找出重复的内容,然后创建一个包含那些数据的表,例如,将包含20个字符的语料库长度的重复字符串缩减为指向“语料库名称”表中的一行的指针,而该表只需要将4个字符作为该条目的ID值。
您也没有说您使用的平台是什么。如果它是移动设备,则尽可能规范化您的数据确实很重要。这使得代码稍微复杂了一些,但这总是时间和空间的权衡。我猜这是某种参考应用程序,在这种情况下,纯粹的盲速度可能次于让它正常工作。
必需的维基百科链接:规范化 以及这个YouTube视频 Google是您的朋友,希望有所帮助。:) 肖恩

http://highscalability.com/blog/2008/7/16/the-mother-of-all-database-normalization-debates-on-coding-h.html - alvas
1
刚刚看了那个页面,笑得前仰后合!不过其中有些要点我认为是很重要的,而且我绝对同意出于效率原因,去规范化应该是最后的选择。但在这种情况下,我认为它实际上会有所帮助。 - Emacs The Viking

3

我应该仍然使用我上面定义的相同表结构吗?

从关系型数据库设计的角度来看,由于第一范式,我将为xml文件的每个元素使用一个表格。
我们可以节省空间并提高DBMS性能。
使用这个模型,所需的查询将是可应用的。
草案模型如下:

model

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

这可能取决于您的应用程序规格,例如一个月、一年后您将拥有多少数据记录,有多少用户将连接,它是OLTP、OLAP还是混合的,项目预算等等。
顺便看看像PostgreSQL、MySQL这样的免费R-DBMS和商业软件Oracle也是不错的选择。
对于NoSql解决方案,查看post可能会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接