public void TestGenerateDAG() { WordDictionary.Instance.LoadDictWords(@"..\..\test_files\dict2.txt"); var dags = _dagGenerator.Generate("他来到了浙江省网易杭研大厦"); Assert.AreEqual(JSON.stringify(dags[0]), JSON.stringify(new List <int>() { 0 })); Assert.AreEqual(JSON.stringify(dags[1]), JSON.stringify(new List <int>() { 1, 2 })); Assert.AreEqual(JSON.stringify(dags[2]), JSON.stringify(new List <int>() { 2 })); Assert.AreEqual(JSON.stringify(dags[3]), JSON.stringify(new List <int>() { 3 })); Assert.AreEqual(JSON.stringify(dags[4]), JSON.stringify(new List <int>() { 4, 5, 6 })); Assert.AreEqual(JSON.stringify(dags[5]), JSON.stringify(new List <int>() { 5 })); Assert.AreEqual(JSON.stringify(dags[6]), JSON.stringify(new List <int>() { 6 })); Assert.AreEqual(JSON.stringify(dags[7]), JSON.stringify(new List <int>() { 7, 8 })); Assert.AreEqual(JSON.stringify(dags[8]), JSON.stringify(new List <int>() { 8 })); Assert.AreEqual(JSON.stringify(dags[9]), JSON.stringify(new List <int>() { 9 })); Assert.AreEqual(JSON.stringify(dags[10]), JSON.stringify(new List <int>() { 10 })); Assert.AreEqual(JSON.stringify(dags[11]), JSON.stringify(new List <int>() { 11, 12 })); Assert.AreEqual(JSON.stringify(dags[12]), JSON.stringify(new List <int>() { 12 })); }
public Route GetRoutes(string sentence) { var dags = _dagGenerator.Generate(sentence); int len = sentence.Length; double logTotal = Math.Log(_wordDictionary.TotalFrequency); var segments = new Segment[len + 1]; segments[len] = new Segment(0, 0); for (int i = len - 1; i >= 0; i--) { var segment = new Segment(i, Helper.MinValue); foreach (var to in dags[i]) { double wordLog = Math.Log(_wordDictionary.GetEffectiveFrequency(sentence.Sub(i, to))); if (wordLog - logTotal + segments[to + 1].Weight > segment.Weight) { segment.To = to; segment.Weight = wordLog - logTotal + segments[to + 1].Weight; } } segments[i] = segment; } return(new Route(segments)); }