我正在做一个练习,在给出一个测试句时,我正在确定一些语料库中最可能的语料库。我正在尝试为此练习测试一个和-1(拉普拉斯)平滑模型。我一般认为我有算法,但我的结果非常偏斜。我知道和-1并不是最佳的(至少可以说),但我只是想确定我的结果来自于-1方法本身而不是我的尝试。
现在,And-1 /拉普拉斯平滑技术试图通过从富人中获取并给予穷人来避免0概率。因此,被发现具有零概率的二元组变为:
1/V, V=the number of types
这意味着每个其他二元组的概率变为:
P(B|A) = Count(W[i-1][W[i])/(Count(W[i-1])+V)
然后,您将使用一个句子来测试并将每个句子分解为双字母并根据概率对其进行测试(对0概率进行上述操作),然后将它们相乘以得到句子的最终概率。
我在Python中实现这一点。我的代码看起来像这样,所有函数调用都经过验证可以工作:
#return is a counter of tuples containing ngrams: {('A','B'):C}
#this means ('A','B') means (B|A) in probabilistic terms
bigrams[0]=getBigrams(corpus[0])
...
bigrams[n]=getBigrams(corpus[n])
#return is a dictionary of the form P['A']=C
unigrams[0]=getUnigrams(corpus[0])
...
unigrams[N]=getUnigrams(corpus[n])
#generate bigram probabilities, return is P('A','B')=p, add one is done
prob[0]=getAddOneProb(unigrams[0],bigrams[0])
...
prob(n)=getAddOneProb(unigrams[n],bigrams[n])
for sentence in test:
bi=getBigrams(sentence)
uni=getUnigrams(sentence)
P[0]=...=P[n]=1 #set to 1
for b in bi:
tup=b
try:
P[0]*=prob[tup]
except KeyError:
P[0]=(1/len(unigrams[0])
#do this for all corpora
在那时我会比较所有语料库,P [0]到P [n]并找到概率最高的语料
我的结果并不是那么好,但我试图了解这是否是编码不良,实施不正确或固有的问题和...的问题。