Как получить номер предложения из ввода?

Кажется, трудно обнаружить границу предложения в тексте. Кавычки вроде .!? может использоваться для разделения предложений, но не настолько точен, поскольку могут быть двусмысленные слова и цитаты, такие как США, профессор или доктор. expressions.info/delphi.html" rel="nofollow">Jan Goyvaerts но я не знаю, как написать выражение, которое определяет предложение?

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

Спасибо


person Warren    schedule 20.04.2011    source источник
comment
Сколько предложений составляет мой комментарий, я искренне хотел бы знать? Доктор Дж. И. Уилберс, доктор философии. эсквайр   -  person Warren P    schedule 20.04.2011


Ответы (3)


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

He said: "It's OK!"

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

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

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

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

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

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.
person Marek Jedliński    schedule 20.04.2011
comment
+1 Я должен добавить: независимо от вашего выбора реализации (регулярное выражение или явно закодированный), вы захотите создать набор тестовых абзацев. Для каждого абзаца вы знаете, сколько предложений должно быть сообщено. Вы часто обнаружите, что попытка внедрить новое правило приведет к нарушению существующих правил. - person Disillusioned; 21.04.2011

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

person yura    schedule 21.04.2011

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

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

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

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

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

Затем указанный выше ввод будет разделен как

проф.

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

Она уроженка У.

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 является производным от dll OpenNLP.

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

string[] sentences = SplitSentences(text);

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

person Arun Thundyill Saseendran    schedule 19.10.2013