Разобрать документ на предложения - PullRequest
0 голосов
/ 02 июня 2011

У меня есть вопрос, который должен быть достаточно простым для экспертов, но мучительно загадочным для меня :) Я хотел бы разбить текст (предварительно обработанный, без специальных символов, кроме обычных знаков препинания) на предложения и выполнить две задачианалогично:

  1. Для каждого предложения найдите количество слов (длина предложения).Затем для документа найдите среднюю длину предложения.Нет необходимости сообщать о каких-либо результатах на уровне предложений.Обратите внимание, что документ содержит достаточное количество имен собственных, поэтому заглавная буква не обязательно означает начало предложения.НО предложения в этом документе обычно заканчиваются на «,», «!» Или «?».

  2. Для каждого предложения примените шаблон регулярного выражения.Если есть совпадение, дайте предложению значение, например, 1.Для всего документа укажите количество совпадений.Опять же, нужны только выходные данные уровня документа.

Мне интересно, есть ли способ сделать это, предпочтительно в C # или VB.Любая помощь будет оценена.

======================

Пример абзаца:

This is an example of a paragraph! It contains three sentences? And the average sentence has many words. 

Пример шаблона:

"three"

Выход:

number of sentences-3.
Average sentence length-6.
Number of matches-1.

Ответы [ 3 ]

2 голосов
/ 02 июня 2011

Вы можете получить предложение (зависит от вашего определения предложения), используя:

(\a|[\.!\?:])[^\.!\?:]+

И слово, используя:

[a-zA-Z]+

Остальное легко - просто посмотрите надокументация для регулярных выражений на MSDN.

2 голосов
/ 02 июня 2011

Это должно работать:

string example =
    "This is an example of a paragraph! It contains three sentences? And the average sentence has many words.";

var splitExample = example.Split(new[] {'.', '!', '?'}, StringSplitOptions.RemoveEmptyEntries);

var matchExpression = new Regex("three");
double avgLength = splitExample.Average(x => x.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries).Length);
int sentences = splitExample.Length;
int matches = splitExample.Where(x => matchExpression.IsMatch(x)).Count();
1 голос
/ 02 июня 2011

Вы можете сделать Split на основе периода (.), Который даст вам массив предложений.

string sentences[] = document.Split('.');

Затем вы должны сделать Split для каждого "массива предложений" на основе "пробела", чтобы получить количество слов.

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

...