Viterbi search

re-designed backward_bigram_lattice and the viterbi search based on that data structure

backward_bigram_lattice, or b for short now maps to valid bigrams or word that start and ends at specific positions.
for i,j,k that are valid in the list/dictionary, b[i-1][j][k] maps to --> bigram (sent[k:j], [j:i])  if j!=0
                                                                     b[i-1][0], if exist  maps to --->  bigram (START_symbol, word sent[j:i])
(constraint: 0<i<n+1, 0<=j<i,  and if j>0 exit k such that 0<k<j)

 forward_bigram_lattice, or f for short, for valid i,j  f[i][j] maps to --> word [i:j]
(constraint: 0<i<n, i<j<n+1 )