假设我有以下代码:
TokenSequencePattern p = TokenSequencePattern.compile("[{tag:/JJ.*/}] [{tag:/NN.*/}]");
TokenSequenceMatcher m = tPattern.getMatcher(coreLabelList);
while (tMatcher.find()){
List<CoreMap> matches = m.groupNodes();
}
我想在这里捕捉的是一个形容词后面跟一个名词,即它必须以一个形容词开头,它必须以一个名词结尾。例如,如果我有漂亮的围巾&#34;它应该是一个匹配,但如果我有&#34;漂亮的白色圆点围巾&#34;它不应该是一个匹配。目前,上面的令牌正则表达式是两个短语的匹配。如何指定序列的确切开头及其确切结束?
答案 0 :(得分:1)
您可以使用
TokenSequencePattern p = TokenSequencePattern.compile("[tag:/JJ.*/] [tag:/NN.*/]");
使用A round ball is bouncing very high in to the blue sky.
进行测试,产生了round ball
和blue sky
子字符串。
要仅获取整个字符串匹配,如果要使用Matcher#find()
(使用Matcher#matches()
,则需要使用 anchors 暗示)。
所以,要仅将round ball
字符串与形容词和名词的组合匹配,您可以使用
TokenSequencePattern p = TokenSequencePattern.compile("^[tag:/JJ.*/] [tag:/NN.*/]$");
或
TokenSequencePattern p = TokenSequencePattern.compile("\\A[tag:/JJ.*/] [tag:/NN.*/]\\z");
^
/ \A
代表字符串的开头(同样,\A
将始终在字符串的开头匹配)和$
/ {{1匹配字符串的结尾(请注意,\z
将始终匹配字符串的最后一部分而\z
- 即使您没有使用多行修饰符 - 也允许后面的尾随换行符)。
注意:锚点在CoreNLP 3.7.0上进行测试。他们不在某些版本上工作(例如,不在CoreNLP 3.5.1上工作,它会抛出错误:$
)