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); }
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)); } }