Regex - это хороший вариант, который я использовал долгое время.
Очень хорошее регулярное выражение, которое отлично сработало для меня:
string[] sentences = Regex.Split(sentence, @"(?<=['""A-Za-z0-9][\.\!\?])\s+(?=[A-Z])");
Однако регулярное выражение неэффективно. Кроме того, хотя логика работает для идеальных случаев, она не работает в производственной среде.
Например, если мой текст,
U.S.A. это замечательная нация. Большинство людей чувствуют себя счастливыми, живя там.
Метод регулярных выражений классифицирует его как 5 предложений путем разделения на каждый период. Но мы знаем, что логически это должно быть разделено только на два предложения.
Это то, что заставило меня искать технику машинного обучения, и, наконец, SharpNLP отлично сработал для меня.
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);
}
Здесь, в этом примере, я использовал SharpNLP, в котором я использовал EnglishSD.nbin - предварительно обученную модель для определения предложения.
Теперь, если я применю один и тот же вход к этому методу, он отлично разделит текст на два логических предложения.
Вы даже можете использовать токены, POSTag, Chuck и т. Д., Используя проект SharpNLP.
Для пошаговой интеграции SharpNLP в ваше приложение C # прочитайте подробную статью, которую я написал. Она объяснит вам интеграцию с фрагментами кода.
Спасибо