From bbe302a3514f886c37eeb9d03f956cfd750f1f6c Mon Sep 17 00:00:00 2001 From: Wang Bin Date: Fri, 3 Apr 2015 16:48:45 +0800 Subject: [PATCH] removed sorts to slightly improve performance --- posseg/viterbi.go | 15 ++++++++------- posseg/viterbi_test.go | 7 +++++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/posseg/viterbi.go b/posseg/viterbi.go index 1bccf8a..86fccce 100644 --- a/posseg/viterbi.go +++ b/posseg/viterbi.go @@ -75,16 +75,17 @@ func viterbi(obs []rune) []string { mem_path[t] = make(map[string]string) // TODO: value needed or not? V[t] = make(map[string]float64) for _, y := range obs_states { - pss := make(probStates, 0) - for _, y0 := range prev_states { - ps := probState{ + var max, ps probState + for i, y0 := range prev_states { + ps = probState{ prob: V[t-1][y0] + probTrans[y0].Get(y) + probEmit[y].get(obs[t]), state: y0} - pss = append(pss, ps) + if i == 0 || ps.prob > max.prob || (ps.prob == max.prob && ps.state > max.state) { + max = ps + } } - sort.Sort(sort.Reverse(pss)) - V[t][y] = pss[0].prob - mem_path[t][y] = pss[0].state + V[t][y] = max.prob + mem_path[t][y] = max.state } } last := make(probStates, 0) diff --git a/posseg/viterbi_test.go b/posseg/viterbi_test.go index 0d4832b..66c27b7 100644 --- a/posseg/viterbi_test.go +++ b/posseg/viterbi_test.go @@ -40,3 +40,10 @@ func TestViterbi(t *testing.T) { } } } + +func BenchmarkViterbi(b *testing.B) { + ss := "李小福是创新办主任也是云计算方面的专家;" + for i := 0; i < b.N; i++ { + viterbi([]rune(ss)) + } +}