Beispiel #1
0
        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]);
            }
        }
Beispiel #2
0
 public MultiSearcher(ConnectionCosts costs, TokenizerMode mode, ViterbiSearcher viterbiSearcher)
 {
     Costs           = costs;
     Mode            = mode;
     ViterbiSearcher = viterbiSearcher;
 }