Получение оригинального текста после использования stanford NLP parser
Привет люди из интернета,
У нас возникает следующая проблема с Stanford NLP API: у нас есть строка, которую мы хотим преобразовать в список предложений. Во-первых, мы использовали String sentenceString = Sentence.listToString(sentence);
но listToString
не возвращает исходный текст из-за токенизации. Теперь мы попытались использовать listToOriginalTextString
следующим образом:
private static List<String> getSentences(String text) {
Reader reader = new StringReader(text);
DocumentPreprocessor dp = new DocumentPreprocessor(reader);
List<String> sentenceList = new ArrayList<String>();
for (List<HasWord> sentence : dp) {
String sentenceString = Sentence.listToOriginalTextString(sentence);
sentenceList.add(sentenceString.toString());
}
return sentenceList;
}
Это не работает. По-видимому, мы должны установить атрибут "обратимый" в true, но мы не знаем, как это сделать. Как мы можем это сделать?
В общем, как вы правильно используете listToOriginalTextString? Какие препараты вам нужны?
С уважением, Хайет
2 ответа
String sentenceStr = sentence.get(CoreAnnotations.TextAnnotation.class)
Это дает вам оригинальный текст. Пример для файла JSONOutputter.java:
l2.set("id", sentence.get(CoreAnnotations.SentenceIDAnnotation.class));
l2.set("index", sentence.get(CoreAnnotations.SentenceIndexAnnotation.class));
l2.set("sentenceOriginal",sentence.get(CoreAnnotations.TextAnnotation.class));
l2.set("line", sentence.get(CoreAnnotations.LineNumberAnnotation.class));
Если я правильно понимаю, вы хотите получить соответствие токенов исходному входному тексту после токенизации. Вы можете сделать это так;
//split via PTBTokenizer (PTBLexer)
List<CoreLabel> tokens = PTBTokenizer.coreLabelFactory().getTokenizer(new StringReader(text)).tokenize();
//do the processing using stanford sentence splitter (WordToSentenceProcessor)
WordToSentenceProcessor processor = new WordToSentenceProcessor();
List<List<CoreLabel>> splitSentences = processor.process(tokens);
//for each sentence
for (List<CoreLabel> s : splitSentences) {
//for each word
for (CoreLabel token : s) {
//here you can get the token value and position like;
//token.value(), token.beginPosition(), token.endPosition()
}
}