将文本分成句子甚至是Mrs. Mrs.存在于文本中

时间:2011-03-16 13:13:33

标签: c# split

我有一个问题,我想使用fullstop(。)

将文本拆分成句子

例如:

先生。 Bean 是英国喜剧电视连续剧14集半小时剧集,由罗文阿特金森主演的主角。不同的剧集由Atkinson,Robin Driscoll,Richard Curtis和Ben Elton撰写。

如果我分开上面的文字,我有3个句子,如

1。先生。

2。 Bean是英国喜剧电视连续剧14集半小时剧集,主演罗文阿特金森为主角。不同的剧集由Atkinson,Robin Driscoll,Richard Curtis和Ben Elton撰写。

3。不同的剧集由Atkinson,Robin Driscoll,Richard Curtis和Ben Elton撰写。


我想在第二句中加入先生,因为文本应该分成两句而不是三句。

1。憨豆先生是英国喜剧电视连续剧,由罗文阿特金森主演的14个半小时剧集作为主角。不同的剧集由Atkinson,Robin Driscoll,Richard Curtis和Ben Elton撰写。

2。不同的剧集由Atkinson,Robin Driscoll,Richard Curtis和Ben Elton撰写。

请帮助我。我很欣赏社区的即时反馈。

感谢。

3 个答案:

答案 0 :(得分:6)

如果您正在寻找一种避免在缩写之后分割句子的方法(如a.m.),那么这是一个很难解决的自然语言问题。

如果你只想分开句子而不用担心先生或夫人(并且有一个不太可能出现在文本中的角色,如*),这里有一个简单的方法:

  1. Mr.Mrs.的所有实例替换为Mr*Mrs*
  2. .
  3. 上拆分文字 在结果数组中
  4. ,将所有Mr*Mrs*的实例替换为Mr.Mrs.
  5. 这是一个使用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作为哨兵。

答案 1 :(得分:3)

这样做的唯一方法(我现在可以想到)就是为split功能添加智能。什么时候用。作为分隔符,何时不是。

您可以这样做:

  1. 将所有出现的<dot>替换为<dot><dot>
  2. Mr<dot>替换所有先生(以及字典中的其他条目)。
  3. 使用剩余的点分割文本。
  4. 以Mr.
  5. 替换所有Mr<dot>(及其他......)
  6. 将所有出现的<dot><dot>替换为<dot>
  7. 当然你可以使用另一个转义字符/字符串。

    您可以保留翻译词典。最好在文件中,以便您可以为不同的语言使用不同的字典。

答案 2 :(得分:0)

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() + ".";
    }
}

使用负面后卫的简单的基于正则表达式的答案。