2021SC@SDUSC
2021SC@SDUSC
在上一篇我们讲述了如何生成前缀词典,那么今天则进行下一步,有向无环图的构造。
2021SC@SDUSC
2021SC@SDUSC
学过数据结构的同学对有向无环图DAG肯定都不陌生,但是与我们平常使用的C或C++不同,在jieba分词中,对每个字都是通过在文本中的位置来标记的,因此可以构建一个以位置为key,相应划分的末尾位置构成的列表为value的映射,因此,jieba采用了Python的dict结构,可以更方便的表示DAG。最终的DAG是以{k : [k , j , …] , m : [m , p , q] , …}的字典结构存储,其中k和m为词在文本sentence中的位置,k对应的列表存放的是文本中以k开始且词sentence[k: j + 1]在前缀词典中的 以k开始j结尾的词的列表,即列表存放的是sentence中以k开始的可能的词语的结束位置,这样通过查找前缀词典就可以得到词。
get_DAG(self, sentence)函数进行对系统初始化完毕后,会构建有向无环图。
从前往后依次遍历文本的每个位置,对于位置k,首先形成一个片段,这个片段只包含位置k的字,然后就判断该片段是否在前缀词典中,如果这个片段在前缀词典中,如果词频大于0,就将这个位置i追加到以k为key的一个列表中;如果词频等于0,则表明前缀词典存在这个前缀,但是统计词典并没有这个词,继续循环;
如果这个片段不在前缀词典中,则表明这个片段已经超出统计词典中该词的范围,则终止循环; 然后该位置加1,然后就形成一个新的片段,该片段在文本的索引为