public string[] UpdatePrefix(string prefix)
        {
            if (!IsInitialized)
            {
                throw new InvalidOperationException("The session has not been initialized.");
            }

            Range <int>[] tokenRanges = _engine.TargetWordTokenizer.Tokenize(prefix).ToArray();
            Prefix             = tokenRanges.Select(s => prefix.Substring(s.Start, s.Length)).ToArray();
            IsLastWordComplete = tokenRanges.Length == 0 || tokenRanges[tokenRanges.Length - 1].End != prefix.Length;

            TranslationResult smtResult = _wordGraphProcessor.Correct(Prefix, IsLastWordComplete, 1).FirstOrDefault();

            if (smtResult == null)
            {
                var builder = new TranslationResultBuilder();
                smtResult = builder.ToResult(SourceSegment, Prefix.Length);
            }

            if (RuleResult == null)
            {
                _curResult = smtResult;
            }
            else
            {
                int prefixCount = Prefix.Length;
                if (!IsLastWordComplete)
                {
                    prefixCount--;
                }

                _curResult = smtResult.Merge(prefixCount, RuleEngineThreshold, RuleResult);
            }

            UpdateSuggestion();

            return(Suggestion);
        }
Esempio n. 2
0
        public IEnumerable <TranslationResult> Correct(string[] prefix, bool isLastWordComplete, int n)
        {
            // get valid portion of the processed prefix vector
            int validProcPrefixCount = 0;

            for (int i = 0; i < _prevPrefix.Length; i++)
            {
                if (i >= prefix.Length)
                {
                    break;
                }

                if (i == _prevPrefix.Length - 1 && i == prefix.Length - 1)
                {
                    if (_prevPrefix[i] == prefix[i] && _prevIsLastWordComplete == isLastWordComplete)
                    {
                        validProcPrefixCount++;
                    }
                }
                else if (_prevPrefix[i] == prefix[i])
                {
                    validProcPrefixCount++;
                }
            }

            int diffSize = _prevPrefix.Length - validProcPrefixCount;

            if (diffSize > 0)
            {
                // adjust size of info for arcs
                foreach (List <EcmScoreInfo> esis in _arcEcmScoreInfos)
                {
                    foreach (EcmScoreInfo esi in esis)
                    {
                        for (int i = 0; i < diffSize; i++)
                        {
                            esi.RemoveLast();
                        }
                    }
                }

                // adjust size of info for states
                foreach (int state in _statesInvolvedInArcs)
                {
                    for (int i = 0; i < diffSize; i++)
                    {
                        _stateEcmScoreInfos[state].RemoveLast();
                        _stateBestScores[state].RemoveAt(_stateBestScores[state].Count - 1);
                        _stateBestPrevArcs[state].RemoveAt(_stateBestPrevArcs[state].Count - 1);
                    }
                }
            }

            // get difference between prefix and valid portion of processed prefix
            var prefixDiff = new string[prefix.Length - validProcPrefixCount];

            for (int i = 0; i < prefixDiff.Length; i++)
            {
                prefixDiff[i] = prefix[validProcPrefixCount + i];
            }

            // process word-graph given prefix difference
            ProcessWordGraphForPrefixDiff(prefixDiff, isLastWordComplete);

            _prevPrefix             = prefix.ToArray();
            _prevIsLastWordComplete = isLastWordComplete;

            var queue = new PriorityQueue <Hypothesis>(1000);

            GetStateHypotheses(queue);
            GetSubStateHypotheses(queue);

            foreach (Hypothesis hypothesis in NBestSearch(n, queue))
            {
                var builder = new TranslationResultBuilder();
                BuildCorrectionFromHypothesis(builder, prefix, isLastWordComplete, hypothesis);
                yield return(builder.ToResult(_sourceSegment, prefix.Length));
            }
        }