Как получить номер предложения из ввода? - PullRequest
7 голосов
/ 20 апреля 2011

Кажется, трудно определить границу предложения в тексте.Кавычки как.!?может использоваться для разграничения предложений, но не настолько точно, как могут быть неоднозначные слова и цитаты, такие как США, профессор или доктор. Я изучаю библиотеку Tperlregex и поваренную книгу регулярных выражений от Jan Goyvaerts , но я не знаюКак написать выражение, которое определяет предложение?

Что может быть сравнительно точным выражением с использованием Tperlregex в Delphi?

Спасибо

Ответы [ 3 ]

6 голосов
/ 20 апреля 2011

Во-первых, вам, вероятно, нужно прийти к собственному определению, что такое «предложение», а затем реализовать это определение. Например, как насчет:

He said: "It's OK!"

Это одно предложение или два? Общий ответ не имеет значения. Решите, хотите ли вы интерпретировать его как одно или два предложения, и действуйте соответственно.

Во-вторых, я не думаю, что я буду использовать регулярные выражения для этого. Вместо этого я сканировал бы каждый символ и пытался обнаружить последовательности. Период сам по себе может быть недостаточным для разграничения предложения, но, вероятно, период, за которым следует пробел или возврат каретки (или конец строки). Это сразу же позволяет отсеять США (периоды, за которыми не следует пробел).

Для распространенных сокращений, таких как Prof. an Dr., было бы неплохо создать словарь - возможно, редактируемый вашими пользователями, поскольку каждый язык будет иметь свой собственный набор общих сокращений.

Каждый язык будет иметь свой собственный набор знаков препинания, которые могут влиять на то, как вы интерпретируете знаки препинания. Например, английский имеет тенденцию помещать точку в круглые скобки (как это.), В то время как польский делает противоположное (как это). Та же разница будет применяться к двойным кавычкам, одинарным кавычкам (некоторые языки их вообще не используют, иногда они неотличимы от апострофов и т. Д.). Ваши правила вполне могут быть привязаны к конкретному языку, по крайней мере частично.

В конце вы можете приблизиться к человеческому способу разграничения предложений, но всегда будут случаи, которые могут отбросить анализ. Например, предположим, что у вас есть словарь, который распознает «Проф.» как сокращение, что вы собираетесь делать с

Most people called him Professor Jones, but to me he was simply The Prof.

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

Most people called him Professor Jones, but to me he was simply Prof. Bill.
1 голос
/ 21 апреля 2011

Проверьте мой учебник здесь http://code.google.com/p/graph-expression/wiki/SentenceSplitting. Этот конкретный пример может быть легко переписан в регулярные выражения и некоторый императивный код.

0 голосов
/ 19 октября 2013

Будет разумно использовать процессор НЛП с предварительно обученной моделью. EnglishSD.nbin - это одна из таких моделей, которая доступна для OpenNLP и может использоваться в Visual Studio с SharpNLP.

Преимущества использования этого метода многочисленны.Например, рассмотрим ввод

Проф.Джессика замечательная женщина.Она родом из США. Она замужем за мистером Джейкобом-младшим.

Если вы используете разделение регулярных выражений, например

 string[] sentences = Regex.Split(text, @"(?<=['""A-Za-z0-9][\.\!\?])\s+(?=[A-Z])");

Тогда приведенный выше ввод будет разделенas

Проф.

Джессика замечательная женщина.

Она родом из U.

S.

A.

Она замужем за мистером

Джейкобом-младшим

Однако желаемый результат равен

Проф.Джессика замечательная женщина.

Она родом из США. Она замужем за мистером Джейкобом-младшим.

Такое логическое разделение предложений может быть достигнуто только с помощью обученных моделей из проекта OpenNLP.Этот простой метод.

private string mModelPath = @"C:\Users\ATS\Documents\Visual Studio 2012\Projects\Google_page_speed_json\Google_page_speed_json\bin\Release\";
private OpenNLP.Tools.SentenceDetect.MaximumEntropySentenceDetector mSentenceDetector;
private string[] SplitSentences(string paragraph)
    {
        if (mSentenceDetector == null)
        {
            mSentenceDetector = new OpenNLP.Tools.SentenceDetect.EnglishMaximumEntropySentenceDetector(mModelPath + "EnglishSD.nbin");
        }

        return mSentenceDetector.SentenceDetect(paragraph);
    }

, где mModelPath - путь к каталогу, содержащему файл nbin.

mSentenceDetector является производным от библиотеки OpenNLP.

Вы можете получить желаемый результат с помощью

string[] sentences = SplitSentences(text);

Пожалуйста, прочитайте эту статью, которую я написал для интеграции SharpNLP с вашим Приложением в Visual Studio, чтобы использовать инструменты NLP

...