我尝试使用正则表达式计算文本中的句子数.我想出了一个regex1找到所有要点:
([^.!?\s][^.!?]*)
Run Code Online (Sandbox Code Playgroud)
之后,我尝试通过以下regex2找到大部分首字母缩略词:
([A-Z]+[a-z]{0,3}\.).
Run Code Online (Sandbox Code Playgroud)
但是我有一些问题:
如果首字母缩略词在句子的末尾,则通过regex2公式找到(例如,自公元前20,000年以来).这不是故意的,我只想在一个句子中找到首字母缩略词.
如果我们假设,问题1已经解决,我想将两个正则表达式公式合并在一起,以便最终公式只输出实际的句子数.例如,我们可以考虑维基百科的以下文本:
美国国家航空航天局(NASA)是负责民用空间计划以及航空航天研究的美国政府机构.
德怀特·艾森豪威尔总统于1958年建立了美国国家航空航天局(NASA)[5],具有明显的民用(而不是军事)方向,鼓励和平应用于空间科学.1958年7月29日通过了"国家航空航天法",解散了美国宇航局的前身 - 国家航空咨询委员会(NACA).新机构于1958年10月1日开始运作.[6] [7]
从那时起,大多数美国太空探索工作都由美国宇航局领导,包括阿波罗登月任务,天空实验室空间站以及后来的航天飞机.目前,NASA正在支持国际空间站,并正在监督猎户座多用途机组车辆,太空发射系统和商用机组车辆的开发.该机构还负责启动服务计划(LSP),该计划负责监督无人驾驶NASA发射的发射操作和倒计时管理.
美国宇航局的科学重点是通过地球观测系统更好地了解地球,[8]通过科学任务理事会的太阳物理研究计划的努力推进太阳物理学,[9]利用先进的机器人航天器任务,如新视野,探索整个太阳系的物体, [10]通过大天文台和相关计划研究天体物理学主题,如大爆炸.[11] NASA与各种国家和国际组织共享数据,例如温室气体观测卫星.
上面的文字有9个句子.
Regex1:12匹配(D.,U.和S.被认为是"完全停止")
Regex2:3匹配(D.,U.和S.)
我现在需要的是一个更好的regex1公式,只能在一个句子中找到首字母缩略词然后"合并"两个正则表达式以接收所有句子.
如果合并两个公式是不可能的(出于任何合理的原因),那么只考虑问题1,因为目前我的JAVA程序使用两个公式分开:
public void breakIntoSentences()
{
//Find all points
Pattern p = Pattern.compile("([^.!?\\s][^.!?]*)");
Matcher m = p.matcher(content);
int allPoints = 0;
while(m.find())
allPoints++;
//Find all acronyms with length 0-4
p = Pattern.compile("([A-Z]+[a-z]{0,3}\\.)");
m = p.matcher(content);
int allAcronyms = 0;
while(m.find())
allAcronyms++;
numberOfSentences = allPoints - allAcronyms;
}
Run Code Online (Sandbox Code Playgroud)
提前感谢您的帮助