static void TestCorrectPointComparer() { var c1 = new CorrectPoint() { CharIndex = 0, Length = 2 }; var c2 = new CorrectPoint() { CharIndex = 0, Length = 3 }; var c3 = new CorrectPoint() { CharIndex = 3, Length = 3 }; var correctPoints = new List <CorrectPoint>() { c1, c2, c3 }; correctPoints = correctPoints.OrderBy(x => x, new CorrectPointComparer()).ToList(); foreach (var cp in correctPoints) { Console.WriteLine($"startIndex = {cp.CharIndex}, Length={cp.Length}"); } }
private bool CheckCorrectPoint(IList <string> originWords, CorrectPoint correctPoint) { var wordsList = new List <string>(); var candidatesWords = new List <string>(); if (correctPoint.WordIndex != 0) { wordsList.Add(originWords[correctPoint.WordIndex - 1]); candidatesWords.Add(originWords[correctPoint.WordIndex - 1]); } wordsList.AddRange(originWords.Skip(correctPoint.WordIndex).Take(correctPoint.Length)); candidatesWords.Add("[PlaceHolder]"); if (correctPoint.WordIndex + correctPoint.Length < originWords.Count) { wordsList.Add(originWords[correctPoint.WordIndex + correctPoint.Length]); candidatesWords.Add(originWords[correctPoint.WordIndex + correctPoint.Length]); } var originScore = CalculateScore(wordsList); var pinyinSeqCandidates = PinyinTool.ChineseWord2PinyinSeqCandidates( string.Join("", originWords.Skip(correctPoint.WordIndex).Take(correctPoint.Length))); double minCandidateScore = double.MaxValue; string candidateWord = null; foreach (var pinyinSeq in pinyinSeqCandidates) { var chineseWordCandidates = PinyinTool.PinyinSequence2ChineseWordsCandidates(pinyinSeq.Split(' ')); foreach (var candidate in chineseWordCandidates) { var placeHodlerIndex = correctPoint.WordIndex == 0 ? 0 : 1; candidatesWords[placeHodlerIndex] = candidate; var currentScore = CalculateScore(candidatesWords); if (currentScore < minCandidateScore) { candidateWord = candidate; minCandidateScore = currentScore; } } } if (candidateWord == null) { return(false); } correctPoint.Score = minCandidateScore; correctPoint.Word = candidateWord; return(originScore - correctPoint.Score > ThresholdGap); }