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;
 }
Пример #2
0
        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();
        }
Пример #3
0
 public static IEnumerable <TranslationSuggestion> GetSuggestions(this ITranslationSuggester suggester,
                                                                  IInteractiveTranslationSession session)
 {
     return(session.CurrentResults.Select(r =>
                                          suggester.GetSuggestion(session.Prefix.Count, session.IsLastWordComplete, r)));
 }
Пример #4
0
        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();
        }