7

正規表現を使用して文/フレーズを単語に分割しようとしています。

var phrase = "This isn't a test.";
var words = Regex.Split(phrase, @"\W+").ToList();

単語には「This」、「isn」、「t」、「a」、「test」が含まれます

明らかに、それはアポストロフィを拾い上げ、それを分割しています。この動作を変更できますか? また、さまざまな言語 (スペイン語、フランス語、ロシア語、韓国語など) をサポートする多言語である必要もあります。

単語をスペルチェッカーに渡す必要があります。具体的にはヌンスペル。

return (from word in words let correct = _engine[langId].Spell(word) where !correct select word).ToList();
4

8 に答える 8

11

スペルチェックの目的で単語に分割したい場合は、これが良い解決策です:

new Regex(@"[^\p{L}]*\p{Z}[^\p{L}]*")

基本的に、以前の正規表現を使用して Regex.Split を使用できます。Unicode 構文を使用するため、いくつかの言語で動作します (ほとんどのアジア言語ではありません)。また、アポストロフィやハイフンで単語を分割することもありません。

于 2012-04-20T04:07:04.493 に答える
4

多くの言語が非常に複雑なルールを使用して単語をフレーズや文につなぎ合わせるという事実があるため、単純な正規表現に頼ってテキストからすべての単語を取得することはできません。英語のように「単純な」言語であっても、次のような多くの特殊なケースで実行されます。

  • あなたのような言葉の扱い方は、2 つの単語を組み合わせて文字数を ' に置き換えるところではありません。
  • Mr. Mrs. ie などの略語の扱い
  • 「-」を使用して結合された単語
  • 文末のハイフンでつながれた単語。
  • O'Brian や O'Connel などの名前。

中国語と日本語 (とりわけ) は、このように解析するのが難しいことで有名です。これらの言語は単語間にスペースを使用せず、文間にのみスペースを使用するためです。

テキスト セグメンテーションについて調べて、セグメンテーションが重要な場合は、テキスト全体を解析できるスペル チェッカーや、言語の規則に従って文を単語に分割できるテキスト セグメンテーション エンジンに投資することをお勧めします。

ただし、Google で簡単に検索しても、.NET ベースの多言語セグメンテーション エンジンは見つかりませんでした。ごめん。

于 2012-04-20T09:51:14.460 に答える
0

これは私のために働いた:[^(\d|\s|\W)]*

于 2013-07-31T16:47:49.397 に答える
0

私はJavaの人ではありませんが
、同時にスペースを分割しながら句読点を除外しようとすることができます. このようなものかもしれません。

これらは未加工の拡張された正規表現であり、単語はキャプチャ グループ 1 に
あります。グローバル検索を実行します。

Unicode (書記素は考慮されません)

[\s\pP]* ([\pL\pN_-] (?: [\pL\pN_-] | \pP(?=[\pL\pN\pP_-]) )* )

アスキー

[\s[:punct:]]* (\w (?: \w | [[:punct:]](?=[\w[:punct:]]) )* )
于 2012-04-20T03:51:53.757 に答える