在python中使用嵌套字典实现单词树

2024-10-01 15:42:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用嵌套字典构造一棵树。树的根是句子的起始词,然后按顺序形成边。Children包含每个节点的子节点列表。 每个节点的权重(value)在某个地方被检测到时会增加1/factor(factor可以假定为1)

 def constructtree(lst,tree,factor):
        if lst==[]:
            return {}
        else:
            word =lst[0]
            if not tree.has_key(word):
                tree[word]={'name':word,'value':1/factor,"children":{}}
                tree[word]["children"]=constructtree(lst[1:],tree[word]["children"],factor)
            else:
                #print 22
                tree[word]["value"]+=1/factor
                tree[word]["children"]=constructtree(lst[1:],tree[word]["children"],factor)
            return tree

    def doall(wl,tree):
        for x in wl:
                #print 11,x
                tree2=constructtree(x,tree,1)
                tree=tree2
        #print 1,tree
        return tree

mnn= doall(wordList2,{})  

所以真正的问题是嵌套字典完全依赖于树(大小??)这完全把我搞糊涂了。好像它可能对一个列表中的10个字符串有效,但对20个字符串无效。在

原因是什么?它是否依赖于字符串的内容?(我知道听起来很蹩脚,但我试着用一个重复的模式,得到了正确的结果,但有点自然和独特的模式,它搞砸了!)在

编辑:

样本输入

^{pr2}$

所以对于这个输入,树缺少节点

结果

mnn={'obama': {'name': 'obama', 'value': 50, 'children': {'is': {'name': 'is', 'value': 2, 'children': {'a': {'name': 'a', 'value': 1, 'children': {'loser': {'name': 'loser', 'value': 1, 'children': {'roflmfao': {'name': 'roflmfao', 'value': 1, 'children': {';-d': {'name': ';-d', 'value': 1, 'children': {}}}}}}}}, 'humble': {'name': 'humble', 'value': 1, 'children': {'': {'name': '', 'value': 1, 'children': {"that's": {'name': "that's", 'value': 1, 'children': {'why': {'name': 'why', 'value': 1, 'children': {'everyone': {'name': 'everyone', 'value': 1, 'children': {'loves': {'name': 'loves', 'value': 1, 'children': {'him': {'name': 'him', 'value': 1, 'children': {'its': {'name': 'its', 'value': 1, 'children': {'not': {'name': 'not', 'value': 1, 'children': {'because': {'name': 'because', 'value': 1, 'children': {"he's": {'name': "he's", 'value': 1, 'children': {'black': {'name': 'black', 'value': 1, 'children': {'its': {'name': 'its', 'value': 1, 'children': {'because': {'name': 'because', 'value': 1, 'children': {'he': {'name': 'he', 'value': 1, 'children': {'understands': {'name': 'understands', 'value': 1, 'children': {"us.can't": {'name': "us.can't", 'value': 1, 'children': {'say': {'name': 'say', 'value': 1, 'children': {'th': {'name': 'th', 'value': 1, 'children': {'': {'name': '', 'value': 1, 'children': {}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 'currently': {'name': 'currently', 'value': 1, 'children': {'leads': {'name': 'leads', 'value': 1, 'children': {'romney': {'name': 'romney', 'value': 1, 'children': {'by': {'name': 'by', 'value': 1, 'children': {'15': {'name': '15', 'value': 1, 'children': {'with': {'name': 'with', 'value': 1, 'children': {'259': {'name': '259', 'value': 1, 'children': {'current': {'name': 'current', 'value': 1, 'children': {'electoral': {'name': 'electoral', 'value': 1, 'children': {'votes': {'name': 'votes', 'value': 1, 'children': {'romney': {'name': 'romney', 'value': 1, 'children': {'has': {'name': 'has', 'value': 1, 'children': {'244': {'name': '244', 'value': 1, 'children': {}}}}}}}}}}}}}}}}}}}}}}}}}}, 'supporters': {'name': 'supporters', 'value': 1, 'children': {}}, 'losin': {'name': 'losin', 'value': 1, 'children': {'votes': {'name': 'votes', 'value': 1, 'children': {'because': {'name': 'because', 'value': 1, 'children': {'ppl': {'name': 'ppl', 'value': 1, 'children': {'postin': {'name': 'postin', 'value': 1, 'children': {'ballots': {'name': 'ballots', 'value': 1, 'children': {'and': {'name': 'and', 'value': 1, 'children': {'shit': {'name': 'shit', 'value': 1, 'children': {'smh': {'name': 'smh', 'value': 1, 'children': {}}}}}}}}}}}}}}}}}}}}}

Tags: nametreereturn节点valueworditshe

热门问题