Разделите текст на предложение, даже если в тексте есть мистер Миссис - PullRequest
3 голосов
/ 16 марта 2011

У меня есть проблема, я хочу разбить текст на предложение, используя fullstop (.)

Например:

Мистер.Bean - британский комедийный телесериал из 14 получасовых эпизодов с Роуэн Аткинсон в главной роли.Различные эпизоды были написаны Аткинсоном, Робином Дрисколлом, Ричардом Кертисом и одним Беном Элтоном.

Если я разделю вышеприведенный текст, я получу 3 предложения типа

1. Мистер

2. Бин - британский комедийный телесериал из 14 получасовых эпизодов с Роуэн Аткинсон в главной роли.Различные эпизоды были написаны Аткинсоном, Робином Дрисколлом, Ричардом Кертисом и один Беном Элтоном.

3. Различные эпизоды были написаны Аткинсоном, Робином Дрисколлом, Ричардом Кертисом и один Беном Элтоном.


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

1.Мистер Бин - британский комедийный телесериал из 14 получасовых эпизодов с Роуэн Аткинсон в главной роли.Различные эпизоды были написаны Аткинсоном, Робином Дрисколлом, Ричардом Кертисом и один Беном Элтоном.

2. Различные эпизоды были написаны Аткинсоном, Робином Дрисколлом, Ричардом Кертисом и один Беном Элтоном.

Пожалуйста, помогите мне.Я ценю мгновенную обратную связь от сообщества.

Спасибо.

Ответы [ 3 ]

6 голосов
/ 16 марта 2011

Если вы ищете способ избежать разделения предложений после сокращения (например, a.m.), это сложная проблема естественного языка.

Если вы просто хотите разделить предложения, не беспокоясь о мистере или миссис (и у вас есть символ, который вряд ли будет отображаться в тексте, например *), вот простой способ:

  1. заменить все экземпляры Mr. и Mrs. на Mr* и Mrs*
  2. разделить текст на .
  3. в полученном массиве замените все экземпляры Mr* и Mrs* на Mr. и Mrs.

Вот версия, которая использует NUL в качестве сторожевого персонажа, поскольку для него почти невозможно непреднамеренно отобразиться в тексте:

static IEnumerable<string> Splitter(string sentences)
{
    char sentinel = '\0';
    return sentences.Replace("Mr.", "Mr" + sentinel)
        .Replace("Mrs.", "Mrs" + sentinel)
        .Split(new[] { ". " }, StringSplitOptions.None)
        .Select(s => s.Replace("Mr" + sentinel, "Mr.")
                        .Replace("Mrs" + sentinel, "Mrs."));
}

Если вы параноидальный человек, который считает, что какой-то конкретный персонаж может появиться в вашем тексте, не стесняйтесь использовать GUID для стража.

3 голосов
/ 16 марта 2011

Единственный способ (я могу думать прямо сейчас) сделать это, это добавить интеллект к функции разделения.Когда использовать.в качестве разделителя, а когда нет.

Вы можете сделать это следующим образом:

  1. Заменить все вхождения <dot> на <dot><dot>.
  2. Заменить все Mr. (и другие записи в словаре).) Mr<dot>.
  3. Разделить текст по оставшимся точкам.
  4. Заменить все Mr<dot> (и другие ...) на Mr..
  5. Заменить всевхождения <dot><dot> от <dot>.

Конечно, вы можете использовать другой escape-символ / строку.

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

0 голосов
/ 16 марта 2011
static IEnumerable<string> Splitter(string sentences)
{
    foreach (string s in 
        Regex.Split(sentences, "(?<!((mr)|(mrs)))\\.", RegexOptions.IgnoreCase))
    {
        if (!String.IsNullOrWhiteSpace(s)) yield return s.Trim() + ".";
    }
}

Простой основанный на регулярных выражениях ответ, использующий отрицательный ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...