internal InteractiveTranslationSession(TranslationEngine engine, string[] sourceSegment, double confidenceThreshold, HybridInteractiveTranslationResult result) { _engine = engine; _suggester = new PhraseTranslationSuggester { ConfidenceThreshold = confidenceThreshold }; SourceSegment = sourceSegment; RuleResult = result.RuleResult; SmtWordGraph = result.SmtWordGraph; }
public TextViewModel(ITokenizer <string, int> tokenizer, string name, string metadataFileName, string sourceFileName, string targetFileName, string alignmentFileName) { Name = name; _metadataFileName = metadataFileName; _targetFileName = targetFileName; _alignmentFileName = alignmentFileName; _tokenizer = tokenizer; _sourceSegments = new List <Segment>(); _targetSegments = new List <Segment>(); _approvedSegments = new HashSet <int>(); _paragraphs = new HashSet <int>(); _goToNextSegmentCommand = new RelayCommand(GoToNextSegment, CanGoToNextSegment); _goToPrevSegmentCommand = new RelayCommand(GoToPrevSegment, CanGoToPrevSegment); _approveSegmentCommand = new RelayCommand(ApproveSegment, CanApproveSegment); _applyAllSuggestionsCommand = new RelayCommand(ApplyAllSuggestions, CanApplyAllSuggestions); _selectSourceSegmentCommand = new RelayCommand <int>(SelectSourceSegment); _selectTargetSegmentCommand = new RelayCommand <int>(SelectTargetSegment); _suggestions = new BulkObservableList <SuggestionViewModel>(); Suggestions = new ReadOnlyObservableList <SuggestionViewModel>(_suggestions); _sourceSegmentWords = new List <string>(); _unapprovedTargetSegmentRanges = new BulkObservableList <Range <int> >(); UnapprovedTargetSegmentRanges = new ReadOnlyObservableList <Range <int> >( _unapprovedTargetSegmentRanges); _alignedSourceWords = new BulkObservableList <AlignedWordViewModel>(); AlignedSourceWords = new ReadOnlyObservableList <AlignedWordViewModel>(_alignedSourceWords); _suggester = new WordTranslationSuggester() { ConfidenceThreshold = 0.2 }; LoadMetadataFile(); LoadTextFile(sourceFileName, _sourceSegments); SourceText = GenerateText(_sourceSegments); LoadTextFile(_targetFileName, _targetSegments); TargetText = GenerateText(_targetSegments); UpdateUnapprovedTargetSegmentRanges(); }
public static IEnumerable <TranslationSuggestion> GetSuggestions(this ITranslationSuggester suggester, IInteractiveTranslationSession session) { return(session.CurrentResults.Select(r => suggester.GetSuggestion(session.Prefix.Count, session.IsLastWordComplete, r))); }
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(); }