一个文本语料库通常在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"
当我按照上述方式构建数据库时,由于每个语料库中的标记数可能高达数百万或数十亿,导致我的数据库大小急剧增加。
除了通过为每个单词创建一行和其属性及父属性作为列来构建语料库以外,还有哪些其他方法可以构建数据库,使我能够执行查询并获得相同的输出结果? 针对索引大型语料库的目的,
我应该使用sqlite3以外的其他数据库程序吗?
我是否仍应使用上述定义的表模式?