2012-03-09 20 views
5

sto usando NHunspell per controllare una stringa per errori di ortografia in questo modo:intelligente controllo ortografico

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

funziona questo genere, ma ha alcuni problemi. Ad esempio, se sto controllando la frase "Questo è un (molto buono) esempio", verrà segnalato "(molto" e "buono") come errato. O se la stringa contiene un tempo come "8:30", lo segnalerà come una parola errata. Ha anche problemi con virgole, ecc.

Microsoft Word è abbastanza intelligente da riconoscere un elenco di parole, delimitato da virgole o da virgole. Sa quando non usare un dizionario inglese e sa quando ignorare i simboli. Come posso ottenere un controllo ortografico simile e più intelligente nel mio software? Ci sono librerie che forniscono un po 'più di intelligenza?

MODIFICA: Non voglio forzare gli utenti a installare Microsoft Word sul proprio computer, quindi l'utilizzo di interoperabilità COM non è un'opzione.

risposta

6

Se il correttore ortografico è davvero così stupido, è necessario pre-riconoscere il proprio input per estrarre le parole e darle da mangiare una alla volta (o come una stringa unita agli spazi). Non ho familiarità con C#/NET, ma in Python, utilizza una semplice RE come \w+ per questo:.

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

e scommetto .NET ha qualcosa di molto simile. Infatti, secondo lo .NET docs, è supportato il \w, quindi non resta che scoprire come viene chiamato 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 
} 

Ulteriori informazioni su regex here. Dopo aver letto this penso che Hunspell sia una delle migliori scelte :)

0

in C#, si potrebbe fare qualcosa di simile.

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() Dove (x => hunspell.Spell (x)!) Count()..;

Problemi correlati