使用软连接逻辑加速字典合并

时间:2017-04-21 08:12:51

标签: python dictionary nlp search-engine boolean-logic

我有一个包含<word: dictionary>对的查找表。 然后,给出一个单词列表, 我可以使用这个查找表生成一个字典列表。 (每次,这个单词列表的长度不固定)。 这些词典中的值表示某些键的对数概率。

以下是一个例子:

给出单词列表

['fruit','animal','plant']

我们可以查看查找表并

dict_list = [{'apple':-1, 'flower':-2}, {'apple':-3, 'dog':-1}, {'apple':-2, 'flower':-1}]

我们可以从列表中看到我们有一组密钥:{'apple', 'flower', 'dog'}

对于每个键,我想在dict_list中给出每个值的总和。如果一个字典中不存在密钥,那么我们在该值中添加一个小值-10(您可以将-10视为非常小的对数概率)。

结果字典如下所示: dict_merge = {'apple':-6, 'flower':-13, 'dog':-21}, 因为'apple' = (-1) + (-3) + (-2)'flower' = (-2) + (-10) + (-1)'dog' = (-10) + (-1) + (-10)

这是我的python3代码:

dict_list = [{'apple':-1, 'flower':-2}, {'apple':-3, 'dog':-1}, {'apple':-2, 'flower':-1}]

key_list = []
for dic in dict_list:
    key_list.extend(dic.keys())

dict_merge = dict.fromkeys(key_list, 0)
for key in dict_merge:
    for dic in dict_list:
        dict_merge[key] += dic.get(key, -10)

此代码有效,但如果dict_list中某些词典的大小超大(例如100,000),那么它可能需要超过200毫秒,这在实践中是不可接受的。

主要计算在for key in dict_merge循环中,想象它是一个大小为100,000的循环。

有加速解决方案吗?谢谢!并且,感谢阅读〜也许太长,太烦人了......

P.S。 查找表中只有少数字典具有超大尺寸。所以这里可能会有一些机会。

1 个答案:

答案 0 :(得分:2)

据我所知,sum(len(d) for d in dict_list)len(key_list) * len(dict_list)小得多。

from collections import defaultdict

dict_list = [{'apple':-1, 'flower':-2}, {'apple':-3, 'dog':-1}, {'apple':-2, 'flower':-1}]

default_value = len(dict_list) * (-10)
dict_merge = defaultdict(lambda: default_value)
for d in dict_list:
    for key, value in d.items():
        dict_merge[key] += value + 10