Как проверить орфографию в Hunspell без учета регистра

Привет, я делаю настольное приложение (С#), которое проверяет правописание введенного слова. Я использую Hunspell, который я добавил в свой проект с помощью NuGet. У меня есть 2 файла: файл aff и файл dic.

using (Hunspell english = new Hunspell("en_US.aff", "en_US.dic"))
{
    bool isExist = english.Spell("THesis");
}

isExist равно false, потому что в моем файле .dic правильное написание — «тезис». Даже если я использую .lower() и ввожу собственные имена, isExist становится ложным.

Можете ли вы помочь мне в решении этого?


person MMakati    schedule 26.07.2013    source источник
comment
Просто чтобы было понятно - вы пробовали bool isExist = english.Spell("THesis".ToLower());?   -  person dash    schedule 26.07.2013
comment
Да. но если я ввожу имя собственное, например, Канада, оно все равно становится ложным. потому что в файле словаря правильно Канада   -  person MMakati    schedule 26.07.2013


Ответы (2)


Учитывая, что Hunspell, по-видимому, не поддерживает проверку орфографии без учета регистра, вы можете немного изменить свой алгоритм:

Учитывая THesis, вы можете попробовать:

bool isExist = false;

using (Hunspell english = new Hunspell("en_US.aff", "en_US.dic"))
{
    TextInfo textInfo = new CultureInfo("en-US",false).TextInfo;
    isExist =      english.Spell("THesis") 
                 | english.Spell(textInfo.ToLower("THesis") 
                 | english.Spell(textInfo.ToUpper("THesis")) 
                 | english.Spell(textInfo.ToTitleCase("THesis"))
}

Это, в свою очередь, логически проверит «THesis», «thesis», «THESIS» и «Thesis» и вернет true, если какое-либо из этих написаний допустимо, любезно предоставлено логический оператор ИЛИ.

Точно так же для canada это будет работать, так как метод ToTitleCase() по крайней мере гарантирует совпадение.

Это должно работать для большинства отдельных слов (включая все сокращения с заглавными буквами).

person dash    schedule 26.07.2013
comment
Это слишком непрактично. Что делать для 1000 слов? - person Saeed Neamati; 15.06.2015

Если вы хотите, чтобы вызов ToLower() игнорировал первый символ, сделайте это следующим образом:

var textToCheck = "THesis".Substring(0, 1) + "THesis".Substring(1).ToLower();
bool isExist = english.Spell(textToCheck);

Если это не то, что вы ищете, см. ниже:


Я не совсем уверен, как вы хотите, чтобы реализация выглядела, но это тоже может помочь. Использование «ToTitleCase» возьмет строку и сделает первый символ заглавным. Кроме того, вызов toLower() внутри вызова ToTitleCase гарантирует, что только первый символ будет заглавным.

bool isExist = english.Spell(System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase("THesis".toLower());

Вам также может понадобиться какой-то оператор if, чтобы указать, следует ли вызывать ToTitleCase для текущей строки или нет. Это то, что вы ищете?

person Ben Strombeck    schedule 26.07.2013