2015-01-26 99 views
0

能够创建一个倒排索引,但我不能完全实现位置索引。位置索引的格式为[doc_ID, pos_1, pos_2, ...]位置索引在python中?

此处doc_ID指示该单词出现在哪个文档以及该文档出现在哪个位置。

Ex。 index = positional_index(['a','b','a'], ['a','c']]) 当用户输入时index['a']它会返回[[0,0,2], [1,0]]

以下代码是针对提到的倒排索引。我不知道还有什么要补充,使其位置指数:

def positional index(tokens): 
    d = defaultdict(lambda:[]) 

    for docID, t_list in enumerate(tokens): 
     for t in t_list: 
      d[t].append(docID) 

return d 

所有的帮助将不胜感激。

+1

什么背后的逻辑'[[0,0,2],[ 1,0]]为'a'的索引?你的解释不清楚! – Kasramvd 2015-01-26 20:40:37

+0

'a'在文档0中,位置0和2以及文档1的位置0.基本上,第一个数字是[]它是从0开始的,其余的在[]中是[ (这种情况'a')存在...这也从零开始 – Makio21 2015-01-26 20:43:29

+0

是'__getitem__'样式访问(即'index ['a']')是强制性的?如果不是,那么卡斯拉AD的答案很好 – Anentropic 2015-01-26 21:01:24

回答

1

您可以使用以下功能:

>>> def find_index(l,elem) : 
... return [[i]+[t for t,k in enumerate(j) if k==elem] for i,j in enumerate(l)] 
... 
>>> find_index(l,'a') 
[[0, 0, 2], [1, 0]] 

所有的东西,你需要的是在这里,在两个列表理解使用enumerate

1

使用自己的代码,你只需要添加索引的每个元素,并使用docID的一组,以避免重复键:

def positional_index(tokens): 
    d = defaultdict(lambda:[]) 
    for docID, sub_l in enumerate(tokens): 
     for t in set(sub_l): 
      d[t].append([docID] + [ind for ind, ele in enumerate(sub_l) if ele == t]) 
    return d 

In [9]: index= positional_index([['a','b','a'], ['a','c']]) 

In [10]: index["a"] 
Out[10]: [[0, 0, 2], [1, 0]] 
In [11]: index["b"] 
Out[11]: [[0, 1]] 

In [12]: index["c"] 
Out[12]: [[1, 1]] 
+0

'defaultdict(lambda:[])'与'defaultdict(list)'不同吗? – IceArdor 2015-01-26 21:42:46

+0

@IceArdor,在这里几乎没什么区别,通常你会在使用'defaultdict(lambda:defaultdict(list))'时使用它' – 2015-01-26 21:50:26

+0

虽然使用Python 2的lambda实际上看起来效率稍高 – 2015-01-26 21:56:18