12

私は、約 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% 向上しました。) )

4

2 に答える 2

5

はい、いくつかありますが、それらがあなたのユースケースに適しているかどうかはわかりません:しかし、どれもあなたが求めたものではないようです.

BioPythonには、C での Trie 実装があります。

ああ、ここにベンチマークを含む素晴らしい議論があります: http://bugs.python.org/issue9520

その他の (いくつかの非常に古い) 実装:

http://pypi.python.org/pypi/radix

py-radix は、IPv4 および IPv6 ネットワーク プレフィックスの格納と取得のための基数ツリー データ構造の実装です。

https://bitbucket.org/markon/patricia-tree/src

パトリシア ツリーの Python 実装

http://pypi.python.org/pypi/trie

プレフィックス ツリー (トライ) の実装。

http://pypi.python.org/pypi/logilab-common/0.50.3

patricia.py : PATRICIA trie (英数字でコード化された情報を取得するための実用的なアルゴリズム) の Python 実装。

于 2011-01-16T19:30:32.380 に答える
3

最近、反復サポートをdatrieに追加しました。試してみてください。

于 2012-07-27T00:45:34.677 に答える