我有大约 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%。))