目标是能够尽快将文档中的单词与一组文档中的单词进行比较(创建一个术语 - 文档矩阵)。如果可能的话,可以通过使用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
答案 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,但使用这个想法和翻译代码应该很容易做到。至少它会给你一些在你的实现中要考虑的角落问题。