文字列を分割して文字列配列に格納するこのコードを書きました:-
String[] sSentence = sResult.split("[a-z]\\.\\s+");
ただし、省略形の問題に対処したかったので、[a-z]を追加しました。しかし、私の結果は次のように表示されます:-
さらに、エベレットが基本的な数学でそれらを指導しようとしたとき、彼らは無応答であることを証明しました
Split関数で指定されたパターンを失うことがわかりました。私がピリオドを失っても大丈夫ですが、御言葉の最後の文字を失うことはその意味を乱します。
誰かがこれを手伝ってくれませんか?さらに、誰かが略語を処理するのを手伝ってくれませんか?たとえば、ピリオドに基づいて文字列を分割しているので、省略形を失いたくありません。
文章の解析は、英語のようなラテン語であっても、簡単なことではありません。あなたが質問で概説するような素朴なアプローチは、実際には役に立たないことが証明されるほど頻繁に失敗します。
より良いアプローチは、正しいロケールで設定された BreakIterator を使用することです。
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));
}
次の結果が得られます。
すべてのケースで正規表現を機能させることは困難ですが、差し迫った問題を修正するには、後読みを使用できます。
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.
略語、氏など、大文字で終わらない略語があることに注意してください。また、ピリオドで終わらない文もあります。
可能であれば、 LingPipe などの自然言語処理ツールを使用してください。 (eg :-))、Mr。、abbreviations、 省略記号(...)、et cetera。
LingPipe Webサイトの Sentence Detection に関する非常に簡単なチュートリアルがあります。