我有一个问题,我想使用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撰写。
请帮助我。我很欣赏社区的即时反馈。
感谢。
答案 0 :(得分:6)
如果您正在寻找一种避免在缩写之后分割句子的方法(如a.m.
),那么这是一个很难解决的自然语言问题。
如果你只想分开句子而不用担心先生或夫人(并且有一个不太可能出现在文本中的角色,如*
),这里有一个简单的方法:
Mr.
和Mrs.
的所有实例替换为Mr*
和Mrs*
.
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作为哨兵。
答案 1 :(得分:3)
这样做的唯一方法(我现在可以想到)就是为split功能添加智能。什么时候用。作为分隔符,何时不是。
您可以这样做:
<dot>
替换为<dot><dot>
。Mr<dot>
替换所有先生(以及字典中的其他条目)。Mr<dot>
(及其他......)
<dot><dot>
替换为<dot>
。当然你可以使用另一个转义字符/字符串。
您可以保留翻译词典。最好在文件中,以便您可以为不同的语言使用不同的字典。
答案 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() + ".";
}
}
使用负面后卫的简单的基于正则表达式的答案。