标签归档:统计语言模型

Matrix67:漫话中文分词算法

Deep Learning Specialization on Coursera

注:这是今天在Matrix67上看到的关于中文分词的文章,粗略的读了一遍,觉得Matrix67能把中文分词的一些关键问题如此“漫话”开来,不愧是北大中文系的牛人!以下文章转自于Matrix67的“漫话中文分词算法”,有兴趣的读者可以移步到他的blog观赏。

记得第一次了解中文分词算法是在 Google 黑板报 上看到的,当初看到那个算法时我彻底被震撼住了,想不到一个看似不可能完成的任务竟然有如此神奇巧妙的算法。最近在詹卫东老师的《中文信息处理导论》课上 再次学到中文分词算法,才知道这并不是中文分词算法研究的全部,前前后后还有很多故事可讲。在没有建立统计语言模型时,人们还在语言学的角度对自动分词进 行研究,期间诞生了很多有意思的理论。

中文分词的主要困难在于分词歧义。“结婚的和尚未结婚的”,应该分成“结婚/的/和/尚未/结婚/的”,还是“结婚/的/和尚/未/结婚/ 的”?人来判断很容易,要交给计算机来处理就麻烦了。问题的关键就是,“和尚未”里的“和尚”也是一个词,“尚未”也是一个词,从计算机的角度看上去,两 者似乎都有可能。对于计算机来说,这样的分词困境就叫做“交集型歧义”。

有时候,交集型歧义的“歧义链”有可能会更长。“中外科学名著”里,“中外”、“外科”、“科学”、“学名”、“名著”全是词,光从词库的 角度来看,随便切几刀下去,得出的切分都是合理的。类似的例子数不胜数,“提高产品质量”、“鞭炮声响彻夜空”、“努力学习语法规则”等句子都有这样的现 象。在这些极端例子下,分词算法谁优谁劣可谓是一试便知。
继续阅读

Beautiful Data-统计语言模型的应用三:分词8

Deep Learning Specialization on Coursera

  对于一个包含n个字符的单词来说,利用语言模型进行分词的前提是首先枚举出所有的候选切分,而segment函数中:
  candidates = ( [first] + segment( rem ) for first, rem in splits( text ) )
的作用正是如此,它包含了递归调用,因此能枚举出所有的候选切分。那么,这个函数的时间复杂度是多少呢?一个包含n个字符的字符串有2^(n-1)种不同的分词方案(在字符之间有n-1个位置,每一个位置既可以作为单词边界也可以不作为边界),因此segment函数的时间复杂度为O(2^n),难怪之前的测试当字符串比较长时就跑不出结果了! 继续阅读

Beautiful Data-统计语言模型的应用三:分词5

Deep Learning Specialization on Coursera

  上一节我们已经解读了Pdist类中的__init__函数,这一节重点关注一下Python类中的__call__函数。首先简单的回顾一下上一节提到的一段话:缺省的情况,对于未知的单词,其概率均为1/N,但是对于每一个实例,Pdist均提供一个函数重载这个缺省值。为了避免过长 的单词拥有过高的概率,我们从概率10/N出发,对于候选单词的每一个字母都除以10。 继续阅读

Beautiful Data-统计语言模型的应用三:分词4

Deep Learning Specialization on Coursera

  对于Pw函数,这里稍微多做一点说。首先我们从一元语言模型的文件里读取单词及其计数,如果一个单词在语料库中出现,它的概率就是Count(word)/N,这里N是语料库的单词数目的规模。事实上,相对于使用完整的1千3百万单词(词型)的一元语言模型,Peter Norvig大牛对这个一元语言模型进行了简化:(a) 创建了一个更通用的词汇表,并且其中的单词是大小写不敏感(不区分)的,故“the”,”The”以及“THE”的计数是加在一起作为“the”的计数的;(b)只有由字母(letter)组合的单词才被计入其中,而对于其他包含数字或者标点的“单词”则被过滤,故“+170.002”以及“can’t”都不会被计入;(c)只列出其中最常用的1百万单词中的前1/3,也就是333333个单词。 继续阅读

Beautiful Data-统计语言模型的应用三:分词3

Deep Learning Specialization on Coursera

  本节我们进入《Beautiful Data》中分词的编码阶段,完整的程序及数据大家可以在“Natural Language Corpus Data: Beautiful Data”上下载ngrams.zip,我这里主要做一些解读。程序由python实现,无论在Linux或者Windows平台下,只要安装了相应的python版本,程序均可以通过测试,不过我所使用的是python2.6,注意,在python3.0上会有一些问题。 继续阅读

Beautiful Data-统计语言模型的应用三:分词2

Deep Learning Specialization on Coursera

  现在,我们就可以应用这个方法来进行分词了。首先定义一个函数:segment,其输入是一串没有空格的字符串,而输出则是一个单词列表,既最好的分词结果: 继续阅读

Beautiful Data-统计语言模型的应用三:分词1

Deep Learning Specialization on Coursera

  本节我们开始《Beautiful Data》中的“Word Segmentation”之旅,虽然Peter Norvig大牛从中文分词的需求讲起,但本节事实上讲得是英文分词,毕竟Google语言模型是以英文语料库为基础的,用中文分词举例Google语言模型就无用武之地了。一般说来,英文是不需要分词的,基本上tokenization就够了。但是某些时候,譬如英文网址(URLs)就没有空格,对于搜索引擎或者文字处理程序来说正确的分词就很重要了。不过,无论英文分词还是中文分词,利用统计语言模型来分词的思想本质是一样的。 继续阅读

Beautiful Data-统计语言模型的应用二:背景

Deep Learning Specialization on Coursera

  本节我们进入《Beautiful Data》的正题,将沿着其第14章Peter Norvig大牛的“Natural Language Corpus Data”的轨迹介绍统计语言模型的三个应用:分词、解码及拼写检查。不过《Beautiful Data》中这三个应用依赖着Google的海量语言模型,所以Peter Norvig研究员首先介绍的也是Google语言模型的一些基本情况和背景。 继续阅读