【问题标题】:Searching for advanced regex patterns with kwic()使用 kwic() 搜索高级正则表达式模式
【发布时间】:2020-03-31 10:30:32
【问题描述】:

我想使用 kwic() 在文本中查找具有更高级正则表达式短语的模式,但我正在努力解决 kwic() 标记短语的方式,并且出现了两个问题:

1) 如何使用包含空格的短语进行分组:

kwic(text, pattern = phrase("\\b(address|g[eo]t? into|gotten into)\\b \\bno\\b"), valuetype="regex")

stri_detect_regex(types_search, pattern, case_insensitive = case_insensitive) 中的错误: 正则表达式模式中不正确的嵌套括号。 (U_REGEX_MISMATCHED_PAREN)

2)如何查找更长的单词序列(与第一个问题类似):

kwic("this is a test", pattern= phrase("(\\w+\\s){1,3}"), valuetype="regex", remove_separator=FALSE)

0 行的 kwic 对象

kwic("this is a test", pattern= phrase("(\\w+ ){0,2}"), valuetype="regex", remove_separator=FALSE)

stri_detect_regex(types_search, pattern, case_insensitive = case_insensitive) 中的错误: 正则表达式模式中不正确的嵌套括号。 (U_REGEX_MISMATCHED_PAREN)

感谢您的任何提示!

【问题讨论】:

    标签: r regex quanteda


    【解决方案1】:

    phrase() 要理解的一点是,它可以创建由空格分隔的模式序列作为单个字符值。至少对于正常使用而言,它不应该将空格分隔符作为模式的一部分。

    我为您的问题的第一部分选择了一个可重现的示例,我认为它说明了要点并回答了您的问题。

    在这里,我们只是将不同的模式放入phrase(),它们之间有一个空格。这相当于将它们包装在 list() 中,并将分离模式的序列变成字符向量的元素。

    library("quanteda")
    #> Package version: 2.0.1
    
    kwic("a b c a b d e", pattern = phrase("b c|d"), valuetype = "regex")
    #>                                      
    #>  [text1, 2:3]       a | b c | a b d e
    #>  [text1, 5:6] a b c a | b d | e
    kwic("a b c a b d e", pattern = list(c("b", "c|d")), valuetype = "regex")
    #>                                      
    #>  [text1, 2:3]       a | b c | a b d e
    #>  [text1, 5:6] a b c a | b d | e
    

    我们还可以考虑一个序列匹配向量,包括具有非常包容性的匹配,例如下面的 ".+ ^a$" 匹配任何 1 个或多个字符的序列,然后是标记 "a"。请注意^$ 如何明确表明这是(单令牌)正则表达式的开始和结束。

    kwic("a b c a b d e", pattern = phrase(c("b c|d", ".+ ^a$")), valuetype = "regex")
    #>                                      
    #>  [text1, 2:3]       a | b c | a b d e
    #>  [text1, 3:4]     a b | c a | b d e  
    #>  [text1, 5:6] a b c a | b d | e
    

    对于第二部分,您可以使用通配符匹配来匹配任何内容,使用默认的“glob”匹配最简单:

    kwic("this is a test", pattern = phrase("* * *"))
    #>                                      
    #>  [text1, 1:3]      | this is a | test
    #>  [text1, 2:4] this | is a test |
    
    kwic("this is a test", pattern = phrase("* *"))
    #>                                         
    #>  [text1, 1:2]         | this is | a test
    #>  [text1, 2:3]    this |  is a   | test  
    #>  [text1, 3:4] this is | a test  |
    

    最后请注意,可以将空格作为模式匹配的一部分,但前提是您有包含空格的标记。如果您通过...(参见?kwic)将remove_separators = FALSE 参数传递给tokens() 调用,或者如果您以其他方式创建令牌以确保它们包含空格,那么这将是正确的。

    as.tokens(list(d1 = c("a b", " ", "c"))) %>%
      kwic(phrase("\\s"), valuetype = "regex")
    #>                        
    #>  [d1, 1]     | a b |  c
    #>  [d1, 2] a b |     | c
    

    在那里,显示的“a b”实际上是单个标记“ab”,而不是标记“a”、“b”的序列。第二行的空白是“ ”标记。

    reprex package (v0.3.0) 于 2020 年 3 月 31 日创建

    【讨论】:

    • 谢谢,这是对可能性的非常有用的概述!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    相关资源
    最近更新 更多