void BuildSidetracksForNode(ViterbiNode[] leftNodes, ViterbiNode node) { var backwardConnectionId = node.LeftId; var wordCost = node.WordCost; var sidetrackEdges = new List <SidetrackEdge>(); SidetrackEdge nextOption;// Sidetracks.TryGetValue(node.LeftNode, out nextOption); foreach (var leftNode in leftNodes) { if (leftNode == null) { break; } if (leftNode.Type == ViterbiNode.NodeType.Known && leftNode.WordId == -1) { // Ignore BOS continue; } var sideTrackCost = leftNode.PathCost - node.PathCost + wordCost + Costs[leftNode.RightId, backwardConnectionId]; if (Mode == TokenizerMode.Search || Mode == TokenizerMode.Extended) { sideTrackCost += ViterbiSearcher.GetPenaltyCost(node); } if (leftNode != node.LeftNode) { sidetrackEdges.Add(new SidetrackEdge(sideTrackCost, leftNode, node)); } } if (sidetrackEdges.Count == 0) { Sidetracks.Add(node, nextOption); } else { for (var i = 0; i < sidetrackEdges.Count - 1; i++) { sidetrackEdges[i].NextOption = sidetrackEdges[i + 1]; } sidetrackEdges[sidetrackEdges.Count - 1].NextOption = nextOption; Sidetracks.Add(node, sidetrackEdges[0]); } }
public MultiSearcher(ConnectionCosts costs, TokenizerMode mode, ViterbiSearcher viterbiSearcher) { Costs = costs; Mode = mode; ViterbiSearcher = viterbiSearcher; }