在自然语言处理中,词语搭配(collocation)的寻找是一项重要的技术,也是新词发现的主要途径。设w1和w2是分出的两个词,什么情况下w1w2应该合为一个词呢? 以‘屌丝'为例, 如果词分库里没有这个词,它就会被分成两个单字,我们的目的就是要识别出这种词。当然这里不限于两元词(bigram), 可以扩展到三元词(trigram),四元词... 为了方便,以下的讨论都以两元词为例。
新词的
识别主要是通过统计来完成的,归纳一下有以下几种方法:
a) 词频:最简单的方法,统计所有bigram的词频: num(w1w2)/num(all bigrams), 词频高的bigram进入新词候选集。这种方法的缺点在于:
a.1)没有考虑组合词的词性搭配,比如像’我|在‘,’你|从‘这样的搭配是没有意义的。针对这个可以用启发式的办法,比如限制词性搭配为名词|名词,形容词|名词等,不过这种方式需要标注词性。
a.2) 没有考虑每个单词的频率,两个高频词有可能随机组合出高频的bigram;针对这个可以用假设检验的办法,也就是下边几种方法:
b) t检验: 原假设是两个词独立,这时两个词一起出现的概率是p(w1)*p(w2), t检验就是比较样本真实概率与上述概率是否有差别,t值越大说明两词关联性越强。
c) 卡方检验: 原理与t检验相似,不同之处在于构造的是卡方统计量。优点在于不用假设样本概率是服从高斯分布的,现实文档中的词也不一定服从高斯分布,故卡方检验较t检验常用。
d) 似然比检验: 原理为构造两个似然函数:HL1是假设w1和w2独立构造的似然函数, HL0是假设w1和w2不独立构造的似然函数,令A=HL0的最大值/HL1的最大值, A越大(接近1)表示w1和w2的关联性越强(具体理论参见似然比检验定义:如果参数约束是有效的,那么加上这样的约束不应该引起似然函数最大值的大幅度降低). 这种方法的优点是在样本数较少的情况下也能表现良好
e) 互信息: I(w1,w2)互信息表示w1能告诉我们关于w2的多少信息,值越大表示两者关联性越强。
-------------------------------------------------------------------------------------------------------------------华丽丽分割性------------------------------------------------------------------------------------------------------
上边是一些统计的理论,实际上python的NLTK.Collocations包已经包含了大多数方法的实现,具体用法可参考文档
下边是实例代码,只要把文档分好词并放进list中,然后交给BigramAssocMeasures处理就行了:
-
import nltk
-
from nltk.collocations import *
-
text=['I', 'you', 'she', 'I', 'she', 'you', 'you']
-
bigram_measures = nltk.collocations.BigramAssocMeasures()
-
finder = BigramCollocationFinder.from_words(text)
-
print finder.nbest(bigram_measures.pmi, 2)
阅读(2707) | 评论(0) | 转发(0) |