テキスト コーパスは通常、次のように 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>
コーパスをデータベースに入れようとすると、各行が単語を表し、列は次のようになります。
| | ユーザーID | コーパス名 | docfilename | p番号 | 番号 | w番号 | トークン | ポジション | センスタグ | ねえ
| | 198317 | フーバー | br-392 | 1 | 1 | 1 | こんにちは | VB | 012345678-v | なし |
| | 192184 | フーバー | br-392 | 1 | 1 | 1 | フーバー | 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"
上記のようにデータベースを構成すると、各コーパス内のトークンの数が数百万または数十億になる可能性があるため、データベースのサイズが爆発的に大きくなるようです。
単語の各行とその属性と親属性を列に持つことによってコーパスを構造化する以外に、クエリを実行して同じ出力を取得できるようにデータベースを構造化するにはどうすればよいでしょうか?
大規模なコーパスを索引化する目的で、
sqlite3 以外のデータベース プログラムを使用する必要がありますか?
また、上記で定義したのと同じスキーマをテーブルに使用する必要がありますか?