Domanda

Sto usando nhunspell per controllare una stringa per gli errori di ortografia come:

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

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

Microsoft Word è abbastanza intelligente da riconoscere un tempo, una frazione o un elenco delimitato da virgola.Sa quando non usare un dizionario inglese e conosce quando ignorare i simboli.Come posso ottenere un controllo ortografico simile e intelligente nel mio software?Ci sono delle biblioteche che forniscono un po 'più di intelligenza?

Modifica: Non voglio costringere gli utenti ad avere Microsoft Word installato sulla propria macchina, quindi utilizzare COM Interop non è un'opzione.

È stato utile?

Soluzione

Se il tuo controllo ortografico è davvero così stupido, dovresti pre-tokenizzare il suo input per ottenere le parole fuori e nutrire quelle alla volta (o come una stringa unite agli spazi).Non ho familiarità con C # /. Net, ma in Python, useresti un semplice riporto \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 il .NET Docs , \w è supportato, quindiDevi solo scoprire come re.findall è chiamato lì.

Altri suggerimenti

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 qui . Dopo aver letto questo penso che Hunspell sia una delle migliori scelte:)

In C #, potresti fare qualcosa del genere.

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 numerofmistakes= content.getwords (). Dove (x=>! hunspell.spell (x)). conteggio ();

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top