web-dev-qa-db-ja.com

文字列を文に分割する

文字列を分割して文字列配列に格納するこのコードを書きました:-

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

ただし、省略形の問題に対処したかったので、[a-z]を追加しました。しかし、私の結果は次のように表示されます:-

さらに、エベレットが基本的な数学でそれらを指導しようとしたとき、彼らは無応答であることを証明しました

Split関数で指定されたパターンを失うことがわかりました。私がピリオドを失っても大丈夫ですが、御言葉の最後の文字を失うことはその意味を乱します。

誰かがこれを手伝ってくれませんか?さらに、誰かが略語を処理するのを手伝ってくれませんか?たとえば、ピリオドに基づいて文字列を分割しているので、省略形を失いたくありません。

25
leba-lev

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

より良いアプローチは、正しいロケールで設定された 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));
}

次の結果が得られます。

  1. これはテストです。
  2. これはT.L.A.テスト。
  3. 今、博士が入っています。
54
Julien Silland

すべてのケースで正規表現を機能させることは困難ですが、差し迫った問題を修正するには、後読みを使用できます。

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.

略語、氏など、大文字で終わらない略語があることに注意してください。また、ピリオドで終わらない文もあります。

12
Mark Byers

可能であれば、 LingPipe などの自然言語処理ツールを使用してください。 (eg :-))、Mr。abbreviations省略記号(...)、et cetera

LingPipe Webサイトの Sentence Detection に関する非常に簡単なチュートリアルがあります。

4
João Silva