所以我最近一直在与NLP合作,而且我在使用正则表达式语法时遇到的问题除了像/ test /这样极其简单的匹配之外。我正在搜索的最终游戏是匹配在其内容中某处包含特定单词的短语。我尝试建模的语音模式是非常有条理的,但由于人类语音是可变的,短语可以开始无数种方式,但只要短语包含某些关键词我想要计算它。作为一个例子,我试图在TokensRegex中建模的正则表达式是:
.*(show).*(cars).*(\d{0,9})(km|mi).*
会匹配如下的短语:
"please show me all cars within 100 km of me"
从他们的文档中我不清楚可以构造一个复杂的短语。如果它我可以在查看如何将其转换为语法时遇到问题。我最接近的似乎是:
"[]*/(show)/[]*/(cars)/[]*[word>=0]/(kilometer|miles)/[]"
这是我用来检查匹配项的代码片段:
//value is the regex, tokens is the List<CoreLabel>s of text to try and match
pattern = TokenSequencePattern.compile(value);
TokenSequenceMatcher matcher = pattern.getMatcher(tokens);
while (matcher.find()) {
String matchedString = matcher.group();
System.out.println(matchedString);
return true;
}
当我调试它时,我看到匹配器内的元素是CoreLabels列表
(show,me,all,cars,within,a,hundred,kilometers,of,me)
并将模式编译为SequencePattern
列表 (*,TextAnnotation:/show/,*,TextAnnotation:/cars/,*,TextAnnotation GE 0.0, TextAnnotation:/(kilometer[s]?|mile[s]?)/,*)
对我来说,它似乎应该匹配,但它没有。甚至被剥离的东西:
show me all cars
正则表达式:
[]/show/[]/cars/[]
不匹配所以它让我倾向于不正确设置正则表达式。有没有我不了解TokensRegex的限制或我没有正确构建表达式。非常感谢任何帮助,谢谢!
答案 0 :(得分:0)
事实证明我不需要TokensRegex直接解决我的问题。我试图解决的关键是在短语中挑选数字并转换它们但我意识到我可以使用CoreNLP的NERClassifierCombiner来挑选它们,替换它们,并使用普通的正则表达式来匹配更新的输入短语。我所做的例子如下,对于“在十五公里内显示所有车辆”之类的短语,将其转换为“向我展示15公里范围内的所有车辆”:
<!DOCTYPE html>
<html>
<head>
<title>BanksySan @ViewData["Title"]</title>
</head>
<body>
<div>
</div>
</body>
进一步挖掘图书馆以找到NER工具包,但它现在就像一个魅力!希望这有助于其他人试图在他们的短语中找到数字或其他实体。