现在,我们就可以应用这个方法来进行分词了。首先定义一个函数:segment,其输入是一串没有空格的字符串,而输出则是一个单词列表,既最好的分词结果:
>>> segment('choosespain')
['choose', 'spain']
让我们从第一步概率语言模型开始。一个单词序列的概率是给定单词的上下文——在这里是前面的所有的单词——每一个单词概率之积。用数学公式可以如下表达:
P(W1:n) = Πk=1:nP(Wk | W1:k–1)
我们没有足够的数据来准确计算这个概率,所以我们可以通过使用小一点的语料库来近似地计算这个概率(公式)。由于Google语言模型最大到5元(5-grams),所以我们可以使用5-grams来计算整个单词序列的概率,故一个n-word序列的概率等于给定前4个单词(并不是前面所有单词)每一个单词的概率之积。
关于5元语言模型,存在三个困难。首先,Google语言模型中5-gram数据大约有30G,一般机器的内存是无法加载的。其次,很多5元短语的计数为0,我们需要一些方法来回退(或者平滑),既使用较短的(短语)序列来估计这些计数为0的5元短语概率。第三,候选短语的搜索空间将会很大,因为其所依赖的单词数目达到4个。当然,只要想点办法,所有的这三个困难都是可以克服的。但是我们可以先简化一下这个问题,仅考虑一元(unigram)语言模型,这样就能立即解决这三个问题。利用一元语言模型,单词序列的概率就等于每一个单词自身(没有依赖)概率之积,而每一个单词概率与其他单词概率是独立的:
P(W1:n) = Πk=1:nP(Wk)
相应的,我们来看'wheninrome'这个分词例子,它有很多候选分词短语,譬如“when in rome”,利用一元语言模型,只需计算P(when) × P(in) × P(rome)。如果这个乘积结果比其他任何候选短语的乘积都高,那么“when in rome”就是最好的分词结果。
一个包含n个字符的字符串有2^(n-1)种不同的分词方案(在字符之间有n-1个位置,每一个位置既可以作为单词边界也可以不作为边界)。因此,对于字符串“ wheninthecourseofhumaneventsitbecomesnecessary”,有35万亿(trillion)种切分方法。但是可以肯定,你能够在几秒钟之内找到正确的分词形式,并且不需要枚举所有的候选分词短语。首先扫描“w”,然后是”wh”以及”whe”,并且拒绝这些不大可能的“单词”,但是接受“when”作为可能的“单词”。之后再扫描剩余的部分,与前面同理,依次找到可能的分词,并最终找到最佳的分词短语。一旦我们对问题做了简化,既每一个单词相互是独立的,那么也就意味着我们不需要考虑单词之间的所有组合。
这给了我们一个大致的分词函数轮廓:考虑将字符串切分成首词和剩余字符串所有分法(可以任意限定最长的单词长度,例如,L=20字符)。对于每一种可能的分法,搜索剩余字符串最好的切分方法。对于所有的候选切分, P(first) × P(remaining) 乘积最高的那一个就是最佳分法。
未完待续:分词3
注:原创文章,转载请注明出处“我爱自然语言处理”:www.52nlp.cn
本文链接地址:https://www.52nlp.cn/beautiful-data-统计语言模型的应用三分词2