Ejemplo n.º 1
0
        private TextBlock GetSearchTextBlock(SearchResultEntry sre)
        {
            TextBlock answ = new TextBlock() { TextWrapping = TextWrapping.Wrap, Tag=sre };
            answ.Inlines.Add(new Bold(new Run(((DateTime)sre.TagMark).ToString("dd.MM.yyyy"))));
            answ.Inlines.Add(" - " + (sre.MatchGrade * 100).ToString("0.") + "%\n");

            int minpos = sre.MatchPositions.Min();

            if (minpos - 10 >= 0)
                minpos -= 10;
            else
                minpos = 0;

            string displayedPart = GetPart((DateTime)sre.TagMark, minpos, 40);
            string upperCopy = displayedPart.ToUpper();

            //answ.Inlines.Add(displayedPart + "\n");
            int partidx = 0;
            List<WordPositionInfo> idxes = new List<WordPositionInfo>();
            foreach (string word in sre.CounterMatchTexts)
            {
                partidx = upperCopy.IndexOf(word);
                if (partidx >= 0)
                {
                    idxes.Add(new WordPositionInfo() { Index = partidx, Text = word });
                }
            }

            idxes.Sort();
            int lastidx = 0;
            foreach (WordPositionInfo idx in idxes)
            {
                if (idx.Index > lastidx)
                    answ.Inlines.Add(displayedPart.Substring(lastidx, (idx.Index - lastidx)));

                answ.Inlines.Add(new Bold(new Run(displayedPart.Substring(idx.Index, idx.Text.Length))));
                lastidx = idx.Index + idx.Text.Length;
            }

            if (lastidx < displayedPart.Length)
                answ.Inlines.Add(displayedPart.Substring(lastidx));

            return answ;
        }
        /// <summary>
        /// Calculate the grade of equality for two word sets
        /// </summary>
        /// <param name="currTextWs"></param>
        /// <param name="searchWordSet"></param>
        /// <returns>A search result entry containing information about the found elements</returns>
        private SearchResultEntry CalculateGrade(WordSet ws1, WordSet ws2)
        {
            SearchResultEntry answ = new SearchResultEntry();

            answ.MatchTexts = new List<string>();
            answ.CounterMatchTexts = new List<string>();
            answ.MatchGrades = new List<double>();
            answ.MatchPositions = new List<int>();
            double gradeSum = 0.0;
            int minldist, currldist, minidx;
            int matchIdx;
            string w1, minCounterMatch;
            double currGrade;

            foreach (string w2 in ws2.Words)
            {
                matchIdx = ws1.Words.IndexOf(w2);
                if (matchIdx>=0)
                {
                    answ.MatchTexts.Add(w2);
                    answ.CounterMatchTexts.Add(w2);
                    answ.MatchGrades.Add(1.0);
                    answ.MatchPositions.Add(ws1.Positions[matchIdx]);
                    gradeSum += 1.0;
                }
                else
                {
                    minldist = int.MaxValue;
                    minCounterMatch = null;
                    minidx = 0;
                    for (int i=0; i<ws1.Words.Count; i++)
                    {
                        w1 = ws1.Words[i];
                        currldist = LevenshteinDistance(w1, w2);
                        if (currldist < minldist)
                        {
                            minldist = currldist;
                            minidx = i;
                            minCounterMatch = w1;
                        }
                    }

                    currGrade = (double)(w2.Length - minldist) / w2.Length;

                    if (currGrade >= MinimumMatchGrade)
                    {
                        answ.MatchTexts.Add(w2);
                        answ.MatchGrades.Add(currGrade);
                        answ.CounterMatchTexts.Add(minCounterMatch);
                        answ.MatchPositions.Add(ws1.Positions[minidx]);

                        gradeSum += currGrade;
                    }
                }
            }

            answ.MatchGrade = gradeSum / (double)ws2.Words.Count;

            return answ;
        }