Другие языки программирования и технологии

C# Сделать программу которая разделяет текст на предложения.

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

static void Main(string[] args) {
string text = "А: «П». «П», -а. «П?» - а. «П!» - а.";

string[] strings = text.Split(new[] { '!', '?', '.' });

Console.WriteLine("Текст: \n" + text + " \n");

foreach (string str in strings) {
Console.WriteLine(str);
}
Console.ReadKey();
}
Тут обычные регулярки не помогут, если он собирается распознавать прямую речь и т. д. Тут нужно делать своего рода "движок" по парсингу, для примера можешь посмотреть парсинг арифметических выражений, ну только не стандартный, который парсит 2+3, а что-то более серьезное, со скобками, синусами и др. операциями. А Regex ему не хватит.
SR
Suleyman Rzayev
20 187
Лучший ответ
Михаил Слободчиков Регулярку с парами кавычек вполне можно написать.
И всяко лучше в этом случаее обычного Split
Михаил Слободчиков Шаблоны регулярок могут учитывать и позиционирование и вообще могут быть очень гибкими.
Почти уверен, что бОльшую часть проблем они решат в этом случае. В т. ч. 100% есть регулярки проверяющие парность скобок и т. п.

Другое дело на сколько это действительно нужно автору вопроса и на сколько глубоко он готов вникать в регулярные выражения.
С Regex.Split ИМХО проблем быть не должно. Шаблон только правильно составьте. =)
https://docs.microsoft.com/ru-ru/dotnet/api/system.text.regularexpressions.regex.split?view=netcore-2.1

К слову - про тот Split что у Вас - неправильно обработает многоточие, ?!н-р.
Не говоря уже про числа 1.25 и т. п.
Виктор Фатеев Кажется это то что нужно! Я немного переделали теперь многоточие тоже обрабатывается.

string pattern = "[.?!(...)]";
var dividedText = Regex.Split(text, pattern);

Но как сделать, чтобы программа считала выражения в кавычках, например когда прямая речь записана в тексте в виде «П» ?
Авто расстановка точек возможна только при отличии их от запятых, а значит в принципе при расстановки знаков препинания. Следовательно, необходим синтаксический анализ. В случае синтаксически неопределенных (трудно определяемых) предложений (неопределенной их "смеси") необходимо также учитывать семантику/контекст/вероятность (адекватность/релевантность) получаемых предложений. Отправной точкой послужит использование одной из моделей определения близости значений слов (их распределения по многомерному пространству определяющему их значения) и статистический подсчет вероятности сочетаний определённых значений (не известные сочетания строятся по аналогии). Через полученную модель с примерами разметки прогнать классификатор с обучением. Для красоты генерируемые системой правила можно структурировать в виде правил модного YARA.
Другой вариант, поступить как в Яндекс. Паузы между словами получают одну из меток: пробел, точка, запятая, вопросительный знак, восклицательный знак, двоеточие. Чтобы предсказать, какая метка соответствует конкретной паузе, используется метод условных случайных полей (CRF — conditional random fields). Для определения контекста учитываются три предшествующих и два последующих слова, и эти нехитрые правила позволяют с достаточно высокой точностью расставлять знаки.
Можно также попробовать посмотреть в сторону time–frequency representation (TFR), Short-time Fourier transform (STFT), Gabor transform (GT), Wigner distribution function (WDF) методов и придумать что-то на их основе.
Либо, загнать все как есть в наивный Баейсовский классификатор в надежде на приемлемый результат.
JB
J*a*s*u*r Bek
1 821
Михаил Слободчиков Вы сами поняли что скопировали откуда и зачем? =)
Речь о тексте а не о звуковом анализе.

Похожие вопросы