6

NHunspellを使用して、次のようなスペルミスがないか文字列をチェックしています。

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相互運用機能を使用することはできません。

4

3 に答える 3

6

スペルチェッカーが本当にばかげている場合は、入力を事前にトークン化して単語を取り出し、一度に1つずつ(またはスペースで結合された文字列として)フィードする必要があります。私はC#/。NETに精通していませんが、Pythonでは、次のような単純なREを使用します\w+

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

.NETにも非常によく似たものがあるに違いありません。実際、.NETのドキュメントによると、\wがサポートされているため、そこでどのようre.findallに呼び出されるかを確認する必要があります。

于 2012-03-09T18:00:22.687 に答える
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
}

正規表現の詳細については、こちらをご覧ください。私がこれを読んだ後、私はハンスペルが最良の選択の1つだと思います:)

于 2012-03-09T18:15:15.453 に答える
0

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

于 2016-04-19T10:42:12.763 に答える