基于python的分词算法的实现(1) - 算法

来源:互联网 发布:pdf转换dwg软件 编辑:程序博客网 时间:2024/04/30 11:19

从网络上搜索分词算法,可以找到一个很有名的开源项目ictclas(http://ictclas.org/)。这个算法是基于概率的。概率的确是个好玩意,很多语言层面难以简单概括的东西,用一个概率就可以描绘其很多的特征。

最简单的,假设我们知道每一个词在汉语言里出现的概率,并且假设这个概率和其它的词不相关,我们就可以设计这样的一个分词算法,使得分词结果中的词出现的概率最大。也就是优化


P(Words)=P(Word1)*P(Word2)...

这样足够好了么?有一个笑话:用“天真”造句,小朋友答“今天天真好”。这句话的原意是“今天|天|真好”,“天”和“真”在两个词中,所以这其实是一个错误的造句。如果用我们最大化词概率的方法对其进行分词,很不幸,分词的结果会是“今天|天真|好”。因为“今天”和“天真”都是高概率的词,所以分词算法很自然的就把它们分出来了。

现在之前算法的缺点就一目了然了,它假设单个词出现的概率和它的上下文是不相关的,而没有分析汉语中一些的特征,例如汉语句法结构或者是词性的搭配关系,所以就会造出如“今天|天真”之类的句子。如果要考虑词之间的相关性,那需要优化的目标可以表达为


P(Words)=P(Word1|Words_-1)*P(Word2|Words_-2)*P(Word3|Words_-3)....

Words_-n是分词结果中除了第n个词之外的词。这个优化目标过于复杂,要知道P(Wordn|Words_-n)的值近乎是不可能的。简化起见,对于第n个词,我们只考虑它之前出现的词


P(Words)=P(Word1)*P(Word2|Word1)*P(Word3|Word1_2)...

这样看上去简单的许多,但P(Wordn|Word1_n-1)依然是一个很难知道的量。所以,这里需要进一步的简化,就是对于每一个词,我们只考虑它前面的一个词,于是优化目标变成


P(Words)=P(Word1)*P(Word2|Word1)*P(Word3|Word2)...

简化到现在,这个算法终于简单到可以实现的程度了。P(Word2|Word1)就是两个词连续出现的概率。如果我们拥有大量的资料,这个概率是可以通过统计的方法获得的。事实上,这就是ictclas的算法的核心的部分。

原创粉丝点击