Opennlp 1,5 для SentenceDetector? - PullRequest
       5

Opennlp 1,5 для SentenceDetector?

2 голосов
/ 29 сентября 2010

Теперь у меня есть следующий код:

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.

Абсолютно, это не то, что мы хотим. Как я могу решить проблему? спасибо.

Ответы [ 2 ]

7 голосов
/ 29 сентября 2010

Я не думаю, что модель обнаружения предложений, предоставляемая OpenNLP, хорошо подходит для вашей задачи, потому что она была обучена работе с данными, где пробел следует после пунктуации предложения, поскольку это довольно стандартно в английской орфографии.Английские детекторы предложений обычно предназначены для того, чтобы различать конечную пунктуацию предложения и пунктуацию, используемую в середине предложения в сокращениях, кавычках и т. Д. Во всех случаях ваш обычный детектор предложений будет ожидать какой-то пробел между предложениями.

Если вы хотите использовать OpenNLP, я думаю, что самым простым решением будет предварительная обработка ваших данных, чтобы добавить пространство, в котором вы обнаружите шаблон типа [a-z][.?!][A-Z].(Этот шаблон явно недостаточен, но просто для того, чтобы дать представление.) Существует не так много сокращений, имеющих такие форматы, как Nnnn.Nnnn или Nnnn? Nnnn, поэтому я уверен, что вы могли бы добиться хороших результатов, не используя ничего более фантастического, чем регулярное выражение., но это будет зависеть от того, как выглядят ваши данные.В качестве альтернативы, вы можете использовать какой-нибудь токенизатор с пользовательской моделью для поиска этих случаев.

Также возможно, что вы могли бы обучить свою собственную модель обнаружения предложений, которая не ожидает пробелов между предложениями, но похоже, что это происходитбыть хитрым с OpenNLP.Предоставленные ими программы обучения рассчитывают на данные обучения по одному предложению на строку, поэтому нельзя избежать вставки пробелов между предложениями.

0 голосов
/ 29 сентября 2010

Попробуйте использовать детектор предложений для конкретного языка (opennlp.tools.lang.english.SentenceDetector).

...