首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaScript中实现SRX分割规则

在JavaScript中实现SRX分割规则
EN

Stack Overflow用户
提问于 2010-05-03 15:02:18
回答 1查看 937关注 0票数 1

我想要实现SRX分割规则使用javascript从文本中提取句子。

为了正确地做到这一点,我必须遵循SRX规则。

例如:http://www.lisa.org/fileadmin/standards/srx20.html#refTR29

现在有两种类型的正则表达式

  1. 如果发现句子应该像“。”
  2. 如果发现句子不应该像缩写U.K或or .

对于这一点,有两部分

  1. 在断裂之前
  2. 断后

例如,如果规则是

代码语言:javascript
复制
<rule break="no">

    <beforebreak>\s*[0-9]+\.</beforebreak>
    <afterbreak>\s</afterbreak>

</rule>

也就是说,如果发现模式"\s*0-9+.\s“,则段不应中断。

如何使用javascript实现,我的be拆分函数是不够的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-15 20:37:36

你可能想试试这样的东西:

代码语言:javascript
复制
function segment(text, rules) {
    if (!text) return text;
    if (!rules) return [text];

    var rulePattern = /<rule(?:(\s+break="no")|\s+[^>]+|\s*)>(?:<beforebreak>([^<]+)<\/beforebreak>)?(?:<afterbreak>([^<]+)<\/afterbreak>)?<\/rule>/g;
    cleanXml(rules).replace(rulePattern, 
        function(whole, nobreak, before, after) {
            var r = new RegExp((before||'')+'(?![\uE000\uE001])'+(after?'(?='+after+')':''), 'mg');
            text = text.replace(r, nobreak ? '$&\uE000' : '$&\uE001');
            return '';
        }
    );

    var sentences = text.replace(/\uE000/g, '').split(/\uE001/g);

    return sentences;
}

function cleanXml(s) {
    return s && s.replace(/<!--[\s\S]*?-->/g,'').replace(/>\s+</g,'><');
}

要运行此操作,只需调用segment(),并将文本拆分,并将规则XML作为字符串。例如:

代码语言:javascript
复制
segment('The U.K. Prime Minister, Mr. Blair, was seen out with his family today.',
        '<rule break="no">' +
            '<beforebreak>\sMr\.</beforebreak>' +
            '<afterbreak>\s</afterbreak>' +
        '</rule>' +
        '<rule break="no">' +
            '<beforebreak>\sU\.K\.</beforebreak>' +
            '<afterbreak>\s</afterbreak>' +
        '</rule>' +
        '<rule break="yes">' +
            '<beforebreak>[\.\?!]+</beforebreak>' +
            '<afterbreak>\s</afterbreak>' +
        '</rule>'
);

segment()的调用将返回一个句子数组,因此您可以简单地执行类似alert(segment(...).join('\n'))的操作来查看结果。

已知的限制:

  1. 它期望规则在与特定语言相关的级联过程之后。
  2. 它期望规则使用的正则表达式符合javascript regexp语法。
  3. 它不处理内部标记。

所有这些限制似乎都很容易克服。

这是怎么回事?

段函数使用rulePattern提取每个规则,识别它是打破的还是不破坏的规则,并根据规则的前中断和后中断子句创建regexp。然后,它扫描文本,并通过添加一个unicode字符(取自unicode专用区)标记每个匹配位置,该字符标记是中断(\ use 001)还是非中断(\use 000)。如果另一个标记已经位于同一位置,则该规则将不匹配,以保留规则优先级。

然后,它简单地移除非断线标记,并根据断线对文本进行拆分。

@Sourabh:我希望这对你还是有意义的。

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

https://stackoverflow.com/questions/2758974

复制
相关文章

相似问题

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