n-gramによってインデックス付けされたデータを保存するための効率的なデータベースモデル


12

私は、大きなテキストコーパスに存在するn-gramの非常に大きなデータベースを作成する必要があるアプリケーションに取り組んでいます。

3つの効率的な操作タイプが必要です。n-gram自体によってインデックス化されたルックアップと挿入、およびサブn-gramを含むすべてのn-gramのクエリ。

データベースは巨大なドキュメントツリーである必要があり、Mongoなどのドキュメントデータベースはうまく機能するはずですが、大規模に使用したことはありません。

Stack Exchangeの質問形式を知っているので、特定のテクノロジに関する提案を求めているのではなく、このようなものを大規模に実装するために探しているデータベースのタイプを求めていることを明確にしたいと思います。


2
実装したい構造は「試行錯誤」だと思います-その構造で効率的に動作するDBを見つけることができるのか、それとも自分の選択したRDBMSで独自にロールする必要があるのか​​はわかりません。
ニールスレーター14

回答:


9

Lucene NGramTokenizerを参照してください

単にluceneまたは同様のインデックス作成テクニックを使用することはできないのですか?

反転インデックスはn-gramを一度だけ保存し、ngramを含むドキュメントIDのみを保存します。彼らはこれを非常に冗長な生テキストとして保存しません。

クエリサブnグラムを含むnグラムを見つけるために、観測されたnグラムにインデックスを作成します。たとえば、2番目のルセンインデックス、またはトライツリーやサフィックスツリーなどのその他のサブストリングインデックスを使用します。データが動的である場合は、おそらくフレーズクエリを使用してn-gramを見つけるために、luceneが妥当な選択です。


3

基本的にこのタスクでは、B + treeベースのインデックスを適切にサポートしている任意のSQLデータベースを効率的に使用できます(MySQLは最適なスイートを提供します)。

3つのテーブルを作成します。

  1. ドキュメントテーブル、列:id / document
  2. N-gramテーブル:n_gram_id / n_gram
  3. n-gramとドキュメント間のマッピング:document_id / n_gram_id

N-gramテーブル/ n_gram文字列とマッピングテーブル/ n_gram_idにインデックスを作成します。また、デフォルトでプライマリキーにもインデックスが作成されます。

操作が効率的になります。

  1. ドキュメントの挿入:すべてのn-gramを抽出し、ドキュメントテーブルとN-gramsテーブルに挿入するだけ
  2. in_gramのルックアップは、インデックスのサポートにより迅速になります
  3. サブnグラムを含むすべてのnグラムのクエリ:2ステップ-2番目のテーブルのサブnグラムを含むすべてのnグラムのインデックスに基づいてクエリを実行します。次に、これらのn-gramのそれぞれに対応するすべてのドキュメントを取得します。

これらすべての操作を達成するために結合を使用する必要さえないので、インデックスは大いに役立ちます。また、データが1台のマシンに収まらない場合は、1つのサーバーから開始されたn_gramsを別のサーバーまたは他の適切なスキームに保存するなど、シャーディングスキームを実装できます。

また、MongoDBを使用できますが、インデックススキームを実装する必要があるかどうかはわかりません。MongoDBの場合、シャーディングスキームは既に組み込まれているため、無料で入手できます。


1

私はこれをやったことがありませんが、あなたが望む機能を与えられたグラフデータベースの仕事のように聞こえます。これがneo4jのデモです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.