访问动态生成的嵌套字典

时间:2011-03-27 05:24:09

标签: python dictionary matrix nested

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

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

位置

1
 2
  3
   4
    5
     6

例如,使用示例字符串“This is a test”树将看起来像

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 

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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