2

今、私は次のコードを持っています:

SentenceModel sd_model = null;
  try {
   sd_model = new SentenceModel(new FileInputStream(
     "opennlp/models/english/sentdetect/en-sent.bin"));
  } catch (InvalidFormatException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  SentenceDetectorME mSD = new SentenceDetectorME(sd_model);
  String param = "This is a good senttence.I'm very happy. Who can tell me the truth.And go to school.";
  String[] sents = mSD.sentDetect(param);
  for(String sent : sents){
   System.out.println(sent);
  }

しかし、私は次の結果を得ました:

This is a good senttence.I'm very happy.
Who can tell me the truth.And go to school.

絶対に、これは私たちが望んでいるものではありません。どうすれば問題を解決できますか? ありがとう。

4

2 に答える 2

7

OpenNLP で提供される文検出モデルは、英語の正書法ではかなり標準的であるため、空白が文末の句読点に続くデータでトレーニングされているため、あなたのタスクには適していないと思います。英文検出器は通常、文末の句読点と、略語や引用符などで文の途中で使用される句読点を区別することを目的としています。すべての場合において、ありふれた文検出器は、文の間に何らかの空白があることを期待します。 .

OpenNLP を使用する場合、最も簡単な解決策は、データを前処理して、 のようなパターンを検出するスペースを追加することだと思います[a-z][.?!][A-Z]。(このパターンは明らかに十分ではありませんが、アイデアを提供するためのものです。) Nnnn.Nnnn や Nnnn?Nnnn のような形式の略語はあまりないので、正規表現よりも手の込んだものを使用しなくても、良い結果が得られるはずです。 、しかしそれはあなたのデータがどのように見えるかによって異なります. または、カスタム モデルである種のトークナイザーを使用して、これらのケースを見つけることもできます。

センテンス間の空白を想定しない独自のセンテンス検出モデルをトレーニングすることもできますが、OpenNLP ではトリッキーになるようです。彼らが提供するトレーニング プログラムは、1 行に 1 つの文を含むトレーニング データを想定しているため、文の間に空白を挿入することを避ける方法はありません。

于 2010-09-29T16:00:26.150 に答える
0

言語固有の文検出器 (opennlp.tools.lang.english.SentenceDetector) を使用してみてください。

于 2010-09-29T09:36:45.303 に答える