Stanford coreNLP разбивает предложения по абзацам без пробелов - PullRequest
0 голосов
/ 26 марта 2019

Я столкнулся с проблемой с аннотатором Стэнфорда.В качестве входных данных я получил текст, который содержит предложения, но в некоторых его частях нет пробела после точки.Вот так:

Собака любит кошку. Кошка любит мышь.Мышь ненавидит всех.

Поэтому, когда я пытаюсь использовать SentenceAnnotator - я получаю 2 предложения

Собака любит кошку. Кошка любит мышь.

Мышь ненавидит всех.

Вот мой код

Annotation doc = new Annotation(t);
Properties props = new Properties();
props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,parse,coref");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
pipeline.annotate(doc);
List<CoreMap> sentences = doc.get(CoreAnnotations.SentencesAnnotation.class);

Я также пытался добавить свойство

props.setProperty("ssplit.boundaryTokenRegex", "\\.");

, но безрезультатно.

Может быть, я что-то упустил?Спасибо!

UPD Также я попытался токенизировать текст с помощью PTBTokenizer

PTBTokenizer ptbTokenizer = new PTBTokenizer(
        new FileReader(classLoader.getResource("simplifiedParagraphs.txt").getFile())
        ,new WordTokenFactory()
        ,"untokenizable=allKeep,tokenizeNLs=true,ptb3Escaping=true,strictTreebank3=true,unicodeEllipsis=true");
List<String> strings = ptbTokenizer.tokenize();

, но токенизатор считает, что cat.Cat - это одно слово и не разделяет его.

1 Ответ

1 голос
/ 27 марта 2019

Это конвейер, в котором разделитель предложений будет определять границы предложений для токенов, предоставленных токенизатором, но разделитель предложений только группирует смежные токены в предложения, он не пытается объединить или разделить их.

Как вы обнаружили, я думаю, что свойство ssplit.boundaryTokenRegex сообщит разделителю предложений об окончании предложения, когда оно увидит "."в качестве маркера, но это не помогает в случаях, когда токенизатор не разделил "."кроме окружающего текста в отдельный токен.

Вам необходимо:

  • предварительно обработать ваш текст (вставить пробел после слова "cat."),
  • постобработайте свои токены или предложения, чтобы разделить подобные случаи, или
  • найдите / разработайте токенизатор, который может разделить "cat.Cat" на три токена.

Ни один из стандартных английских токенизаторов, которые обычно предназначены для использования с газетным текстом, были разработаны для обработки такого рода текста.

Некоторые связанные вопросы:

Принимает ли токенайзер предложений NLTK правильную пунктуацию иинтервал?

Как разбить текст на предложения, если после полной остановки нет пробелов?

...