我正在寻找创建一个以两个或多个列表作为参数的positional_index函数,并且应该返回doc_id以及各种列表中出现的单词的位置。
前:
index = create_positional_index([['a', 'b', 'a'], ['a', 'c']])
index['a']
[[0, 0, 2], [1, 0]]
index['b']
[[0, 1]]
index['c']
[[1, 1]]
这里第一个'0'代表doc_id,后跟'a'出现在文档0中的位置。因为'a'出现在我们有两个列表的文档中。 'b'仅出现在文档0中,'c'仅出现在文档1 ..
中任何人都可以帮我写这个功能吗?
答案 0 :(得分:0)
您可以使用以下功能:
>>> from itertools import chain
>>> sample_list = [['a', 'b', 'a'], ['a', 'c']]
>>> def find_index(s_list) :
... for elem in set(chain(*s_list)) :
... yield {elem:[[i]+[t for t,k in enumerate(j) if k==elem] for i,j in enumerate(s_list)]}
...
>>> list(find_index(sample_list)
... )
[{'a': [[0, 0, 2], [1, 0]]}, {'c': [[0], [1, 1]]}, {'b': [[0, 1], [1]]}]
这里需要的所有内容都是在两个列表理解中使用enumerate
。请注意set(chain(*s_list))
会为您的所有子列表创建一组唯一元素。
答案 1 :(得分:0)
我建议使用dict' s作为doc_id。
编辑:将功能更改为OP输出格式。
class create_positional_index():
def __init__(self, lst):
self.lst = lst
def __getitem__(self, elm):
return [[doc_id] + [pos for pos, key in enumerate(sub_lst) if key==elm] for doc_id, sub_lst in enumerate(self.lst) if elm in sub_lst]
index = create_positional_index([['a', 'b', 'a'], ['a', 'c']])
print index['a']
print index['b']
print index['c']
def create_positional_index2(lst, elm):
return [[doc_id] + [pos for pos, key in enumerate(sub_lst) if key==elm] for doc_id, sub_lst in enumerate(lst) if elm in sub_lst]
print create_positional_index2([['a', 'b', 'a'], ['a', 'c']], 'a')
print create_positional_index2([['a', 'b', 'a'], ['a', 'c']], 'b')
print create_positional_index2([['a', 'b', 'a'], ['a', 'c']], 'c')
答案 2 :(得分:0)
我发现理解你的问题相当困难。然而,尽管如此,在查看其他答案以及您的评论之后,我认为以下将是实现您的目标的好方法。它定义了一个dict
的子类来保存索引,因此您也可以在任何创建的实例上使用常规字典方法,如keys()
,items()
或update
from itertools import chain
class PositionalIndex(dict):
def __init__(self, *lists):
self.update(
(doc_id, [[i]+[j for j, k in enumerate(sublist) if k == doc_id]
for i, sublist in enumerate(lists)])
for doc_id in set(chain.from_iterable(lists)))
index = PositionalIndex(['a', 'b', 'a'], ['a', 'c'])
for doc_id in sorted(index):
print('index[{!r}] --> {}'.format(doc_id, index[doc_id]))
输出:
index['a'] --> [[0, 0, 2], [1, 0]]
index['b'] --> [[0, 1], [1]]
index['c'] --> [[0], [1, 1]]