bojone / word-discovery

速度更快、效果更好的中文新词发现
509 stars 103 forks source link

关于total的理解为何是总字数? #10

Closed TITC closed 3 years ago

TITC commented 3 years ago

以下代码摘自【中文分词系列】 8. 更好的新词发现算法

    for t in texts(" is ngraming..."):
        for i in range(len(t)):
            for j in range(1, n + 1):  # gram 1,2,3···n
                if i + j <= len(t):  # prevent overflow the length of t
                    # ngram is a huge dict,key is the word and value is the count
                    ngrams[t[i:i + j]] += 1

以8字的例句本刊感谢各位专家为例,进行ngram分词后结果为一个大小为26的dict image 对于此问题,您给出了如下的解释:

别忘了某个句子的全体ngram是 [text[i:i + n] for i in range(len(text) - n + 1)] 所以总ngram数约等于总字数。

考虑到也许您的约等于是指数量级上的约等于, 因此下面取几个大文件对比一下

  1. 总字符数为234958742字,ngram中所有key的频次累加和为736195698
  2. 总字符数为202362720字,ngram中所有key的频次累加和为624372458
  3. 总字符数为110199596字,ngram中所有key的频次累加和为346968516

由上述局部的本刊感谢各位专家例子亦或者是大文件的例子都可以看到ngram中频次累加和均大致为数据总字数的3倍左右。但3倍在计算PMI处理的过程中会带来多大差距呢?我以1.为例,取其中最高频次的词汇企业,频次1307887,其中频次为1953603频次为3030854,该语料库总字数为212741102.0,据此所计算出的pmi=69.00695726310722,

鉴于此处变量只有total,直接将上述结果×3得到基于key的频次累加pmi大约为207

所以是觉得对于2-gram来讲20769相对于阈值5来说都大很多,所以基本差别不大这个意思么?🤣

bojone commented 3 years ago

算总数是要每种长度的ngram单独算的,而不是所有2gram、3gram、4gram混合起来算的。

你的统计结果恰好就说明,ngram总数约等于总字数(3倍,因为你把3种ngram混合在一起了)。

事实上,根据(对于某个固定的n)ngram的计算方式: [text[i:i + n] for i in range(len(text) - n + 1)] ,就知道每种ngram的总数约等于字数是显然成立的。

TITC commented 3 years ago

算总数是要每种长度的ngram单独算的,而不是所有2gram、3gram、4gram混合起来算的。

你的统计结果恰好就说明,ngram总数约等于总字数(3倍,因为你把3种ngram混合在一起了)。

事实上,根据(对于某个固定的n)ngram的计算方式: [text[i:i + n] for i in range(len(text) - n + 1)] ,就知道每种ngram的总数约等于字数是显然成立的。

就知道每种ngram的总数约等于字数是显然成立的。谢谢提醒,明白了👍

ghtwht commented 2 years ago

有个疑问,我们计算4-gram是基于我们已经计算好了2-gram以及3-gram基础之上,也就是说我们的2-gram和3-gram也是经过词频和凝固度的过滤,在过滤之后,2-gram和3-gram的总频数也就不存在约等于总次数的情况了,那么我们计算4-gram的凝固度的时候,这个式子也不成立了。