インテリジェントスペルチェック
-
10-12-2019 - |
質問
nhunspell を使用して、spellingエラーの文字列をチェックします。
var words = content.Split(' ');
string[] incorrect;
using (var spellChecker = new Hunspell(affixFile, dictionaryFile))
{
incorrect = words.Where(x => !spellChecker.Spell(x))
.ToArray();
}
.
これは一般的に機能しますが、いくつかの問題があります。たとえば、「これは(非常に良い)例です」という文章をチェックしている場合は、「(非常に良い)の例です」、「(非常に」、「善」)「スペルミス」を報告します。または、文字列に「8:30」のような時間が含まれている場合は、スペルミスされた単語としてそれを報告します。カンマなどにも問題があります。
Microsoft Wordは、時間、割合、またはカンマ区切りの単語リストを認識するのに十分な大きさです。英語辞書を使用しない場合は知っており、シンボルを無視するかを知っています。どのように私は私のソフトウェアでも同様の、よりインテリジェントなスペルチェックを受けることができますか?もう少し知性を提供するライブラリはありますか?
編集: 私はユーザーに自分のマシンにMicrosoft Wordをインストールすることを強制したくないので、COM Interopを使用することはオプションではありません。
解決
あなたのスペルチェッカーが本当にその愚かなのなら、あなたはその入力を事前にトークン化して単語を取得し、それらを1つずつ(またはスペースで結合された文字列として)を送ります。私はC#/ Netに慣れていませんが、Pythonでは、Pythonでは、そのために\w+
のような簡単なREを使用しています。
>>> s = "This is a (very good) example"
>>> re.findall(r"\w+", s)
['This', 'is', 'a', 'very', 'good', 'example']
.
と私は.NETは非常に似ているものがあります。実際、 docs によると、\w
がサポートされているため、re.findall
がそこにどのように呼ばれるかを調べなければならないだけです。
他のヒント
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
}
.
詳細情報ここ。 私が読んできた後、私はHunspellが最高の選択肢の1つであると思います。)
C#で、あなたはこのようなことをすることができます。
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()。ここで(x=>!HUNSPELL.SPELL(x))。count();