2012-03-09 8 views
5

estoy usando NHunspell para comprobar una cadena de errores de ortografía, así:hechizo inteligente de control de

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

funciona esto en general, pero tiene algunos problemas. Por ejemplo, si yo estoy comprobando la frase "Esta es una (muy bien) ejemplo", informará "(muy" y "bueno)", como se mal escrito. O si la cadena contiene un tiempo como "8:30", se informará de que como una palabra mal escrita. También tiene problemas con las comas, etc.

Microsoft Word es lo suficientemente inteligente como para reconocer la vez, fracción, o una lista separada por comas de palabras. Sabe cuándo no usar un diccionario de inglés, y sabe cuándo ignorar los símbolos. ¿Cómo puedo obtener un corrector ortográfico similar y más inteligente en mi software? ¿Hay alguna biblioteca que brinde un poco más de inteligencia?

EDIT: No quiero obligar a los usuarios a tener Microsoft Word instalado en su máquina, por lo que el uso de interoperabilidad COM no es una opción.

Respuesta

6

Si su corrector ortográfico es realmente tan estúpido, debe pre-tokenizar su entrada para sacar las palabras y alimentar aquellas a la vez (o como una cadena unida con espacios). No estoy familiarizado con C#/.NET, pero en Python, que haría uso de un RE simple como para que \w+:.

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

y apuesto a .NET tiene algo muy similar. De hecho, de acuerdo con el .NET docs, \w es compatible, por lo que sólo tiene que averiguar cómo se llama re.findall allí.

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 
} 

Más información sobre regex here. Después de leer this Creo que Hunspell es una de las mejores opciones :)

0

en C#, podrías hacer algo como esto.

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

Cuestiones relacionadas