TokensRegex:使用 AND 运算符

TokensRegex: Using AND operators

TokensRegex(Standford CoreNLP 库中的一个模块)支持 & (AND) 运算符。据我了解,您可以使用模式 'X & Y' 来匹配包含 X 和 Y 的任何序列。但是当我在实际代码中使用运算符时,它并没有像我预期的那样工作。这是我的 Java 代码:

String content = "data is here and everywhere";
String pattern = "data & is";

TokenizerFactory tf = PTBTokenizer.factory(new CoreLabelTokenFactory(), "");
List<CoreLabel> tokens = tf.getTokenizer(new StringReader(content)).tokenize();
TokenSequencePattern seqPattern = TokenSequencePattern.compile(pattern);
TokenSequenceMatcher matcher = seqPattern.getMatcher(tokens);

if(matcher.find()){
      System.out.println("Matched"); // <- I expected to have this printed out
} else {
      System.out.println("Unmatched"); // <- But I've got this instead :(
}

你能告诉我我的代码或我的理解有什么问题吗?提前谢谢你。

对于给定的示例,matcher.find() 将尝试在输入标记序列中查找满足两个条件的子序列:

data:一个标记的序列,其中包含单词 data

is:一个标记的序列,其中包含单词 is

显然没有这样的顺序。如果你想检查你的标记序列是否同时包含单词 data 和单词 is,你可以尝试模式:

String pattern = "(?: ( []* data []* ) & ( []* is []* ))";

开头的?:表示不需要做分组捕获,[]*表示任意数量可选token的通配符。

尽管 TokensRegex 提供了 AND,但它实际上并不是普通正则表达式的一部分。很可能还有其他方法(没有 AND)来实现你想要的。