用正则表达式给email分句

public List<string> SpliteToSentences(string para, List<string> segrules)
        {
            string input = para;
            List<int> quotePos = new List<int>();
            int pos = 0;
            while (pos < input.Length)
            {
                pos = input.IndexOf('"', pos);
                if (pos == -1) break;
                quotePos.Add(pos);
                pos += 1;
            }
            StringBuilder sb = new StringBuilder();
            pos = 0;
            for (int i = 0; i + 1 < quotePos.Count; i += 2)
            {
                sb.Append(Regex.Replace(input.Substring(pos, quotePos[i] - pos), @"(?<!(?:\W[A-Z]|etc|Prof|Mr|Miss|Mt|Rep|Dr|\bPh))(\.|!|\?)", "$1#N#"));
                sb.Append(input.Substring(quotePos[i], quotePos[i + 1] - quotePos[i] + 1));
                pos = quotePos[i + 1] + 1;
            }
            if (pos < input.Length)
            {
                sb.Append(Regex.Replace(input.Substring(pos), @"(?<!(?:\W[A-Z]|etc|Prof|Mr|Miss|Mt|Rep|Dr|\bPh))(\.|!|\?)", "$1#N#"));
                //sb.Append(input.Substring(pos));
            }
            input = sb.ToString();
            input = input.Replace("'s", " 's");
            input = input.Replace("’s", " 's");
            foreach (string rule in segrules)
            {
                if (rule.Contains(@""", @"""))
                {
                    string rulept = Regex.Replace(rule, @"@""(.*)"", @""(.*)""\);", "$1");
                    string rulerep = Regex.Replace(rule, @"@""(.*)"", @""(.*)""\);", "$2");
                    input = Regex.Replace(input, rulept, rulerep);
                }
            }
            string[] splits = { "#N#" };
            List<string> sentences = new List<string>();
            sentences = input.Split(splits, StringSplitOptions.RemoveEmptyEntries).Select(p => Preprocessing(p.Trim())).ToList();
            return sentences;
        }
</pre><pre class="csharp" name="code">private void ExecEnTextSegmentationToolsUsingEmailNER(HttpContext context, string text, IEnumerable<Tool> tools, JsonMultiExtraction ret)
        {
            string usingrule = context.Request["custom"];
            string usingemailseg = context.Request["segtool"];
            SegRulesText = context.Request["segrulestext"];
            List<string> segrules = SegRulesText.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            
            List<string> docs = new List<string>();
            docs = Regex.Split(text, "={75}", RegexOptions.Multiline).ToList();
            List<string> paras=new List<string>();
            
            foreach(var doc in docs)
            {
                text = doc;
                if (usingemailseg == "true")
                    paras = SpliteToSentences(text, segrules);
                else
                    paras = text.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries).Select(p => Preprocessing(p.Trim())).ToList();
}


初始化页面时做的:

        protected void Page_Load(object sender, EventArgs e)
        {
            string lang = LangUtil.GetRequestLang(Request);
            if (lang == "en")
            {
                SegRules= File.ReadAllText(Server.MapPath("~/app_data/SegRules.txt"), Encoding.UTF8);
            }
	}


最后,上我的所有分句规则,为了灵活,都是写在外部文档中的:

//SegRules.txt

@"\n\s*\n", @"#N#");
@"\.#N#(?=\w+([-+.]\w+)*@(\w+([-.]\w+)*))", @".");
@"(?<=\w+([-+.]\w+)*@\w+([-.]\w+)*)\.#N#", ".");
@"\.#N#(?=([a-z]+(\.#N#)*)*([a-z]+))", @".");
@"\bvs\.\s*#N#",@"vs.");
@"-{4}(-)+([a-zA-z/0-9:\s]+)?-{4}(-)+", @"#N#$&#N#");
@"\nFrom\s*:", @"#N#$&");
@"\n(To|to)\s*:", @"#N#$&");
@"\n(Cc|cc)\s*:", @"#N#$&");
@"\n(Bcc|bcc)\s*:", @"#N#$&");
@"\nSent\s*:", @"#N#$&");
@"\nSubject\s*:", @"#N#$&");
@"\nTitle\s*:", @"#N#$&");
@"\nDate\s*:", @"#N#$&");
@"\nWhen\s*:", @"#N#$&");
@"\nTime\s*:", @"#N#$&");
@"\nWhere\s*:", @"#N#$&");
@"\nHost\s*:", @"#N#$&");
@"\nSpeaker\s*:", @"#N#$&");
@"\nVenue\s*:", @"#N#$&");
@"\nNote\s*:", @"#N#$&");
@"\nAbstract\s*:", @"#N#$&");
@"\nRoom\s*:", @"#N#$&");
@"\nBio\n\s*:", @"#N#$&#N#");
@"(!#N#){3}", @"!!!#N#");
@"(!#N#){2}", @"!!#N#");
@"(\.#N#){3}", @"...#N#");
@"(\.#N#){2}", @"..#N#");
@"(i\.#N#e)", @"i.e");
@"(?<t1>\.)#N#(?<t2>txt|doc|xls)(?=\s)", @"${t1}${t2}#N#");
@"\r\r(\r)*", @"#N#$&#N#");




在实现对“空格+数字+空格”格式的识别分句处理时,可以通过修改现有的正则表达式模式,将该编号格式作为独立的匹配单元进行识别。这一目标可以通过在正则表达式中引入对空格、数字以及其组合结构的匹配规则实现。 ### 正则表达式模式修改 为了匹配“空格+数字+空格”的格式,可以使用以下正则表达式模式: ```regex \s+\d+\s+ ``` 其中: - `\s+` 表示一个或多个空白字符(包括空格、制表符等); - `\d+` 表示一个或多个数字字符; - 整体结构表示“一个或多个空格,后跟一个或多个数字,再后跟一个或多个空格”[^3]。 这种模式可以作为句子分隔的识别单元,确保在文本处理过程中,类似“ 123 ”的结构不会被错误拆分。 ### 分句处理中的正则表达式整合 在句子分割任务中,通常使用正则表达式来定义分句的边界。例如,常见的句子分隔符包括句号、问号、感叹号等标点符号。为了支持“空格+数字+空格”格式作为分句边界,可以将其整合进正则表达式模式中。例如: ```regex (?<!\d)(\s+\d+\s+)(?!\d) ``` 该模式确保匹配的是“前后不被数字包围的空格+数字+空格”结构,从而避免将类似“abc123 def”中的“123”误判为编号格式。 ### 示例代码 以下是一个使用 Python 的 `re` 模块进行分句处理的示例,其中包含对“空格+数字+空格”格式的支持: ```python import re text = "This is a test sentence. 123 Another sentence 456 More text" pattern = r'(?<!\d)(\s+\d+\s+)(?!\d)' # 使用正则表达式进行分句 sentences = re.split(pattern, text) # 输出结果 for i, sentence in enumerate(sentences): print(f"Sentence {i+1}: {sentence.strip()}") ``` 该代码将文本按照“空格+数字+空格”格式进行分句,并确保编号结构不会被错误地嵌入到句子中。 ### 分句逻辑优化 在自然语言处理中,确保编号格式不会干扰句子的语义结构是关键。通过上述正则表达式修改,可以有效识别编号结构并将其作为分句边界,从而提升文本解析的准确性。此外,还可以结合上下文信息,进一步优化编号格式的识别逻辑,例如排除出现在数字列表项中的编号,或者处理连续编号结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值