首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用REGEX和忽略缩略语计算句子数

使用REGEX和忽略缩略语计算句子数
EN

Stack Overflow用户
提问于 2015-04-16 11:19:52
回答 2查看 1K关注 0票数 5

我试着用正则表达式来计算文本中的句子数。我想出了一个regex1,找出了所有要点:

代码语言:javascript
复制
([^.!?\s][^.!?]*)

在此之后,我试图通过以下regex2找到大多数缩略语:

代码语言:javascript
复制
([A-Z]+[a-z]{0,3}\.).

然而,我有几个问题:

  1. 如果首字母缩略词位于句子的末尾,就可以找到(例如,自公元前20,000年以来)。用regex2公式。这不是故意的,我只想在句子中找到缩略词。
  2. 如果我们假设problem1已经解决了,我想把这两个正则表达式合并在一起,这样最后的公式只能输出句子的实数。例如,我们可以考虑维基百科的下列文本:

美国国家航空航天局(NASA)是负责民用空间计划以及航空和航天研究的美国政府机构。 德怀特·D·艾森豪威尔总统于19585成立了美国国家航空航天局(美国宇航局),其明确的民用(而非军事)方向鼓励了空间科学中的和平应用。1958年7月29日通过了“国家航空和空间法”,推翻了美国航天局的前身--国家航空咨询委员会(NACA)。新机构于1958.6年月一日开始运作。 从那时起,美国大部分的太空探索工作都是由美国宇航局领导的,包括阿波罗登月任务、太空实验室空间站以及后来的航天飞机。目前,美国宇航局正在支持国际空间站,并正在监督猎户座多用途机组人员飞行器、空间发射系统和商用机组人员飞行器的开发。该机构还负责发射服务计划(LSP),该计划为美国宇航局无人发射提供发射操作和倒计时管理。 美国航天局的科学重点是通过地球观测系统更好地了解地球,8通过科学任务管理局的太阳物理学研究方案推进太阳物理学,9在整个太阳系中探索具有先进机器人航天器任务的天体,如“新地平线”,10并通过“大爆炸”等天体物理学专题和相关方案进行研究。11美国航天局与各种国家和国际组织共享数据,例如温室气体观测卫星的数据。

以上课文共9句。

Regex1: 12场比赛(D.,U.和S.被认为是“全场”)

Regex2: 3场比赛(D、U、S.)

我现在需要的是一个更好的regex1公式,只在一个句子中找到缩略词,然后“合并”两个正则表达式来接收所有的句子。

如果合并这两个公式是不可能的(出于任何合理的原因),那么只考虑问题1,因为目前我的JAVA程序使用了这两个公式:

代码语言:javascript
复制
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;        
}

提前感谢您的帮助

EN

回答 2

Stack Overflow用户

发布于 2015-04-16 11:45:04

下面是一个模式:

代码语言:javascript
复制
.+?(?:(?<![\s.]\p{Lu})[.!?]|$)

演示

  • .+?来这里只是为了匹配一个完整的句子。如果您只想要一个计数,可以用.替换它。
  • (?<![\s.]\p{Lu})的意思是在大写字母本身之前没有空格或句点。这是在[.!?]之前使用的,它检查句子的结尾。这似乎处理好了首字母缩略词。
  • $只是在开始时强制非贪婪的.+?匹配,直到文本的末尾,以防文本没有以句点结束。

这个正则表达式将[6][7]作为下一句的一部分来处理。如果这是不可接受的,您可以通过在[\d\[\]]*后面添加[.!?]来稍微修改模式。

票数 1
EN

Stack Overflow用户

发布于 2015-04-16 11:51:43

看上去你想要的只是在这段时期之前没有资本的东西。这很容易做到:

代码语言:javascript
复制
((?:[A-Z]\.|[^\.!?])+)[\.!?]

这使用任何非句子结尾符号或大写后面的句号的选项。

多个字符还允许您避免记录以下三句话:

就像这样..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29673147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档