【问题标题】:Accessing a Dynamically Generated Nested Dictionary访问动态生成的嵌套字典
【发布时间】:2011-07-23 18:38:11
【问题描述】:

目标是能够尽快将文档中的单词与一组文档中的单词进行比较(创建术语-文档矩阵)。如果可能的话,这是否可以通过使用 Lucene 来完成(并且会很快)?

我的想法(如果由我完成的话)是在每个文档中创建一个术语树,然后将这些树组合在一起以形成集合。要创建树,我会使用嵌套字典,每个字典键都是一个字符。术语中的每个位置将是层次结构中的不同级别

职位

1
 2
  3
   4
    5
     6

例如,使用示例字符串“这是一个测试”,树看起来像

t
 h
  i
   s
 e
  s
   t
i
 s
a

请注意,第一级中的“t”只有一次。第一个字典将包含键 {'t','i','a'}。会有三个包含键 {'h'}{'e'}{'s'} 的二级字典。

这应该会使查找速度极快。循环中的最大步数将是最长单词中的字符数。让我的大脑自我折叠的部分是我如何动态构建这样的字典,特别是访问正确的级别

到目前为止,我有一些效果

def addTerm(self, term):
   current_level = 0;
   for character in list(term):
      character = character.lower()
      if re.match("[a-z]",character):
         self.tree[character] = {}
         current_level += 1 

【问题讨论】:

  • 这是否会引入文档中不存在的单词的可能性?如果“a”在顶层并且它可以在第二层访问“s”,那么即使“as”不在测试字符串中,也可以拼写单词“as”。
  • 二级字典不是只有两个吗?不是 3 个?

标签: python dictionary matrix nested


【解决方案1】:

我可以看到您当前的实施存在一些问题。如果trie 中的节点是一个单词,你如何标记?更好的实现是将树初始化为 tree = [{}, None] 之类的东西,其中 None 表示当前节点是否是单词的结尾。

您的 addTerm 方法可能类似于:

def addTerm(self, term):
   node = self.tree
   for c in term:
      c = c.lower()
      if re.match("[a-z]",c):
         node = node[0].setdefault(c,[{},None])
   node[1] = term

如果您不关心节点上的单词,您可以将 node[1] 设置为 True。

搜索单词是否在 trie 中类似于

def findTerm(self, term):
    node = self.tree
    for c in term:
        c = c.lower()
        if re.match("[a-z]",c):
            if c in node[0]:
                node = node[0][c]
            else:
                return False
    return node[1] != None

【讨论】:

    【解决方案2】:

    我最近阅读了 John Resig 的一篇关于做非常相似的事情的文章。实现是 Javascript,但是使用这个想法和翻译代码应该很容易做到。至少它会给你一些在你的实现中考虑的极端情况问题。

    http://ejohn.org/blog/javascript-trie-performance-analysis/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多