Exemplo n.º 1
0
        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}");
            }
        }
Exemplo n.º 2
0
        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);
        }