我想要实现SRX分割规则使用javascript从文本中提取句子。
为了正确地做到这一点,我必须遵循SRX规则。
例如:http://www.lisa.org/fileadmin/standards/srx20.html#refTR29
现在有两种类型的正则表达式
对于这一点,有两部分
例如,如果规则是
<rule break="no">
<beforebreak>\s*[0-9]+\.</beforebreak>
<afterbreak>\s</afterbreak>
</rule>也就是说,如果发现模式"\s*0-9+.\s“,则段不应中断。
如何使用javascript实现,我的be拆分函数是不够的?
发布于 2010-08-15 20:37:36
你可能想试试这样的东西:
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作为字符串。例如:
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'))的操作来查看结果。
已知的限制:
所有这些限制似乎都很容易克服。
这是怎么回事?
段函数使用rulePattern提取每个规则,识别它是打破的还是不破坏的规则,并根据规则的前中断和后中断子句创建regexp。然后,它扫描文本,并通过添加一个unicode字符(取自unicode专用区)标记每个匹配位置,该字符标记是中断(\ use 001)还是非中断(\use 000)。如果另一个标记已经位于同一位置,则该规则将不匹配,以保留规则优先级。
然后,它简单地移除非断线标记,并根据断线对文本进行拆分。
@Sourabh:我希望这对你还是有意义的。
https://stackoverflow.com/questions/2758974
复制相似问题