Как мне разделить предложения? - PullRequest
3 голосов
/ 22 сентября 2011

Итак, я нашел и в настоящее время использую Stanford Parser, и он отлично работает для разделения предложений. Большинство наших предложений взяты из AP, поэтому он отлично подходит для этой задачи.

Вот проблемы:

  • ест много памяти (600М много)
  • это действительно портит форматирование текста, где я должен сделать множество крайних случаев на потом. (вызовы API препроцессора документа не позволяют указывать кавычки ascii / utf8 - они сразу переходят в латексный стиль, сокращения разделяются на разные слова (очевидно) и паразитные пробелы помещаются в разные места)

С этой целью я уже написал несколько патчей, чтобы компенсировать то, что мне действительно не нужно было делать.

По сути, это тот момент, когда использовать его так же трудно, как и проблему расщепления предложений.

Какие у меня есть другие варианты? Какой-нибудь другой тип платформы НЛП, который мог бы помочь?

Моя первоначальная проблема - просто определить границы предложений с высокой степенью вероятности.

Ответы [ 4 ]

5 голосов
/ 22 сентября 2011

Если вы хотите попробовать придерживаться Stanford Tokenizer / Parser, посмотрите страницу документации для токенизатора .

Если вы просто хотите разделить предложения, вам не нужно вызывать синтаксический анализатор должным образом, и поэтому вы должны иметь возможность использовать небольшой объем памяти - один или два мегабайта - напрямую используя DocumentPreprocessor.

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

unicodeQuotes=false,latexQuotes=false,asciiQuotes=false
unicodeQuotes=true

Первое будет означать отсутствие отображения котировок любого рода, второе будет заменять одинарные или двойные ascii-кавычки (если таковые имеются) на левые и правые кавычки согласно лучшимсвоей способности.

И хотя токенизатор разделяет слова различными способами в соответствии с соглашениями Penn Treebank, вы должны иметь возможность точно составить исходный текст из возвращенных токенов (см. различные другие поля в CoreLabel).В противном случае это ошибка.

1 голос
/ 30 ноября 2013

У вас есть один способ разделить предложения из текста с помощью Stanford NLP и без замены какого-либо символа странными символами (например, для скобок или апострофов):

PTBTokenizer ptbt = new PTBTokenizer(
                    new StringReader(text), new CoreLabelTokenFactory(), "ptb3Escaping=false");
List<List<CoreLabel>> sents = (new WordToSentenceProcessor()).process(ptbt.tokenize());
Vector<String> sentences = new Vector<String>();
for (List<CoreLabel> sent : sents) {
    StringBuilder sb = new StringBuilder("");
    for (CoreLabel w : sent) sb.append(w + " ");
        sentences.add(sb.toString());
    }
}               

Стандартный способ использования DocumentPreprocessorприкрутит ваш оригинальный текст.

1 голос
/ 22 сентября 2011

Доступно множество разделителей предложений, производительность зависит от вашего конкретного приложения.

Очень легко начать работу с версиями Perl и Python .Версия Стэнфордского парсера, которую я нашел проблемной в прошлом;Я закончил тем, что использовал специфичный для домена сплиттер (Genia).Я также запустил инструмент очистки на основе регулярных выражений, чтобы искать плохо разбитые предложения и заново собирать их.

0 голосов
/ 25 июля 2016

Вы можете использовать NLTK (особенно пакет nltk.tokenize):

import nltk
sentence_detector = nltk.data.load('tokenizers/punkt/english.pickle')
text = "This is a test. Let's try this sentence boundary detector."
text_output = sentence_detector.tokenize(text)
print('text_output: {0}'.format(text_output))

Выход:

text_output: ['This is a test.', "Let's try this sentence boundary detector."]
...