TokensRegex:使用AND运算符

时间:2015-10-02 02:09:58

标签: pattern-matching stanford-nlp string-matching

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 :(
}

请您告诉我我的代码或我的理解有什么问题?提前谢谢。

1 个答案:

答案 0 :(得分:3)

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

data:一个带有单词data

的令牌序列

is:一个带有单词is

的令牌序列

显然没有这样的序列。如果您想检查您的令牌序列是否包含单词data和单词is,您可以尝试使用该模式:

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

初始?:表示不需要进行子组捕获,[]*表示任意数量的可选令牌的通配符。

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