Превращение алгоритма Биграма-Витерби в алгоритм триграммы Витерби
Я реализовал алгоритм Витерби, используя модель перехода триграммы, однако я хочу улучшить свою точность, перейдя к модели триграммы для алгоритма Витерби. Я уже рассчитал выброс и переход. Я просто не могу понять, где изменить алгоритм.
def viterbi (transition, emission, sentence):
#set tag as start of sentence and assign a value
tags=emission.index.tolist()
#for t in tags:
#for t2 in tags:
#if (t2,t) not in transition:
#transition[(t2,t)]=0.000001
start={}
for tag in tags:
if tag == '<s>':
start['<s>']=1
else:
start[tag] = 0
i=0
for word in sentence:
if word not in list(emission):
#if wordscaps.match(sentence[i]):
#sentence[i]='<UNK2>'
else:
sentence[i]='<UNK>'
i = i+1
vit=[{}]
for tag in tags:
vit[0][tag]={"current":start[tag]*emission.loc[(tag,sentence[0])], "previous":None}
for index in range (1,len(sentence)):
vit.append({})
for t in tags:
(prob, oldtag)=max((vit[index-1][prev]["current"]*transition[(prev,t)]*emission.loc[(t,sentence[index])],prev)for prev in tags)
vit[index][t]={"current":prob,"previous":oldtag}
likeliest_tags=[]
maxprob=max(value["current"]for value in vit[-1].values())
#print(maxprob)
previous= None
for tag, everything in vit[-1].items():
if everything["current"]==maxprob:
likeliest_tags.append(tag)
previous=tag
break
for t in range(len(vit)-2,-1,-1):
likeliest_tags.insert(0, vit[t+1][previous]["previous"])
previous=vit[t+1][previous]["previous"]
return likeliest_tags
для перехода я вызываю предыдущий тег и текущий тег, но я подумал, возможно, мне нужно сделать второй "начальный" этап с использованием подхода биграммы, а затем, когда у меня есть два предыдущих тега, я могу перейти ко второй части моего алгоритма. Действительно, все поможет. Благодарю.