当前位置: 首页 > 知识库问答 >
问题:

了解任意短语匹配的Stanford CoreNLP TokensRegex语法

林夕
2023-03-14

因此,我最近一直在使用NLP,但除了/test/这样非常简单的匹配之外,我在使用它们的regex语法时遇到了麻烦。我正在寻找的最终游戏是匹配在其内容的某个地方包含特定单词的短语。我试图建模的语音模式是非常结构化的,但因为人类的语音是可变的,短语可以以无数种方式开始,但只要短语包含特定的关键词,我就想计算它。作为一个例子,我试图用TokensRegex建模的regex是:

.*(show).*(cars).*(\d{0,9})(km|mi).*

对我来说,从他们的文档中看不出一个复杂的短语可以被构造出来。如果可以的话,我很难看到如何将它转换成他们的语法。我最接近的似乎是这样的:

"[]*/(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) 
 (*,TextAnnotation:/show/,*,TextAnnotation:/cars/,*,TextAnnotation GE 0.0, TextAnnotation:/(kilometer[s]?|mile[s]?)/,*)
show me all cars
[]/show/[]/cars/[]

共有1个答案

子车英达
2023-03-14

事实证明,我并不直接需要TokensRegex来解决我的问题。我试图解决的关键问题是在短语中挑选数字并转换它们,但我意识到我可以使用CorenLP的NERClassifierCombiner来挑选它们,替换它们,并使用普通的正则表达式来匹配更新的输入短语。下面是我所做的例子,对于像“向我展示15公里内的所有汽车”这样的短语,这将它转换为“向我展示15公里内的所有汽车”:

        Sentence sentence = new Sentence(eventName);
        String serializedClassifier = "english.muc.7class.distsim.crf.ser.gz";
        NERClassifierCombiner combiner = null;
        try {
            combiner = new NERClassifierCombiner(serializedClassifier);
        } catch (IOException e) {
            e.printStackTrace();
        }
        List<String> reconstructedEventTokens = new ArrayList<>();
        for (CoreLabel cl : combiner.classify(sentence.asCoreLabels())) {
            if(cl.ner() == KBPRelationExtractor.NERTag.NUMBER.name){
                reconstructedEventTokens.add(cl.get(CoreAnnotations.NumericCompositeValueAnnotation.class).toString());
            }else{
                reconstructedEventTokens.add(cl.originalText());
            }
        }
        String newEvent = String.join(" ",reconstructedEventTokens);
        System.out.println("matching phrase to check: "+newEvent);
        Pattern pattern = Pattern.compile(value);
        Matcher matcher = pattern.matcher(newEvent);

为了找到NER工具包,我在库里做了更多的挖掘,但它现在像一个魅力一样工作!希望这能帮助其他试图在短语中找到数字或其他实体的人。

 类似资料:
  • 我正在使用elasticsearch从json字段进行精确短语匹配。我尝试过多种语法,比如multi_match、query_string query_string我正在使用的语法; 我也尝试了过滤器而不是查询,但是过滤器在json上没有给出任何结果。我用于过滤器的语法是; 现在的问题是; 是否可以使用elasticsearch对json执行精确匹配操作?

  • 我遇到了一个问题,elasticsearch在我的环境(舞台和生产)中返回不同的结果。 我使用的elasticsearch版本对于这两种环境是相同的。 这两个环境都具有相同的映射和索引设置。 我有一个项目索引的标题字段为“测试”。我正在尝试执行match_phrase_prefix查询。然而,在我的舞台环境中,当我搜索“te”时,结果会像预期的那样返回。在生产中,我必须将搜索查询扩展到“TES”(

  • 问题内容: 这对我来说应该是显而易见的,但事实并非如此。以下两个仅匹配第二个阶段(在这种情况下为) 而以下错误发出错误消息 我想匹配包含的所有文件 或者 输入完全相同的词组。 问题答案: 您的第一个查询实际上不是有效的JSON对象,因为您两次使用相同的字段名称。 您可以使用布尔必须查询来匹配两个短语:

  • 我不知道如何通过MatchPhrasePrefix搜索索引中的文档。我想匹配整个搜索词短语,但允许在最后一个词上加前缀。 这个LINQ建筑给了我1.0分的一切。我将如何构建这个?另一方面,是否可以查看NEST正在构建的原始查询?那将非常有帮助!

  • 通过看到我的结果,我有点困惑如何在MatchPherage和match query中进行评分 对于匹配短语,我有如下查询 获得的reults如下 a。“信用-消费者测试文章”得分12.64 b的文件。“信用-X测试文章”得分12.64 c的文件。“Credit-XYZ测试文章”得分10.92 d的文档。“信用测试文章”得分10.22 e的文件。“Credit-Z测试文章”得分09.40的文档 前两

  • 问题内容: Elasticsearch的新功能,试图更好地了解这些查询之间的区别。据我所知,匹配单个项(需要小写的比赛工作?),都和文本字符串匹配。 问题答案: 查询匹配单个术语: 不分析 值。因此,不必根据所索引的内容将其小写。 如果您是在索引时间提供的,并且未分析该值,则以下查询将不会返回任何内容: 如果为查询字段定义了分析器,则查询将分析输入,并查找符合以下条件的文档: 所有条款 必须出现在