2021SC@SDUSC
1、字典即为DAG,key为字所在的位置,value为从字开始能在FREQ中的匹配到的词末尾位置所在的list。DAG词云的构建过程:定义DAG空字典,用来构建DAG有向无环图,然后开始遍历词。当传入的词,在FREQ中时,就给tmplist赋值,构建字开始可能去往的所有的路径列表。查找第一个字,后继续查找第一个加第二个字构成的词是否也在语料库中,直到查不到就退出循环。当传入值,在语料库中查询不到时,就赋值给FREQ。最终得到DAG词典
def get_DAG(self, sentence):
self.check_initialized()
DAG = {}
N = len(sentence)
for k in xrange(N):
tmplist = []
i = k
frag = sentence[k]
while i < N and frag in self.FREQ:
if self.FREQ[frag]:
tmplist.append(i)
i += 1
frag = sentence[k:i + 1]
if not tmplist:
tmplist.append(k)
DAG[k] = tmplist
return DAG
2、计算全局概率Route
函数calc(self, sentence, DAG, route)就是计算概率的过程。其中语句 xrange(N - 1, -1, -1)是从句子的末尾开始计算,
max函数返回的是一个元组,计算方法是log(freq/total)+后一个字得到的最大概率路径的概率。这里即为动态规划查找最大概率路径。注意的是动态规划的方向是从后往前。
def calc(self, sentence, DAG, route):
N = len(sentence)
route[N] = (0, 0)
logtotal = log(self.total)
for idx in xrange(N - 1, -1, -1):
route[idx] = max((log(self.FREQ.get(sentence[idx:x + 1]) or 1) -
logtotal + route[x + 1][0], x) for x in DAG[idx])
该博客介绍了如何构建DAG(有向无环图)词云和计算全局概率Route的过程。首先,通过遍历语料库构建DAG,每个字的位置作为key,其后可能的词结尾位置作为value。接着,利用动态规划从后往前计算每个字的最大概率路径,以找到最可能的词序列。此方法在自然语言处理和信息检索中具有应用价值。
264

被折叠的 条评论
为什么被折叠?



