diff --git a/finalseg/prob_emit.go b/finalseg/prob_emit.go index c5e6f2d..3832a22 100644 --- a/finalseg/prob_emit.go +++ b/finalseg/prob_emit.go @@ -1,9 +1,9 @@ package finalseg -var ProbEmit = make(map[byte]map[rune]float64) +var probEmit = make(map[byte]map[rune]float64) func init() { - ProbEmit['B'] = map[rune]float64{'\u4e00': -3.6544978750449433, + probEmit['B'] = map[rune]float64{'\u4e00': -3.6544978750449433, '\u4e01': -8.125041941842026, '\u4e03': -7.817392401429855, '\u4e07': -6.3096425804013165, @@ -6860,7 +6860,7 @@ func init() { '\u9f9a': -9.557108305917183, '\u9f9c': -10.895131537474946, '\u9f9f': -10.895131537474946} - ProbEmit['E'] = map[rune]float64{'\u4e00': -6.044987536255073, + probEmit['E'] = map[rune]float64{'\u4e00': -6.044987536255073, '\u4e01': -9.075800412310807, '\u4e03': -9.198842005220659, '\u4e07': -7.655326112989935, @@ -14299,7 +14299,7 @@ func init() { '\u9f9b': -12.729311722586953, '\u9f9c': -10.574067217491615, '\u9f9f': -10.574067217491615} - ProbEmit['M'] = map[rune]float64{'\u4e00': -4.428158526435913, + probEmit['M'] = map[rune]float64{'\u4e00': -4.428158526435913, '\u4e01': -7.932945687598502, '\u4e03': -6.559715525951586, '\u4e07': -6.139922374120667, @@ -20708,7 +20708,7 @@ func init() { '\u9f9a': -14.14915250738439, '\u9f9c': -11.058110054026073, '\u9f9f': -11.058110054026073} - ProbEmit['S'] = map[rune]float64{'\u2236': -15.828865681131282, + probEmit['S'] = map[rune]float64{'\u2236': -15.828865681131282, '\u4e00': -4.92368982120877, '\u4e01': -9.024528361347633, '\u4e02': -16.522012861691227, diff --git a/finalseg/prob_start.go b/finalseg/prob_start.go deleted file mode 100644 index 874df72..0000000 --- a/finalseg/prob_start.go +++ /dev/null @@ -1,10 +0,0 @@ -package finalseg - -var ProbStart = make(map[byte]float64) - -func init() { - ProbStart['B'] = -0.26268660809250016 - ProbStart['E'] = -3.14e+100 - ProbStart['M'] = -3.14e+100 - ProbStart['S'] = -1.4652633398537678 -} diff --git a/finalseg/prob_trans.go b/finalseg/prob_trans.go index 9c9b5c8..78dc694 100644 --- a/finalseg/prob_trans.go +++ b/finalseg/prob_trans.go @@ -1,14 +1,14 @@ package finalseg -var ProbTrans = make(map[byte]map[byte]float64) +var probTrans = make(map[byte]map[byte]float64) func init() { - ProbTrans['B'] = map[byte]float64{'E': -0.510825623765990, + probTrans['B'] = map[byte]float64{'E': -0.510825623765990, 'M': -0.916290731874155} - ProbTrans['E'] = map[byte]float64{'B': -0.5897149736854513, + probTrans['E'] = map[byte]float64{'B': -0.5897149736854513, 'S': -0.8085250474669937} - ProbTrans['M'] = map[byte]float64{'E': -0.33344856811948514, + probTrans['M'] = map[byte]float64{'E': -0.33344856811948514, 'M': -1.2603623820268226} - ProbTrans['S'] = map[byte]float64{'B': -0.7211965654669841, + probTrans['S'] = map[byte]float64{'B': -0.7211965654669841, 'S': -0.6658631448798212} } diff --git a/finalseg/viterbi.go b/finalseg/viterbi.go index 8413a45..7dcb2bc 100644 --- a/finalseg/viterbi.go +++ b/finalseg/viterbi.go @@ -5,15 +5,22 @@ import ( "sort" ) -const MIN_FLOAT = -3.14e100 +const MinFloat = -3.14e100 -var PrevStatus = make(map[byte][]byte) +var ( + prevStatus = make(map[byte][]byte) + probStart = make(map[byte]float64) +) func init() { - PrevStatus['B'] = []byte{'E', 'S'} - PrevStatus['M'] = []byte{'M', 'B'} - PrevStatus['S'] = []byte{'S', 'E'} - PrevStatus['E'] = []byte{'B', 'M'} + prevStatus['B'] = []byte{'E', 'S'} + prevStatus['M'] = []byte{'M', 'B'} + prevStatus['S'] = []byte{'S', 'E'} + prevStatus['E'] = []byte{'B', 'M'} + probStart['B'] = -0.26268660809250016 + probStart['E'] = -3.14e+100 + probStart['M'] = -3.14e+100 + probStart['S'] = -1.4652633398537678 } type Viterbi struct { @@ -47,10 +54,10 @@ func viterbi(obs []rune, states []byte) (float64, []byte) { V := make([]map[byte]float64, len(obs)) V[0] = make(map[byte]float64) for _, y := range states { - if val, ok := ProbEmit[y][obs[0]]; ok { - V[0][y] = val + ProbStart[y] + if val, ok := probEmit[y][obs[0]]; ok { + V[0][y] = val + probStart[y] } else { - V[0][y] = MIN_FLOAT + ProbStart[y] + V[0][y] = MinFloat + probStart[y] } path[y] = []byte{y} } @@ -61,17 +68,17 @@ func viterbi(obs []rune, states []byte) (float64, []byte) { for _, y := range states { vs0 := make(Viterbis, 0) var em_p float64 - if val, ok := ProbEmit[y][obs[t]]; ok { + if val, ok := probEmit[y][obs[t]]; ok { em_p = val } else { - em_p = MIN_FLOAT + em_p = MinFloat } - for _, y0 := range PrevStatus[y] { + for _, y0 := range prevStatus[y] { var transP float64 - if tp, ok := ProbTrans[y0][y]; ok { + if tp, ok := probTrans[y0][y]; ok { transP = tp } else { - transP = MIN_FLOAT + transP = MinFloat } prob0 := V[t-1][y0] + transP + em_p vs0 = append(vs0, &Viterbi{prob: prob0, state: y0})