示例#1
0
        private void UpdateCorrectionFromArc(TranslationResultBuilder builder, WordGraphArc arc, bool isPrefix,
                                             int alignmentColsToAddCount)
        {
            for (int i = 0; i < arc.Words.Count; i++)
            {
                builder.AppendWord(arc.Words[i], arc.WordConfidences[i], !isPrefix && arc.IsUnknown);
            }

            WordAlignmentMatrix alignment = arc.Alignment;

            if (alignmentColsToAddCount > 0)
            {
                var newAlignment = new WordAlignmentMatrix(alignment.RowCount,
                                                           alignment.ColumnCount + alignmentColsToAddCount);
                for (int j = 0; j < alignment.ColumnCount; j++)
                {
                    for (int i = 0; i < alignment.RowCount; i++)
                    {
                        newAlignment[i, alignmentColsToAddCount + j] = alignment[i, j];
                    }
                }
                alignment = newAlignment;
            }

            builder.MarkPhrase(arc.SourceSegmentRange, alignment);
        }
        public int CorrectPrefix(TranslationResultBuilder builder, int uncorrectedPrefixLen, string[] prefix,
                                 bool isLastWordComplete)
        {
            if (uncorrectedPrefixLen == 0)
            {
                foreach (string w in prefix)
                {
                    builder.AppendWord(w);
                }
                return(prefix.Length);
            }

            IEnumerable <EditOperation> wordOps, charOps;

            _segmentEditDistance.ComputePrefix(builder.Words.Take(uncorrectedPrefixLen).ToArray(), prefix,
                                               isLastWordComplete, false, out wordOps, out charOps);
            return(builder.CorrectPrefix(wordOps, charOps, prefix, isLastWordComplete));
        }
        private static TranslationResultBuilder CreateResultBuilder(string target, params int[] cuts)
        {
            var builder = new TranslationResultBuilder();

            if (!string.IsNullOrEmpty(target))
            {
                int      i     = 0;
                int      k     = 0;
                string[] words = target.Split();
                for (int j = 0; j < words.Length; j++)
                {
                    builder.AppendWord(words[j], 1);
                    int cut = j + 1;
                    if (k < cuts.Length && cuts[k] == cut)
                    {
                        int len = cut - i;
                        builder.MarkPhrase(Range <int> .Create(i, cut), new WordAlignmentMatrix(len, len));
                        k++;
                        i = cut;
                    }
                }
            }
            return(builder);
        }