2015-10-16 1 views
0

Я использую CoreNLP для аннотации NE в многострочном тексте на английском языке. При осуществлении следующих действий:CRFClassifier не распознает варианты разделителя предложений

Properties props = new Properties(); 
props.put("annotators", "tokenize, ssplit, pos, lemma, ner"); 
props.put("ssplit.newlineIsSentenceBreak", "always"); 
StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 
String contentStr = "John speaks with Martin\n\nJeremy talks to him too."; 
Annotation document 
= new Annotation(contentStr); 
pipeline.annotate(document); 
List<CoreMap> sents = document.get(SentencesAnnotation.class); 
for (int i = 0; i < sents.size(); i++) { 
    System.out.println("sentence " + i + " "+ sents.get(i)); 
} 

Отказ расщепления прекращается и признает два предложения. Однако, когда я использую классификацию NER следующим образом:

CRFClassifier classifier = CRFClassifier.getClassifier("edu/stanford/nlp/models/ner/english.all.3class.distsim.crf.ser.gz", props); 
String classifiedStr = classifier.classifyWithInlineXML(contentStr); 

Я получаю следующее сообщение об ошибке:

Unknown property: |ssplit.newlineIsSentenceBreak| Unknown property: |annotators| 

и классификатор, кажется, рассмотреть весь текст как одно предложение в результате ложного признания лица «Мартин Джереми» вместо двух разных сущностей.

Любая идея, что не так?

ответ

2

Свойства, полученные CRFClassifier.getClassifier, отличаются от свойств, сделанных конструктором StanfordCoreNLP, поэтому вы получаете сообщение об ошибке, когда опция неизвестна.

Он будет установлен, но он не будет использоваться во время выполнения.

От here, вы обнаружите, что вам нужно установить свойства SeqClassifierFlags. Вам нужно установить tokenizerOptions и установить опцию "tokenizeNLs = true", в которой новые линии обозначаются как токены.

В нижней строке, установите свойство следующим образом, прежде чем получить классификатор. Он не должен давать вам ошибку неизвестного свойства, и он должен работать по назначению.

Properties props = new Properties(); 
props.put("tokenizerOptions", "tokenizeNLs=true"); 

CRFClassifier classifier = CRFClassifier.getClassifier("edu/stanford/nlp/models/ner/english.all.3class.distsim.crf.ser.gz", props); 
String classifiedStr = classifier.classifyWithInlineXML(contentStr); 
+0

Спасибо @Mohamed Selim. Это был только ответ! – Bahaa

Смежные вопросы