0

JavaScript で 1 つ以上の正規表現パターンを組み合わせるために、次の関数を使用しています。

Tokenizer.prototype.combinePatterns = function() {
  return new RegExp('(' + [].slice.call(arguments).map(function (e) {
      var e = e.toString()
      return '(?:' + e.substring(1, e.length - 1) + ')'
  }).join('|') + ')', "gi")
};

これはうまくいきます。ここで、いくつかのパターンを「保護」したい、つまり、結果の正規表現を実行するときにいくつかのパターンを除外したいということです。これは、配列default_patternで定義されたどのパターンにも適用されないようにしたいということです(この概念は、 MOSES Tokenizerの保護されたパターン オプションから取られています)。protected_patterns

これらの保護されたパターンは、デフォルトのパターンで定義されている場合と定義されていない場合があります。

AggressiveTokenizer.prototype.tokenize = function(text, params = {}) {
    var options = {
        default_pattern: /[^a-z0-9äâàéèëêïîöôùüûœç]+/,
        protected_patterns: []
    };
    for (var attr in params) options[attr] = params[attr];
    var patterns = [].concat(options.protected_patterns).concat(options.default_pattern);
    // LP: pass along all regex patterns as argument
    patterns = this.combinePatterns.apply(this,patterns);
    // break a string up into an array of tokens by anything non-word
    return this.trim(text.split(patterns));

};

このアプローチに従って、次のようなパターンを保護すると想定されます

[ '\bla([- ]?la)+\b']

combinePatternsメソッドの結果から、この結合された正規表現を取得します。

/((?:la([- ]?la)+)|(?:[^a-z0-9äâàéèëêïîöôùüûœç]+))/gi

結果は期待どおりではないため、(フランス語の)テキストの例では、必要なトークンを全体としてsalut comment allez-vous la-la-la取得している間に、トークンを取得しています。la-la-laundefinedla-

var combinePatterns = function() {
  return new RegExp('(' + [].slice.call(arguments).map(function(e) {
    var e = e.toString()
    return '(?:' + e.substring(1, e.length - 1) + ')'
  }).join('|') + ')', "gi")
};

var tokenize = function(text, params = {}) {
  var options = {
    default_pattern: /[^a-z0-9äâàéèëêïîöôùüûœç]+/,
    protected_patterns: []
  };
  for (var attr in params) options[attr] = params[attr];
  var patterns = [].concat(options.protected_patterns).concat(options.default_pattern);
  // LP: pass along all regex patterns as argument
  patterns = this.combinePatterns.apply(this, patterns);
  // break a string up into an array of tokens by anything non-word
  return text.trim().split(patterns);

}

var text = "salut comment allez-vous la-la-la";
var res = tokenize(text, {
  protected_patterns: ['\bla([- ]?la)+\b']
})
console.log(res)

私の期待される結果は

[
  "salut",
  "comment"
  "allez"
  "vous"
  "la-la-la"
]

何が間違っていますか: 保護されたパターンの組み合わせアプローチまたはprotected_patterns配列内の正規表現?

ヒント: if は、生成された this 正規表現combinePatternsにのみ適用されることに気付きましたdefault_pattern

return this.trim(text.split(/((?:[^a-z0-9äâàéèëêïîöôùüûœç]+))/gi));

これにより、デフォルト パターンの結果のトークンがわずかに変更されます。

return this.trim(text.split(/[^a-z0-9äâàéèëêïîöôùüûœç]+/i));
4

1 に答える 1