【问题标题】:Positively match polar questions in part-of-speech tagged text积极匹配词性标记文本中的极性问题
【发布时间】:2021-11-08 21:57:16
【问题描述】:

我在c7 列中有这种类型的词性标记话语:

df <- data.frame(
  c7 = c("um_UH I_PPIS1 was_VBDZ there_RL",
         "that_DD1 's_VBZ me_PPIO1",
         "when_RRQ was_VBDZ that_DD1",
         "holy_JJ shit_NN1 does_VDZ it_PPH1 happen_VVI",
         "what_DDQ kind_NN1 of_IO pants_NN2 is_VBZ that_DD1",
         "are_VBR the_AT pictures_NN2 nice_JJ",
         "does_VDZ n't_XX it_PPH1",
         "no_UH you_PPY did_VDD n't_XX"))

我想匹配极性(或“是”/“否”)问题。除其他外,极性问题的一个条件是动词之前(在一定距离处)有疑问词('who'、'what'等)或人称代词('I' , 'you' 等)或指示语('that')。我发现自己无法通过使用否定回溯来排除与此否定条件不匹配的话语。我可以排除它们的唯一方法是通过 positive lookbehind 在模式中匹配它们并使用grep 的参数invert = TRUE

# pattern:
p1 <- "(?<=Q|_D|_P)(\\w{2,4})?\\s(['\\w]+\\s){0,3}['\\w]+_V(B|D|H).{1,2}\\s(n't_XX\\s)?(there|.{2,4}_(P|D))?"

# matching:
grep(p1, df$c7, value = TRUE, perl = TRUE, invert = TRUE)
[1] "holy_JJ shit_NN1 does_VDZ it_PPH1 happen_VVI" "are_VBR the_AT pictures_NN2 nice_JJ"         
[3] "does_VDZ n't_XX it_PPH1"

有没有办法积极匹配极性问题?也就是说,是否有另一种方法来断言动词不能在问题词之前(以Q结尾的词性标签,代词(以P开头的标签),指示词(以@987654328开头的标签@) 等等?

【问题讨论】:

  • 你可以用空格分割每个值,然后用下划线分割它们以制作更易于使用的数据框吗?
  • @camille 是:df$c7x &lt;- lapply(lapply(df$c7, function(x) unlist(str_extract_all(x, "([A-Z]+)"))), paste0, collapse = " ")
  • 您是要仅提取与条件匹配的令牌-POS 对,还是提取所有令牌-POS 对的条件为真的整行文本?如果是后者,我是否正确阅读了只有第 6 行完全匹配?
  • 我想匹配整行文本。第 4、6 和 7 行应该匹配。

标签: r regex regex-lookarounds


【解决方案1】:

这是一项有趣的任务。我没有尝试在一个正则表达式模式中做所有事情,而是将标记和词性标记视为它们自己的信息类型,并将数据框重新调整为每行有一对标记-标记。

在生产中,您可能不会将所有这些逻辑条件存储为它们自己的列,但它有助于使逻辑更加清晰。我正在使用的检查是:

  • 如果一个标签与动词模式匹配,它就是一个动词
  • 如果标签与问题模式匹配,则表示问题
  • 如果为该行文本 (ID) 找到任何先前的疑问词,则存在先前的疑问词
  • 如果标记既是动词又以疑问词开头,则它是极性的(不确定是否是术语)

过滤掉带有任何极性标志的行后,将文本折叠成每个 ID 的一行。

library(dplyr)

quest_patt <- "(Q$|^P|^D)"
verb_patt <- "^V[DBH]"

df_out <- df %>%
  tibble::rowid_to_column("id") %>%
  tidyr::separate_rows(c7, sep = "\\s") %>%
  tidyr::separate(c7, into = c("token", "tag"), sep = "_", remove = FALSE) %>%
  group_by(id) %>%
  mutate(is_verb = grepl(verb_patt, tag),
         is_question = grepl(quest_patt, tag),
         prev_question = cumsum(is_question) > 0,
         is_polar = is_verb & prev_question) %>%
  filter(!any(is_polar))
df_out
#> # A tibble: 12 × 8
#> # Groups:   id [3]
#>       id c7           token    tag   is_verb is_question prev_question is_polar
#>    <int> <chr>        <chr>    <chr> <lgl>   <lgl>       <lgl>         <lgl>   
#>  1     4 holy_JJ      holy     JJ    FALSE   FALSE       FALSE         FALSE   
#>  2     4 shit_NN1     shit     NN1   FALSE   FALSE       FALSE         FALSE   
#>  3     4 does_VDZ     does     VDZ   TRUE    FALSE       FALSE         FALSE   
#>  4     4 it_PPH1      it       PPH1  FALSE   TRUE        TRUE          FALSE   
#>  5     4 happen_VVI   happen   VVI   FALSE   FALSE       TRUE          FALSE   
#>  6     6 are_VBR      are      VBR   TRUE    FALSE       FALSE         FALSE   
#>  7     6 the_AT       the      AT    FALSE   FALSE       FALSE         FALSE   
#>  8     6 pictures_NN2 pictures NN2   FALSE   FALSE       FALSE         FALSE   
#>  9     6 nice_JJ      nice     JJ    FALSE   FALSE       FALSE         FALSE   
#> 10     7 does_VDZ     does     VDZ   TRUE    FALSE       FALSE         FALSE   
#> 11     7 n't_XX       n't      XX    FALSE   FALSE       FALSE         FALSE   
#> 12     7 it_PPH1      it       PPH1  FALSE   TRUE        TRUE          FALSE

df_out %>%
  summarise(c7 = paste(c7, collapse = " "))
#> # A tibble: 3 × 2
#>      id c7                                          
#>   <int> <chr>                                       
#> 1     4 holy_JJ shit_NN1 does_VDZ it_PPH1 happen_VVI
#> 2     6 are_VBR the_AT pictures_NN2 nice_JJ         
#> 3     7 does_VDZ n't_XX it_PPH1

【讨论】:

  • 我绝对同意。执行一些简单的测试可以很容易地理解你想要做什么。这使代码更具可读性。
  • 太酷了!谢谢一百万,确实!只是为了让我理解积极的后视有什么问题:你能告诉我为什么它不起作用吗?也就是说,为什么p1 &lt;- "(?&lt;!Q|_D|_P)... and all the rest of the pattern" 不做排除动词前有疑问词、指示词和代词的标记的工作??
  • 您的解决方案也是否定的。您逐位定义所有非极性问题参数,只是为了用filter(!any(is_polar)) 过滤掉这些参数。这种负面过滤的问题在于,问题中呈现的玩具数据只包含少数主要是问题类型/类似问题的数据。相比之下,在实际数据集中,有数以百万计的话语与任何问题类型相去甚远,并且仍然会因为它们不具有非极性特征而被归类为极性问题!
  • 我真的不明白你的意思,因为我必须建立的唯一数据是你给出的例子。疑问词和动词之间是否存在一些距离,使其不再被视为彼此靠近?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2011-10-09
相关资源
最近更新 更多