Как отобразить все ошибочные слова
У меня есть текст в richTextBox1.
Я должен отсортировать слова по частоте и отобразить их в
richTextBox2
, Вроде работает.Нужно найти все ошибочные слова и отобразить их в
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;
}
}