(self, sents, filtering=True, remove_weak_grams=True)
基本的句模版构建算法

        在train的基础上，然后计算互信息，通过互信息给每个词找出最邻近的
        强相关的词语，然后将它们连接起来，就构成一个模版。

        【参数含义】
        filtering：是否过滤无关字符，只保留中文、数字和英文字母；
        remove_weak_grams：训练完成后是否在self.skip_grams去掉低频项，这个
                           参数只影响增量更新。
基本的句模版构建算法
基本的句模版构建算法
def find(self, sents, filtering=True, remove_weak_grams=True):
        """基本的句模版构建算法

        在train的基础上，然后计算互信息，通过互信息给每个词找出最邻近的
        强相关的词语，然后将它们连接起来，就构成一个模版。

        【参数含义】
        filtering：是否过滤无关字符，只保留中文、数字和英文字母；
        remove_weak_grams：训练完成后是否在self.skip_grams去掉低频项，这个
                           参数只影响增量更新。
        """
        log_min_proba = log(self.min_proba)
        log_total_words = log(sum(self.words.values()))
        log_total_skip_grams = log(sum(self.skip_grams.values()))
        words = {i: log(j) - log_total_words for i, j in self.words.items()}
        skip_grams = {
            i: log(j) - log_total_skip_grams
            for i, j in self.skip_grams.items()
        }
        skip_grams = {i: j for i, j in skip_grams.items() if j > log_min_proba}

        if remove_weak_grams:
            self.skip_grams = {
                i: j
                for i, j in self.skip_grams if i in skip_grams
            }

        skip_grams = {
            i: j
            for i, j in skip_grams.items()
            if j - words[i[0]] - words[i[1]] > self.min_pmi
        }

        logger = logging.getLogger(u'模版构建')
        for n, sent in enumerate(self.texts(sents, filtering)):
            if n % 10000 == 0 and n > 0:
                logger.info(u'已处理了%s个句子' % n)
            for ws in sent:
                dag = DAG(len(ws))
                for i, w1 in enumerate(ws):
                    for j, w2 in enumerate(ws[i + 1:i + 1 + self.window]):
                        if (w1, w2) in skip_grams:
                            dag[i, i + 1 + j + 1] = 1
                paths = dag.all_paths()
                for p in paths:
                    t = Template()
                    if p[0] != 0:
                        t.add(None)
                    t.add(ws[p[0]])
                    for i in range(1, len(p)):
                        if p[i] - p[i - 1] > 1:
                            t.add(None)
                        t.add(ws[p[i]])
                    if p[-1] != len(ws) - 1:
                        t.add(None)
                    self.templates[t] += 1

        logger.info(u'共处理了%s个句子' % (n + 1))

        log_total_templates = log(sum(self.templates.values()))
        self.templates = {
            i: j
            for i, j in self.templates.items()
            if log(j) - log_total_templates > log_min_proba
        }
def find ( self , sents , filtering = True , remove_weak_grams = True ) : log_min_proba = log ( self . min_proba ) log_total_words = log ( sum ( self . words . values ( ) ) ) log_total_skip_grams = log ( sum ( self . skip_grams . values ( ) ) ) words = { i : log ( j ) - log_total_words for i , j in self . words . items ( ) } skip_grams = { i : log ( j ) - log_total_skip_grams for i , j in self . skip_grams . items ( ) } skip_grams = { i : j for i , j in skip_grams . items ( ) if j > log_min_proba } if remove_weak_grams : self . skip_grams = { i : j for i , j in self . skip_grams if i in skip_grams } skip_grams = { i : j for i , j in skip_grams . items ( ) if j - words [ i [ 0 ] ] - words [ i [ 1 ] ] > self . min_pmi } logger = logging . getLogger ( u'模版构建') for n , sent in enumerate ( self . texts ( sents , filtering ) ) : if n % 10000 == 0 and n > 0 : logger . info ( u'已处理了%s个句子' % n) for ws in sent : dag = DAG ( len ( ws ) ) for i , w1 in enumerate ( ws ) : for j , w2 in enumerate ( ws [ i + 1 : i + 1 + self . window ] ) : if ( w1 , w2 ) in skip_grams : dag [ i , i + 1 + j + 1 ] = 1 paths = dag . all_paths ( ) for p in paths : t = Template ( ) if p [ 0 ] != 0 : t . add ( None ) t . add ( ws [ p [ 0 ] ] ) for i in range ( 1 , len ( p ) ) : if p [ i ] - p [ i - 1 ] > 1 : t . add ( None ) t . add ( ws [ p [ i ] ] ) if p [ - 1 ] != len ( ws ) - 1 : t . add ( None ) self . templates [ t ] += 1 logger . info ( u'共处理了%s个句子' % (n + 1)) log_total_templates = log ( sum ( self . templates . values ( ) ) ) self . templates = { i : j for i , j in self . templates . items ( ) if log ( j ) - log_total_templates > log_min_proba }