質問

文字列を分割して文字列アレイに保存するこのコードを書きました: -

String[] sSentence = sResult.split("[a-z]\\.\\s+");

しかし、略語の問題のいくつかに対処したかったので、[AZ]を追加しました。しかし、その後、私の結果はそう表示されます: -

さらに、エベレットが基本的な数学で彼らに指示しようとしたとき、彼らは反応しないことが証明されました

分割関数で指定されたパターンが失われていることがわかります。私が期間を失うことは大丈夫ですが、言葉の最後の文字を失うことはその意味を妨げます。

誰かがこれで私を助けることができますか、さらに、誰かが略語に対処するのを手伝ってくれますか?たとえば、期間に基づいて文字列を分割するため、略語を失いたくありません。

役に立ちましたか?

解決

文章の解析は、英語のようなラテン語であっても、些細な仕事ではありません。質問の中で概説するような素朴なアプローチは、実際には役に立たないことが証明されるほど頻繁に失敗します。

より良いアプローチは、aを使用することです ブレイメーター 右のロケールで構成されています。

BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US);
String source = "This is a test. This is a T.L.A. test. Now with a Dr. in it.";
iterator.setText(source);
int start = iterator.first();
for (int end = iterator.next();
    end != BreakIterator.DONE;
    start = end, end = iterator.next()) {
  System.out.println(source.substring(start,end));
}

次の結果が得られます。

  1. これはテストです。
  2. これはTLAテストです。
  3. 今、博士と一緒に。

他のヒント

すべての場合に機能するように正規表現を取得することは困難ですが、即時の問題を修正するには、lookbehindを使用できます。

String sResult = "This is a test. This is a T.L.A. test.";
String[] sSentence = sResult.split("(?<=[a-z])\\.\\s+");

結果:

This is a test
This is a T.L.A. test.

Abbrev。、Mr。などの大文字で終わらない略語があり、期間で終わらない文もあることに注意してください!

可能であれば、自然言語処理ツールを使用してください。 lingpipe. 。例えば、正規表現を使用してキャッチするのが非常に難しい微妙な微妙さがあります(例:例えば :-)), , 略語, 省略記号 (...), et cetera.

チュートリアルをフォローするのは非常に簡単です 文の検出 LingPipe Webサイトで。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top