(self, span, matches)
解析思路：递归进行——如果一种层次结构是最优的，那么它每个语义块的
        层次结构都是最优的。利用这种特性，可以写成递层优化的算法。
解析思路：递归进行——如果一种层次结构是最优的，那么它每个语义块的
        层次结构都是最优的。利用这种特性，可以写成递层优化的算法。
解析思路：递归进行——如果一种层次结构是最优的，那么它每个语义块的 层次结构都是最优的。利用这种特性，可以写成递层优化的算法。
def _parse(self, span, matches):
        """解析思路：递归进行——如果一种层次结构是最优的，那么它每个语义块的
        层次结构都是最优的。利用这种特性，可以写成递层优化的算法。
        """
        tpls = []  # 候选层次结构集，每个元素代表一种层次结构
        # 格式为[((主模版词集, [语义块1, 语义块2]), 得分)]
        # 语义块1、语义块2依然为
        # (语义块主模版词集, [语义块的语义块1, 语义块的语义块2])
        # 的格式，即无限递归直到遍历完句子

        if span in matches:  # 意味着当前语义块能析出一个模版
            for t, f in matches[span].items():
                score = log(f) - log(self.templates.total_items)  # 主模版的打分
                modules = []  # 所有子语义块
                marks = (span[0] - 1, ) + t + (span[1], )  # 所有间隙
                for i in range(len(marks) - 1):  # 枚举每个语义块
                    if marks[i] + 1 < marks[i + 1]:  # 如果不满足，则是连续的两个词，
                        # 则不是间隔，无法构成语义块。
                        _tpls, _score = self._parse(
                            (marks[i] + 1, marks[i + 1]), matches)
                        modules.append(_tpls)
                        score += _score  # 主模版的分数+每个语义块的分数等于总分
                tpls.append(((t, modules), score))
            return self.max(tpls)  # 返回最优结构
        else:  # 意味着没有模版能解析当前语义块，那么将它视为一系列孤立的词
            return ((tuple(range(span[0], span[1])), []),
                    self.null_score * (span[1] - span[0] - 1))
def _parse ( self , span , matches ) : tpls = [ ] # 候选层次结构集，每个元素代表一种层次结构 # 格式为[((主模版词集, [语义块1, 语义块2]), 得分)] # 语义块1、语义块2依然为 # (语义块主模版词集, [语义块的语义块1, 语义块的语义块2]) # 的格式，即无限递归直到遍历完句子 if span in matches : # 意味着当前语义块能析出一个模版 for t , f in matches [ span ] . items ( ) : score = log ( f ) - log ( self . templates . total_items ) # 主模版的打分 modules = [ ] # 所有子语义块 marks = ( span [ 0 ] - 1 , ) + t + ( span [ 1 ] , ) # 所有间隙 for i in range ( len ( marks ) - 1 ) : # 枚举每个语义块 if marks [ i ] + 1 < marks [ i + 1 ] : # 如果不满足，则是连续的两个词， # 则不是间隔，无法构成语义块。 _tpls , _score = self . _parse ( ( marks [ i ] + 1 , marks [ i + 1 ] ) , matches ) modules . append ( _tpls ) score += _score # 主模版的分数+每个语义块的分数等于总分 tpls . append ( ( ( t , modules ) , score ) ) return self . max ( tpls ) # 返回最优结构 else : # 意味着没有模版能解析当前语义块，那么将它视为一系列孤立的词 return ( ( tuple ( range ( span [ 0 ] , span [ 1 ] ) ) , [ ] ) , self . null_score * ( span [ 1 ] - span [ 0 ] - 1 ) )