public IReadOnlyList <TranslationResult> AppendToPrefix(string addition, bool isLastWordComplete) { CheckDisposed(); if (string.IsNullOrEmpty(addition) && IsLastWordComplete) { throw new ArgumentException( "An empty string cannot be added to a prefix where the last word is complete.", nameof(addition)); } if (!string.IsNullOrEmpty(addition) || isLastWordComplete != IsLastWordComplete) { _smtSession.AppendToPrefix(addition, isLastWordComplete); UpdateCurrentResults(); } return(_currentResults); }
public static void AppendSuggestionToPrefix(this IInteractiveTranslationSession session, int resultIndex, IReadOnlyList <int> suggestion) { session.AppendToPrefix(suggestion.Select(j => session.CurrentResults[resultIndex].TargetSegment[j])); }
private void TestSegment(IInteractiveSmtEngine engine, ITranslationSuggester suggester, int n, ParallelTextSegment segment, StreamWriter traceWriter) { traceWriter?.WriteLine($"Segment: {segment.SegmentRef}"); IReadOnlyList <string> sourceSegment = segment.SourceSegment.Preprocess(Preprocessors.Lowercase); traceWriter?.WriteLine($"Source: {string.Join(" ", sourceSegment)}"); IReadOnlyList <string> targetSegment = segment.TargetSegment.Preprocess(Preprocessors.Lowercase); traceWriter?.WriteLine($"Target: {string.Join(" ", targetSegment)}"); traceWriter?.WriteLine(new string('=', 120)); string[][] prevSuggestionWords = null; bool isLastWordSuggestion = false; string suggestionResult = null; using (IInteractiveTranslationSession session = engine.TranslateInteractively(n, sourceSegment)) { while (session.Prefix.Count < targetSegment.Count || !session.IsLastWordComplete) { int targetIndex = session.Prefix.Count; if (!session.IsLastWordComplete) { targetIndex--; } bool match = false; TranslationSuggestion[] suggestions = suggester.GetSuggestions(session).ToArray(); string[][] suggestionWords = suggestions.Select((s, k) => s.TargetWordIndices.Select(j => session.CurrentResults[k].TargetSegment[j]).ToArray()).ToArray(); if (prevSuggestionWords == null || !SuggestionsAreEqual(prevSuggestionWords, suggestionWords)) { WritePrefix(traceWriter, suggestionResult, session.Prefix); WriteSuggestions(traceWriter, session, suggestions); suggestionResult = null; if (suggestions.Any(s => s.TargetWordIndices.Count > 0)) { _totalSuggestionCount++; } } for (int k = 0; k < suggestions.Length; k++) { TranslationSuggestion suggestion = suggestions[k]; var accepted = new List <int>(); for (int i = 0, j = targetIndex; i < suggestionWords[k].Length && j < targetSegment.Count; i++) { if (suggestionWords[k][i] == targetSegment[j]) { accepted.Add(suggestion.TargetWordIndices[i]); j++; } else if (accepted.Count == 0) { j = targetIndex; } else { break; } } if (accepted.Count > 0) { session.AppendSuggestionToPrefix(k, accepted); isLastWordSuggestion = true; _actionCount++; _totalAcceptedSuggestionCount++; if (accepted.Count == suggestion.TargetWordIndices.Count) { suggestionResult = "ACCEPT_FULL"; _fullSuggestionCount++; } else if (accepted[0] == suggestion.TargetWordIndices[0]) { suggestionResult = "ACCEPT_INIT"; _initSuggestionCount++; } else if (accepted[accepted.Count - 1] == suggestion.TargetWordIndices[suggestion.TargetWordIndices.Count - 1]) { suggestionResult = "ACCEPT_FIN"; _finalSuggestionCount++; } else { suggestionResult = "ACCEPT_MID"; _middleSuggestionCount++; } _acceptedSuggestionCounts[k]++; match = true; break; } } if (!match) { if (isLastWordSuggestion) { _actionCount++; isLastWordSuggestion = false; WritePrefix(traceWriter, suggestionResult, session.Prefix); suggestionResult = null; } int len = session.IsLastWordComplete ? 0 : session.Prefix[session.Prefix.Count - 1].Length; string targetWord = targetSegment[targetIndex]; if (len == targetWord.Length) { session.AppendToPrefix("", true); } else { string c = targetWord.Substring(len, 1); session.AppendToPrefix(c, false); } suggestionResult = suggestions.Any(s => s.TargetWordIndices.Count > 0) ? "REJECT" : "NONE"; _actionCount++; } prevSuggestionWords = suggestionWords; } WritePrefix(traceWriter, suggestionResult, session.Prefix); session.Approve(_approveAlignedOption.HasValue()); } _charCount += targetSegment.Sum(w => w.Length + 1); traceWriter?.WriteLine(); }