word-discovery
word-discovery copied to clipboard
total的计算方式,是否有问题
up主的博客中提到,可以用n为某个值的ngram总频数来计算total
事实上,根据(对于某个固定的n)ngram的计算方式: [text[i:i + n] for i in range(len(text) - n + 1)] ,就知道每种ngram的总数约等于字数是显然成立的。
而源码中,是对所有ngram的频数的总和来计算total的,是否与博客中的算法不一致,导致pmi计算不正确?
for s, n in Progress(ngrams(), 100000, desc=u'loading ngrams'):
if n >= self.min_count:
self.total += n
另外,请问这部分
total * v / (ngrams[j].get(w[:j+1], total) * ngrams[i-j-1].get(w[j+1:], total))
我理解分母的两个乘数,应该是大于等于v的,所以default值理论上应该设为v,为什么这里设为了total呢?
还有一个问题,加载ngram这里:
for j in range(len(c)): self.ngrams[j][c[:j+1]] = self.ngrams[j].get(c[:j+1], 0) + n
是否有重复计算的问题?c的组成部分,应该已经被计算过了吧?为什么还要把它部分的n累加一次?我理解这里应该直接是:
self.ngrams[len(c)][c] = n