2012-03-09 20 views
5

Używam NHunspell sprawdzić ciąg błędów ortograficznych tak:Inteligentne sprawdzania pisowni

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

to zazwyczaj działa, ale ma pewne problemy. Na przykład, jeśli sprawdzam zdanie "To jest (bardzo dobry) przykład", będzie ono zgłaszało "(bardzo" i "dobrze)" jako błędnie napisane. Lub jeśli ciąg zawiera czas taki jak "8:30", zgłosi to jako błędnie napisane słowo. Ma również problemy z przecinkami itp.

Program Microsoft Word jest wystarczająco inteligentny, aby rozpoznać listę słów pod względem czasu, ułamków lub przecinkami. Wie, kiedy nie używać angielskiego słownika i wie kiedy zignorować symbole. Jak mogę uzyskać podobne, bardziej inteligentne sprawdzanie pisowni w moim oprogramowaniu? Czy są jakieś biblioteki, które zapewniają trochę więcej inteligencji?

EDYTOWANIE: Nie chcę zmuszać użytkowników do zainstalowania programu Microsoft Word na ich komputerze, więc używanie współdziałania COM nie jest opcją.

Odpowiedz

6

Jeśli Twój moduł sprawdzania pisowni jest naprawdę tak głupi, powinieneś wstępnie z tokenizować dane wejściowe, aby uzyskać wyrazy i podawać je pojedynczo (lub jako ciąg połączony ze spacjami). Nie jestem zaznajomieni z C#/.NET, ale w Pythonie, można użyć prostego RE jak \w+ za to.

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

i założę .NET ma coś bardzo podobnego. W rzeczywistości, zgodnie z .NET docs, \w jest obsługiwany, więc po prostu trzeba dowiedzieć się, jak jest tam wywoływana re.findall.

0
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 
} 

Więcej informacji o regex here. Po przeczytaniu this myślę, że Hunspell jest jednym z najlepszych wyborów :)

0

w języku C#, można zrobić coś takiego.

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; 
    } 
} 

NumberOfMistakes var = content.GetWords(), gdzie (X => hunspell.Spell (X) *) liczba()..;

Powiązane problemy