Интеллектуальная проверка орфографии - PullRequest
5 голосов
/ 09 марта 2012

Я использую NHunspell , чтобы проверить строку на наличие орфографических ошибок, например:

var words = content.Split(' ');
string[] incorrect;
using (var spellChecker = new Hunspell(affixFile, dictionaryFile))
{
    incorrect = words.Where(x => !spellChecker.Spell(x))
        .ToArray();
}

Это обычно работает, но у него есть некоторые проблемы. Например, если я проверяю предложение «Это (очень хороший) пример», оно сообщит «(очень» и «хорошо)» как с ошибкой. Или, если строка содержит время, например «8:30», оно сообщит об этом как слово с ошибкой. У него также есть проблемы с запятыми и т. Д.

Microsoft Word достаточно умен, чтобы распознать список слов, разделенный запятыми или разделенный запятыми. Он знает, когда не следует использовать английский словарь, и знает, когда игнорировать символы. Как я могу получить аналогичную, более интеллектуальную проверку орфографии в моем программном обеспечении? Есть ли библиотеки, которые предоставляют немного больше интеллекта?

EDIT: Я не хочу заставлять пользователей устанавливать Microsoft Word на своих компьютерах, поэтому использование COM-взаимодействия не вариант.

Ответы [ 3 ]

6 голосов
/ 09 марта 2012

Если ваша проверка орфографии действительно настолько глупа, вы должны предварительно токенизировать ее ввод, чтобы вывести слова и подавать их по одному (или как строку, соединенную пробелами). Я не знаком с C # /. NET, но в Python вы бы использовали простой RE, например \w+:

>>> s = "This is a (very good) example"
>>> re.findall(r"\w+", s)
['This', 'is', 'a', 'very', 'good', 'example']

и я уверен, что в .NET есть нечто очень похожее. На самом деле, согласно .NET документам , поддерживается \w, так что вам просто нужно выяснить, как там вызывается re.findall.

0 голосов
/ 19 апреля 2016

в C # вы можете сделать что-то вроде этого.

public static class ExtensionHelper
{
    public static string[] GetWords(this string input)
    {
        MatchCollection matches = Regex.Matches(input, @"\b[\w']*\b");

        var words = from m in matches.Cast<Match>()
                    where !string.IsNullOrEmpty(m.Value)
                    select TrimSuffix(m.Value);

        return words.ToArray();
    }

    public static string TrimSuffix(this string word)
    {
        int apostropheLocation = word.IndexOf('\'');
        if (apostropheLocation != -1)
        {
            word = word.Substring(0, apostropheLocation);
        }

        return word;
    }
}

var NumberOfMistakes = content.GetWords (). Где (x =>! Hunspell.Spell (x)). Count ();

0 голосов
/ 09 марта 2012
using System.Text.RegularExpressions;
...
// any occurence of ( and ) (maybe needs escaping)
string pattern = "( (\\.? | )\\.? )"; 
foreach(string i in incorrect){
  Regex.Replace(i, pattern, String.Empty) // replace with String.Empty
}

Подробнее о регулярном выражении здесь .После того, как я прочитал этот , я думаю, что Hunspell - один из лучших вариантов:)

...