作者回复: 联合概率是不考虑顺序的,而N元文法一般都是要考虑一点顺序的。所谓“一点”就如你所提到的,这是一个条件概率P(xn|xn-2,xn-1),顺序是指xn-2和xn-1都是在xn的前面出现,但是我们并不关心xn-2和xn-1之间的顺序。而另一方面,我们之前已经考虑了P(xn-1|xn-2, xn-3),你可以认为xn-1和xn-2之间的关系已经在这一步考虑了。
至于你说的最后一点,P(x1,x2,x3,x4….xn) 和P(xn,xn-1,xn-2,….,x4,x3,x2,x1)理论上应该是一致的。但是n稍微大点,我们就无法直接求了,所以要使用马尔科夫假设进行近似。而马尔科夫假在一定程度上考虑了文本出现的顺序,所以不同顺序的x1,x2...xn就会影响近似的结果,所以有P(x1,x2,x3,x4….xn)约等于近似结果a,P(xn,xn-1,xn-2,….,x4,x3,x2,x1)约等于近似结果b,a和b都是同一个理论值的近似,但是由于马尔科夫假设的原因,两个近似值不一致。
作者回复: 这个问题很好,确实中文比较特殊,和拉丁文不太一样。
我觉得你的问题是:中文里的歧义或者分词错误,是不是会影响分类?
你说的这几种情况,我简单分为以下几种:
分词:如果我们能知道123或321代表一个字符串,而不是单个的数字,那么就不会切分它们。再例如“相互”也不会切为“相”和“互”。当然中文分词本身不是件容易的事情,我这里提到概率语言模型,如果语料里有相关的信息,那么可以在一定程度上提升分词效果。
同义词:如果我们能正确切分出“相互”和“互相”,那么还需要把它们关联为同义词。基本的做法是使用词典。
语义:“纳税”的问题就更复杂一些,需要计算机理解上下文关系和语义。从统计的角度而言,那还是要看语料里“纳税”这个词哪种情况的概率更高。
所以,自然语言处理,尤其是中文的处理,是件相当复杂也是相当有趣的事情。“词包”模型只是最基本的模型,如果我们想优化它在分类问题上的表现,需要解决好中文分词、消除歧义、同义词/近义词等问题。每个问题都是值得研究,并且可以提升的。如果每个点都能得到优化,那么最终分类的效果也会得到优化。
总结一下,文本分类涉及的面很广,不仅受到分类算法的影响,还受到其他许多自然语言处理的影响。由于这个系列专栏的主题是数学,所以我这讲只能把概率和相关分类算的核心思想体现出来。如果你对自然语言处理有兴趣,我可以在加餐或者其他专栏中和你分享。
作者回复: 这是一种方法👌
作者回复: 在实际项目中,可以通过大量的语料来统计,比如文档d中,在k1后面出现k2的次数,除以k1出现的次数,用来近似P(k2|k1,d)
作者回复: 如果是词包模型,确实对语义没有太多的理解。可以加入一些基于文法甚至是领域知识的语义分析,不过这个和具体的应用有关系,可能不是语法模型本身能很好解决的。例如,评论中的情感分析(sentiment analysis),我们可以考虑表达情感的词在否定句式中的表达等等。
作者回复: 嗯,是的。可以对不同分类构建分类器,或者增加条件概率
作者回复: 你是指p(q|d) = p(k1,k2,k3...,kn|d) = p(k1|d) * p(k2|k1,d) * p(k3|k2,k1,d)?
先看链式法则,p(k1,k2,k3,...,kn|d) = p(k1|d) * p(k2|k1,d) * p(k3|k2,k1,d) * ... * p(kn|kn-1,kn-2,...,k2,k1,d),注意这里公式的成立是基于贝叶斯法则的,你可以用贝叶斯法则验证。
然后,通过马尔科夫假设,当前词只和前若干词相关,这里假设前两个,那么上式子可以简化为
p(q|d) = p(k1,k2,k3...,kn|d) = p(k1|d) * p(k2|k1,d) * p(k3|k2,k1,d) * p(k4|k3,k2,d) * ... * p(kn|kn-1,kn-2,d)
作者回复: 查询里的关键词有时候是存在一定的先后顺序,比如“相机镜头”和“带镜头的相机”,不过确实很多查询里的关键词都可以用词袋模型处理。当然,要精细化的提升查询的准确率,词袋就不够了。
作者回复: 是的,链式法则是等价的,马尔科夫假设用于简化
作者回复: 这里是假设每篇文章都出现了1/N次,N表示文章总数
作者回复: 一般基于概率的不用TF-IDF,这主要是因为概率论有自己的理论体系,概率的估算是使用最大似然,而非TF-IDF。
作者回复: 你的意思是说,如何在三元文法的情况下,求解p(s|D)?基本还是一致的,只是把P(wn|D)改为P(wn|wn-1, wn-2, D)
作者回复: 应该的,你这个问题很好,对其他人也有启发
作者回复: 是的👍
作者回复: 是第二种,在满足k1和d的条件下,出现k2的概率
作者回复: 如果是一元文法,词包模型,确实不需要一模一样。
作者回复: 我想你所说的是针对分类问题对吧?那么语料不充足,是指只有少数的标注数据(文章),是吧?如果是这样,一种做法是增大ngram里面的n,因为标注数据不多,增加n不会增加太多的存储空间。另外,也可以使用少量数据训练得到的分类器,对新的数据进行分类,然后获得一些分类结果后,人工再进行复查,把正确的结果再次纳入训练数据。