一千萬個為什麽

搜索

在JavaScript中實現SRX分段規則

我想使用javascript實現SRX分段規則從文本中提取句子。

為了正確執行此操作,我必須遵循SRX規則。

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

現在有兩種類型的正則表達式

  1. 如果發現句子應該像“。”那樣打破。
  2. 如果發現的句子不應該像縮寫U.K或Mr.
  3. 那樣破壞

為此,有兩個部分

  1. 在破壞之前
  2. 打破後

例如,如果規則是



    \s*[0-9]+\.
    \s


其中說如果找到模式“\ s * [0-9] +。\ s”,則該段不應該中斷。

我如何使用javascript實現,我的拆分功能還不夠?

最佳答案

你可能想嘗試這樣的事情:

function segment(text, rules) {
    if (!text) return text;
    if (!rules) return [text];

    var rulePattern = /]+|\s*)>(?:([^<]+)<\/beforebreak>)?(?:([^<]+)<\/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+<');
}

要運行它,只需使用要拆分的文本調用 segment(),並將規則XML作為字符串。例如:

segment('The U.K. Prime Minister, Mr. Blair, was seen out with his family today.',
        '' +
            '\sMr\.' +
            '\s' +
        '' +
        '' +
            '\sU\.K\.' +
            '\s' +
        '' +
        '' +
            '[\.\?!]+' +
            '\s' +
        ''
);

segment()的調用將返回一個句子數組,因此您可以簡單地執行類似 alert(segment(...)。join('\ n'))看到結果。

已知限制:

  1. 預計規則將在級聯流程之後與特定語言相關。
  2. 它希望規則使用的正則表達式符合javascript regexp語法。
  3. 它不處理內部標記。

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

這個怎麽用?

段函數使用 rulePattern 來提取每個規則,確定它是破壞規則還是非破壞規則,並根據規則的beforebreak和afterbreak子句創建regexp。然後它掃描文本,並通過添加一個unicode字符(取自unicode私有使用區域)來標記每個匹配的位置,該字符標記是中斷(\ uE001)還是非中斷(\ uE000)。如果另一個標記已經位於同一位置,則規則不匹配,以保留規則優先級。

然後它只是刪除非斷裂標記,並根據斷裂標記分割文本。

@Sourabh:我希望這仍然適合你。

轉載註明原文: 在JavaScript中實現SRX分段規則