12

我有大约 10,000 个单词用作大约 500,000 个文档的一组反向索引。两者都是标准化的,因此索引是整数(单词 id)到一组整数(包含单词的文档的 id)的映射。

我的原型使用 Python 的集合作为明显的数据类型。

当我搜索文档时,我会找到 N 个搜索词的列表及其对应的 N 个集合。我想返回这 N 个集合的交集中的文档集。

Python 的“相交”方法是作为成对归约实现的。我认为我可以通过并行搜索排序集做得更好,只要库提供了一种快速获取i之后的下一个条目的方法。

我一直在寻找类似的东西一段时间。几年前,我编写了PyJudy,但我不再维护它,而且我知道需要做多少工作才能让它再次适应它的阶段。我宁愿使用别人的经过良好测试的代码,我想要一个支持快速序列化/反序列化的代码。

我找不到任何 Python 绑定,或者至少找不到任何 Python 绑定。有avltree 可以满足我的要求,但由于即使是成对的集合合并也比我想要的要长,我怀疑我想在 C/C++ 中完成所有操作。

你知道任何作为 Python 的 C/C++ 扩展编写的 radix/patricia/​​critbit 树库吗?

如果做不到这一点,我应该包装的最合适的库是什么?Judy Array网站已经 6年没有更新了,2007 年 5 月发布了 1.0.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

前缀树 (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 回答