首页 > 编程 > Python > 正文

用Python中的字典来处理索引统计的方法

2020-02-23 01:04:29
字体:
来源:转载
供稿:网友

最近折腾索引引擎以及数据统计方面的工作比较多, 与 Python 字典频繁打交道, 至此整理一份此方面 API 的用法与坑法备案.

    索引引擎的基本工作原理便是倒排索引, 即将一个文档所包含的文字反过来映射至文档; 这方面算法并没有太多花样可言, 为了增加效率, 索引数据尽可往内存里面搬, 此法可效王献之习书法之势, 只要把十八台机器内存全部塞满, 那么基本也就功成名就了. 而基本思路举个简单例子, 现在有以下文档 (分词已经完成) 以及其包含的关键词

  doc_a: [word_w, word_x, word_y]  doc_b: [word_x, word_z]  doc_c: [word_y]

将其变换为

  word_w -> [doc_a]  word_x -> [doc_a, doc_b]  word_y -> [doc_a, doc_c]  word_z -> [doc_b]

    写成 Python 代码, 便是
 

doc_a = {'id': 'a', 'words': ['word_w', 'word_x', 'word_y']} doc_b = {'id': 'b', 'words': ['word_x', 'word_z']} doc_c = {'id': 'c', 'words': ['word_y']}  docs = [doc_a, doc_b, doc_c] indices = dict()  for doc in docs:   for word in doc['words']:     if word not in indices:       indices[word] = []     indices[word].append(doc['id'])  print indices

    不过这里有个小技巧, 就是对于判断当前词是否已经在索引字典里的分支
 

if word not in indices:   indices[word] = []

可以被  dict  的  setdefault(key, default=None)  接口替换. 此接口的作用是, 如果  key  在字典里, 那么好说, 拿出对应的值来; 否则, 新建此  key , 且设置默认对应值为  default . 但从设计上来说, 我不明白为何  default  有个默认值  None , 看起来并无多大意义, 如果确要使用此接口, 大体都会自带默认值吧, 如下
 

for doc in docs:   for word in doc['words']:     indices. setdefault(word, []) .append(doc['id'])

    这样就省掉分支了, 代码看起来少很多.
    不过在某些情况下,  setdefault  用起来并不顺手: 当  default  值构造很复杂时, 或产生  default  值有副作用时, 以及一个之后会说到的情况; 前两种情况一言以蔽之, 就是  setdefault  不适用于  default  需要惰性求值的场景. 换言之, 为了兼顾这种需求,  setdefault  可能会设计成
 

def setdefault(self, key, default_factory):   if key not in self:     self[key] = default_factory()   return self[key]

倘若真如此, 那么上面的代码应改成
 

for doc in docs:   for word in doc['words']:     indices.setdefault(word, list ).append(doc['id'])            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表