私は、約 500,000 のドキュメントへの逆インデックスのセットとして約 10,000 語を使用しています。どちらも正規化されているため、インデックスは整数 (単語 ID) から一連の整数 (単語を含むドキュメントの ID) へのマッピングになります。
私のプロトタイプでは、当然のデータ型として Python のセットを使用しています。
ドキュメントを検索すると、N 個の検索語とそれに対応する N 個のセットのリストが見つかります。これらの N セットの交差点にあるドキュメントのセットを返したいと思います。
Python の「交差」メソッドは、ペアワイズ リダクションとして実装されています。ライブラリがiの後に次のエントリを取得する高速な方法を提供している限り、ソートされたセットの並列検索を使用すると、より適切に実行できると思います。
私はしばらくの間、そのようなものを探していました。何年も前に私はPyJudyを書きましたが、もはやそれを維持することはなく、再び快適に使えるようになるまでにどれだけの作業が必要になるかを知っています。私はむしろ他の誰かの十分にテストされたコードを使用したいと思います。また、高速なシリアライゼーション/デシリアライゼーションをサポートするコードが欲しいです。
Pythonバインディングでは何も見つからないか、少なくとも何も見つかりません。私が望むことを行うavltreeがありますが、ペアごとのセットのマージでさえ、必要以上に時間がかかるため、すべての操作を C/C++ で実行したいと考えています。
Python の C/C++ 拡張機能として書かれた基数/パトリシア/クリビット ツリー ライブラリを知っていますか?
それができない場合、ラップする必要がある最も適切なライブラリは何ですか? Judy Arrayサイトは 6 年間更新されておらず、1.0.5 が 2007 年 5 月にリリースされました。
(編集:APIから探しているものを明確にするために、次のようなものが必要です:
def merge(document_sets):
probe_i = 0
probe_set = document_sets[probe_i]
document_id = GET_FIRST(probe_set)
while IS_VALID(document_id):
# See if the document is present in all sets
for i in range(1, len(document_sets)):
# dynamically adapt to favor the least matching set
target_i = (i + probe_i) % len(document_sets)
target = document_sets[target_i]
if document_id not in target_set:
probe_i = target_id
probe_set = document_sets[probe_i]
document_id = GET_NEXT(probe_set, document_id)
break
else:
yield document_id
指定されたエントリの後に発生する次のエントリを返すために GET_NEXT() を実装するものを探しています。これは、Judy1Nおよび他の Judy 配列の同様のエントリに対応します。
このアルゴリズムは、データに動的に適応し、ヒットの少ないセットを優先的に優先する必要があります。私が扱うデータのタイプでは、これによりパフォーマンスが 5 ~ 10% 向上しました。) )