为了我自己对数据检索的兴趣,我正在开发一个selfProjet。我有一个文本文件的格式如下。
.I 1
.T
experimental investigation of the aerodynamics of a
wing in a slipstream . 1989
.A
brenckman,m.
.B
experimental investigation of the aerodynamics of a
wing in a slipstream .
.I 2
.T
simple shear flow past a flat plate in an incompressible fluid of small
viscosity .
.A
ting-yili
.B
some texts...
some more text....
.I 3
...".I 1“表示对应于doc ID1的文本块的开头,".I 2”表示对应于文档ID2的文本块的开始。
我做了:
{key: word} {Values are arraylist of docID and frequency of that word in that docID} aerodynam [[Doc_00001,5],[Doc_01344,4],[Doc_00123,3]]
book [[Doc_00562,6],[Doc_01111,1]]
....
....
result [[Doc_00010,5]]
....
....
zzzz [[Doc_01235,1]]现在我的问题:假设用户有兴趣知道:
(输入)所以假设她进入
(输出)
如你所见,可能会有
因此,我想对TreeMultimap运行查询,并在单词(键)中搜索,并将值(文档列表)检索给用户。
我应该如何思考这个问题,以及如何设计我的解决方案?我应该读哪些文章或算法?任何想法都将不胜感激。(谢谢你阅读这篇长篇文章)
发布于 2015-06-16 08:33:40
您所使用的集合是Cranfield测试集合,我相信它有大约3000份文档。对于这种大小的集合,可以使用基于散列或基于trie的组织在内存中存储倒排列表(您已经构造的数据结构),对于实际的大得多的集合,通常由数百万个文档组成,在这种情况下,您会发现很难将倒排列表完全存储在内存中。
因此,实际的解决方案不是重新发明轮子,而是使用标准的文本索引(和检索)框架,如卢塞尼。这个教程应该可以帮助您开始工作。
您寻求解决的问题可以通过布尔查询来回答,您可以在其中指定一组布尔运算符和,OR,而不是在其组成术语之间指定。露西尼支持这个。看看API文档这里和相关的StackOverflow问题这里。
布尔查询检索算法非常简单。每个项对应的列表元素(即文档it )按排序顺序存储,以便在运行时能够计算与列表大小线性的并和交集,即O(n1+n2).(这非常类似于合并)。您可以在此书章中找到更多信息。
https://stackoverflow.com/questions/30856360
复制相似问题