未知語の処理には線形補間を用いる。
コーパスの総単語数をNとする。
与えられた文Sをtokenizeして[w_0,w_1...]に分割したとき、
def prob(self, sent,l=0.95):
"""
param:
sent: str
return:
ans: int, log sum prob
len(words): int
strをtokenizerによって分割した後、その最もらしさをunigramとして計算する。
対数尤度をと文長(tokenの数)を返す
未知語の処置には線形補間(デフォルトでl=0.95)を用いる
"""
words = self.tk.tokenize(sent)
ans = 0
for word in words:
if word in self.perFreq:
ans += log(l * self.perFreq[word] + (1 - l) * (1 / self.N))
else:
ans += log((1 - l) * (1 / self.N))
return ans, len(words)
未知語の処理にはunigram線形補間を用いる。
コーパスの総単語数をNとする。
与えられた文Sをtokenizeして[w_0,w_1...]に分割したとき、
def prob(self, sent,l=0.95):
"""
param:
sent: str
return:
ans: int, log sum prob
len(words): int
strをtokenizerによって分割した後、そのもっともらしさをbigramとして計算する。
対数尤度をと文長(tokenの数)を返す
未知語の処置には線形補間(デフォルトでl=0.95)を用いる
"""
words = self.tk.tokenize(sent)
words.insert(0,"<s>")
words.append("</s>")
ans = 0
for i in range(len(words)):
if i == 0:
continue
pair = words[i-1] + "-" + words[i]
if words[i] in self.unigramSet and pair in self.bigramSet :
ans += log(l * self.bigramSet[pair] / self.unigramSet[words[i]] \
+ (1 - l) * (1 / self.N) )
else:
ans += log((1 - l) * (1 / self.N))
return ans, len(words)
実験結果