存储倒排索引

时间:2010-09-10 19:29:57

标签: python information-retrieval inverted-index

我正在开发一个关于Info Retrieval的项目。 我使用Hadoop / Python制作了完全倒置索引。 Hadoop将索引输出为(word,documentlist)对,这些对写在文件上。 为了快速访问,我使用上面的文件创建了一个字典(哈希表)。 我的问题是,如何在磁盘上存储这样一个也具有快速访问时间的索引。 目前我正在使用python pickle模块存储字典并从中加载 但它会立刻将整个索引带入内存(或者它是什么?)。 请建议一种有效的方法来存储和搜索索引。

我的词典结构如下(使用嵌套词典)

{word:{doc1:[locations],doc2:[locations],....}}

这样我就可以获得包含单词的文档了 字典[word] .keys()......等等。

6 个答案:

答案 0 :(得分:4)

shelve

  

目前我正在使用python pickle模块存储字典并从中加载,但它会立即将整个索引存入内存(或者是吗?)。

是的它确实带来了全部。

这是一个问题吗?如果这不是一个实际问题,那么坚持下去。

如果这是一个问题,你有什么问题?太慢了?太快?太多彩了?使用的内存太多了?你有什么问题?

答案 1 :(得分:1)

我会使用Lucene。为什么重新发明轮子?

答案 2 :(得分:0)

只需将其存储在如下字符串中:

<entry1>,<entry2>,<entry3>,...,<entryN>

如果<entry*>包含','字符,请使用其他分隔符,例如'\ t'。 它的尺寸小于等效的酸洗绳。

如果您想加载它,只需执行:

L = s.split(delimiter)

答案 3 :(得分:0)

您可以存储字典的repr()并使用它来重新创建它。

答案 4 :(得分:0)

如果加载或使用太多内存需要很长时间,则可能需要一个数据库。你可能会使用很多;我可能会从SQLite开始。然后你的问题被“减少”;-)简单地制定正确的查询以从数据库中获得你需要的东西。这样你就只能加载你需要的东西。

答案 5 :(得分:0)

我正在使用anydmb用于此目的。 Anydbm提供了相同的类字典接口,除了它只允许字符串作为键和值。但这不是约束,因为您可以使用cPickle的加载/转储在索引中存储更复杂的结构。