Controllo ortografico intelligente
-
10-12-2019 - |
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.
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 ();