Как отобразить все ошибочные слова

У меня есть текст в richTextBox1.

  1. Я должен отсортировать слова по частоте и отобразить их в richTextBox2, Вроде работает.

  2. Нужно найти все ошибочные слова и отобразить их в richTextBox4, Я использую Hunspell. Видимо, я что-то упустил. Почти все слова отображаются в richTextBox4 не только неправильные.

Код:

foreach (Match match in wordPattern.Matches(str))
{
    if (!words.ContainsKey(match.Value))
        words.Add(match.Value, 1);
    else
        words[match.Value]++;
}

string[] words2 = new string[words.Keys.Count];
words.Keys.CopyTo(words2, 0);

int[] freqs = new int[words.Values.Count];
words.Values.CopyTo(freqs, 0);

Array.Sort(freqs, words2);
Array.Reverse(freqs);
Array.Reverse(words2);

Dictionary<string, int> dictByFreq = new Dictionary<string, int>();

for (int i = 0; i < freqs.Length; i++)
{
    dictByFreq.Add(words2[i], freqs[i]);
}

Hunspell hunspell = new Hunspell("en_US.aff", "en_US.dic");

StringBuilder resultSb = new StringBuilder(dictByFreq.Count); 

foreach (KeyValuePair<string, int> entry in dictByFreq)
{
    resultSb.AppendLine(string.Format("{0} [{1}]", entry.Key, entry.Value));
    richTextBox2.Text = resultSb.ToString();

    bool correct = hunspell.Spell(entry.Key);

    if (correct == false)                
    {
        richTextBox4.Text = resultSb.ToString();
    }    
}

2 ответа

Решение

В дополнение к приведенному выше ответу (который должен работать, если ваш метод Hunspell.Spell работает правильно), у меня есть несколько предложений по сокращению вашего кода. Вы добавляете совпадения в свой словарь и подсчитываете количество совпадений каждого совпадения. Затем вы, по-видимому, сортируете их по убыванию значения частоты (поэтому наибольшее совпадение вхождения будет иметь индекс 0 в результате). Вот несколько фрагментов кода, которые должны сделать вашу функцию намного короче:

IOrderedEnumerable<KeyValuePair<string, int>> dictByFreq = words.OrderBy<KeyValuePair<string, int>, int>((KeyValuePair<string, int> kvp) =>  -kvp.Value);

Это использует.NET Framework, чтобы сделать всю вашу работу за вас. words.OrderBy принимает аргумент Func, который предоставляет значение для сортировки. Проблема с использованием значений по умолчанию для этой функции заключается в том, что она хочет отсортировать по ключам, а вы хотите отсортировать по значениям. Этот вызов функции сделает именно это. Он также будет сортировать их в порядке убывания на основе значений, которые являются частотой, с которой произошло конкретное совпадение. Он возвращает объект IOrderedEnumerable, который необходимо сохранить. И поскольку это перечислимо, вам даже не нужно помещать его обратно в словарь! Если вам действительно нужно выполнить другие операции с ним позже, вы можете вызвать функцию dictByFreq.ToList(), которая возвращает объект типа: List>.

Таким образом, вся ваша функция становится такой:

foreach (Match match in wordPattern.Matches(str))
{
    if (!words.ContainsKey(match.Value))
        words.Add(match.Value, 1);
    else
        words[match.Value]++;
}

IOrderedEnumerable<KeyValuePair<string, int>> dictByFreq = words.OrderBy<KeyValuePair<string, int>, int>((KeyValuePair<string, int> kvp) => -kvp.Value);

Hunspell hunspell = new Hunspell("en_US.aff", "en_US.dic");

StringBuilder resultSb = new StringBuilder(dictByFreq.Count);

foreach (KeyValuePair<string, int> entry in dictByFreq)
{

    resultSb.AppendLine(string.Format("{0} [{1}]", entry.Key, entry.Value));
    richTextBox2.Text = resultSb.ToString();

    bool correct = hunspell.Spell(entry.Key);

    if (correct == false)
    {
        richTextBox4.Text = entry.Key;
    }
}

Вы отображаете на richtextbox4 так же, как в richtextbox2:)

Я думаю, что это должно работать:

foreach (KeyValuePair<string, int> entry in dictByFreq)
{
    resultSb.AppendLine(string.Format("{0} [{1}]", entry.Key, entry.Value));
    richTextBox2.Text = resultSb.ToString();

    bool correct = hunspell.Spell(entry.Key);

    if (correct == false)                
    {

        richTextBox4.Text += entry.Key;
    }    
}
Другие вопросы по тегам