regex R中的Quanteda和stringr:(正确)无法解析正则表达式

ar5n3qh5  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(78)

我想使用quantedastringr库运行正则表达式搜索,但我继续收到错误。我的目标是使用正则表达式\(VP\h+\(V\w*\h+\w*\)匹配模式(VP (V.. ...)。下面是一个MWE:

library(quanteda)
library(dplyr)
library(stringr)

text <- "(ROOT (S (NP (PRP It)) (VP (VBZ is) (RB not) (VP (VBN transmitted) (PP (IN from) (: :) (S (VP (VBG giving) (NP (NP (NP (NP (NML (NN blood)"

kwic_regex <- kwic(
  # define text
  text, 
  # define search pattern
  "\(VP\h+\(V\w*\h+\w*\)", 
  window = 20, 
  # define valuetype
  valuetype = "regex") %>%
  # make it a data frame
  as.data.frame()

这是错误消息:

Error: '\(' is an unrecognized escape in character string starting ""\("

我觉得这很令人困惑,因为正则表达式应该是正确的(参见。https://regex101.com/r/3hbZ0R/1)。我也试过转义转义(例如\\(),但没有用。我真的很感激任何关于如何改进我的查询的想法。

xqkwcwgp

xqkwcwgp1#

R字符串似乎通过首先检查是否找到
允许转义的字符,它们可以替换结果控制代码。
由于普遍认为转义可以解析为单引号文本,
所有的转义都会在解析到传递给函数的 raw regex字符串后解析。
所以你的双引号字符串应该是"\\(VP\\h+\\(V\\w*\\h+\\w*\\)",它被解析为\(VP\h+\(V\w*\h+\w*\),然后交给stringr函数。

library(stringr)
 str_match_all(
 "(ROOT (S (NP (PRP It)) (VP (VBZ is) (RB not) (VP (VBN transmitted) (PP (IN from) (: :) (S (VP (VBG giving) (NP (NP (NP (NP (NML (NN blood)",
 "\\(VP\\h+\\(V\\w*\\h+\\w*\\)" )

https://www.mycompiler.io/view/BjjkPXQUNpT
输出量

[[1]]
      [,1]                   
 [1,] "(VP (VBZ is)"         
 [2,] "(VP (VBN transmitted)"
 [3,] "(VP (VBG giving)"

每种语言都强制执行不同的解析规则。
如果遇到未知的转义序列,有些会抛出错误
就像\(一样,其他人会简单地将转义剥离到这个(,而不会告诉你。

ojsjcaue

ojsjcaue2#

我发现了问题所在:显然,kwic()函数不再支持空格(参见kwic in quanteda (R) does not identify more than one word in regex pattern)。在运行搜索之前,我还使用了token()函数,并将表达式 Package 在phrase()中。
下面是正确的代码:

library(quanteda)
library(dplyr)
library(stringr)
library(tidyverse)

rm(list=ls(all=T))

text <- "(ROOT (S (NP (PRP It)) (VP (VBZ is) (RB not) (VP (VBN transmitted) (PP (IN from) (: :) (S (VP (VBG giving) (NP (NP (NP (NP (NML (NN blood)"

text2 <- tokens(text)

kwic_regex <- kwic(
  text2, 
  phrase("\\( VP \\V\\w* \\w* \\w* \\)"), 
  window = 10, 
  separator = " ",
  case_insensitive = F,
  valuetype = "regex") %>%
  as.data.frame(); kwic_regex

输出:

docname from to                        pre                  keyword
1   text1   12 17 ROOT ( S ( NP ( PRP It ) )          ( VP ( VBZ is )
2   text1   22 27 ( VP ( VBZ is ) ( RB not ) ( VP ( VBN transmitted )
3   text1   40 45    ( IN from ) ( : : ) ( S      ( VP ( VBG giving )
                                 post                      pattern
1 ( RB not ) ( VP ( VBN transmitted ) \\( VP \\V\\w* \\w* \\w* \\)
2            ( PP ( IN from ) ( : : ) \\( VP \\V\\w* \\w* \\w* \\)
3           ( NP ( NP ( NP ( NP ( NML \\( VP \\V\\w* \\w* \\w* \\)

相关问题