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>

コーパスをデータベースに入れようとすると、各行が単語を表し、列は次のようになります。

| | ユーザー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"

上記のようにデータベースを構成すると、各コーパス内のトークンの数が数百万または数十億になる可能性があるため、データベースのサイズが爆発的に大きくなるようです。

単語の各行とその属性と親属性を列に持つことによってコーパスを構造化する以外に、クエリを実行して同じ出力を取得できるようにデータベースを構造化するにはどうすればよいでしょうか?

大規模なコーパスを索引化する目的で、

  1. sqlite3 以外のデータベース プログラムを使用する必要がありますか?

  2. また、上記で定義したのと同じスキーマをテーブルに使用する必要がありますか?

4

2 に答える 2

3

明らかな答えは「正規化」だと思います...行ごとに膨大な量の重複情報があり、データベースのサイズが大幅に増加します。

各行から複製されたものを計算し、そのデータを含むテーブルを作成する必要があります。次に、たとえば、長さが 20 文字のコーパスを含む複製された文字列を行へのポインターに減らします。引数のために、そのエントリの ID 値として 4 文字を取る「コーパス名」テーブル。

使用しているプラ​​ットフォームについても言及していません。それがモバイル デバイスの場合、データを可能な限り正規化することは本当に価値があります。コードが少し複雑になりますが、これは常に、このようなものとの空間/時間のトレードオフです。これはある種のリファレンス アプリケーションであると推測しています。

正規化のための必須のウィキペディア リンク

そしてこのYouTube動画

Google はあなたの友達です。お役に立てば幸いです。:)ショーン

于 2013-09-08T08:23:06.160 に答える
3

また、上で定義したのと同じスキーマをテーブルに使用する必要がありますか?

リレーショナル データベース設計の観点から、1NFにより、xml ファイルの要素ごとにテーブルを使用します。
スペースを節約し、DBMS のパフォーマンスを向上させます。
モデルを使用すると、必要なクエリが適用されます
。ドラフト モデルは次のようになります。

モデル

sqlite3 以外のデータベース プログラムを使用する必要がありますか?

これは、アプリケーションの仕様に基づいて回答される場合があります。たとえば、1 か月後、1 年後にいくつのデータ レコードが保持されるか、...、接続されるユーザーの数、OLTP か OLAP か混合か、プロジェクトの予算と ..
ところで、PostgreSQL、MySQL のような無料の R-DBMS と、Oracle のような商用の R-DBMS を見てみましょう。
NoSql ソリューションの場合、投稿を確認すると役立つ場合があります

于 2013-09-12T13:52:27.320 に答える