大家好,书中p53 那个parseText函数 是不是差点东西啊

p53 parsetext函数 按照书中的描述是做完全切分,但我用python试了一下 感觉并不是完全切分,我就自己在最后加了个if语句。 是书的问题 还是我理解的问题呀:rofl:

while i < len(text):                          
    state = state.children.get(text[i])       
    if state is not None:                     
        print(state.value)                    
        if state.value is not None:                                
            word_list.append(text[begin:i+1]) 
    else:                                     
        i = begin                             
        begin += 1                            
        state = self                          
    if i == len(text)-1 and begin != i:       
        i = begin                                             
    i += 1                                    
return word_list   

上面最后一个if语句是我自己加的。

你加的if是对的,应该是修订版加的一段代码少了一句。

忽略我的上一条回复,我以为你加的是第一条if

最后一个if加的没有道理,移位操作是通过begin+=1实现的。如果你觉得书上的代码不好理解,可参考我重写的一段:

    def parse(self, text: Sequence[str]) -> List[Tuple[Union[str, Sequence[str]], Any, int, int]]:
        found = []
        for i in range(len(text)):
            state = self
            for j in range(i, len(text)):
                state = state.transit(text[j])
                if state:
                    if state._value is not None:
                        found.append((text[i: j + 1], state._value, i, j + 1))
                else:
                    break
        return found

当然,这段是为2.x写的,接口不一样,但算法思想本身是一致的。

谢谢大佬啦 我再仔细钻研下

我开始是按照书上java的思路准备改成python代码试一试的。 开始不加最后的那段if判断, 最后得出的结果不是 “全切分” 而是“按着顺序”依次切分。

算法层的Java代码没有问题,如果你认为有问题,欢迎按《提问的智慧》提供进一步信息。