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 | 语料库名称 | 文件名 | 编号 | 号码 | 号码 | 令牌 | 位置 | 感觉标签 | 氖

| 198317 | 吧台 | br-392 | 1 | 1 | 1 | 你好 | VB | 012345678-v | 无 |

| 192184 | 吧台 | br-392 | 1 | 1 | 1 | 吧台 | 神经网络 | 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. 我是否仍应使用与上面定义的表相同的模式?

4

2 回答 2

3

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

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

模型

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

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

于 2013-09-12T13:52:27.320 回答
3

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

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

你也没有说你正在使用什么平台。如果它是移动设备,那么尽可能地标准化您的数据确实是值得的。它使代码更复杂一点,但这始终是空间/时间的权衡与这样的东西。我猜这是某种参考应用程序,在这种情况下,纯粹的致盲速度可能仅次于使其工作。

规范化的强制性维基百科链接

和这个YouTube 视频

谷歌是你的朋友,希望对你有所帮助。:) 肖恩

于 2013-09-08T08:23:06.160 回答