【发布时间】:2020-12-21 21:39:44
【问题描述】:
我正在尝试更多地了解 R 中的语料库、单词分析。最近我开始使用 CleanNLP 和 Spacy Backend。问题是,在解析文本后,我想看看一个句子是否有标记有不同关系的标记。
比方说,
library(cleanNLP)
library(tidyverse)
text <- cnlp_annotate(c("I gave him money"))
结果是
doc_id sid tid token token_with_ws lemma upos xpos tid_source relation
<int> <int> <int> <chr> <chr> <chr> <chr> <chr> <int> <chr>
1 1 1 1 I "I " -PRON- PRON PRP 2 nsubj
2 1 1 2 gave "gave " give VERB VBD 0 root
3 1 1 3 money "money " money NOUN NN 2 dobj
4 1 1 4 to "to " to ADP IN 2 dative
5 1 1 5 him "him" -PRON- PRON PRP 4 pobj
我通过
改变了数据框dative <- c("dative")
anno %>%
+ filter(grepl(dative, relation)) %>%
+ select(sid, sentence)
并在上下文前后查找
anno %>%
+ mutate(kwic = ifelse(grepl(dative, relation),
+ TRUE, FALSE)) %>%
+ mutate(before = gsub("NA\\s?", "", paste(lag(token, 3), lag(token, 2), lag(token))),
+ after = gsub("NA\\s?", "", paste(lead(token), lead(token, 2), lead(token, 3)))
+ ) %>%
+ filter(kwic) %>%
+ select(before, token, after)
我想从具有所有三个关系标签 (dobj, dative, pobj) 的语料库中提取句子。换句话说,我想检查上下文前后,如果上下文前后有标签"dobj"和"pobj",则提取句子。
所以基本上,我想提取模式为 Dobj、Dative、Pobj 的句子(带有双宾语的句子;我给了他钱),但不是用一两个变量的模式,我们只说 Dobj;我给了钱还是介词+Pobj;我给了他。
我该怎么做?任何帮助都非常感谢
到目前为止,在@GeoffreyPoole 的大力帮助下,我已经获得了这份名单。对下面的代码进行一些编辑,输出是;
target <- "root dobj dative pobj"
text %>%
select(sid, relation, lemma) %>%
# get rid of any sentences with less than three words...
group_by(sid) %>%
summarize(n = n()) %>%
filter(n >= 4) %>%
left_join(text) %>%
# make sure tokens are in order...
arrange(sid, tid, lemma) %>%
# now, for each sentence...
group_by(sid) %>%
group_modify(
function(x,y,z) {
#paste together each triplet of relations and convert to a dataframe.
rollapply(x[,c("relation", "token")], 4, paste, collapse = " ") %>%
as.data.frame
}
) %>%
# get all unique combinations of sid and pasted triplets
distinct %>%
# select records with the desired pasted triplet
filter(relation == target) %>%
# and pull all of the tokens for associated sentences from text
left_join(text)
sid relation token doc_id tid token_with_ws lemma upos xpos tid_source
<int> <chr> <chr> <int> <int> <chr> <chr> <chr> <chr> <int>
1 949 root dobj dative pobj gives ideas to people NA NA NA NA NA NA NA
2 1242 root dobj dative pobj provided advantages for customers NA NA NA NA NA NA NA
3 1631 root dobj dative pobj give harm to themselves NA NA NA NA NA NA NA
4 2275 root dobj dative pobj say this to us NA NA NA NA NA NA NA
5 3016 root dobj dative pobj write fine to you NA NA NA NA NA NA NA
6 3826 root dobj dative pobj cause problem for society NA NA NA NA NA NA NA
7 4184 root dobj dative pobj gives harm to women NA NA NA NA NA NA NA
只剩下一个问题,我需要编辑target 来查看更多关系吗?例如当target <- "root dobj dative pobj",
结果是
1242 root dobj dative pobj provided advantages for customers
如果实际的句子是,会发生什么
“为
the客户提供优势”
我是否需要将target 重写为"root dobj dative (det) pobj" 才能观察到这些模式?
谢谢。
【问题讨论】:
-
如果您也提供了否定测试,这样可以验证解决方案并且我们可以确保我们只返回您想要的内容,这将有所帮助
-
也许只需要提供
dput(text)的值,这样就不需要安装 cleanNLP/spacy 来测试可能的解决方案。这似乎只是一个数据过滤问题,而不是 cleanNLP 特有的任何问题。 -
嗯,是的,这正是一个数据过滤问题。你能澄清一下“阴性测试”吗?我不确定我是否得到它。
-
否定测试是不应该匹配的句子。也许一个句子只有三分之二。
-
我明白了,我会马上编辑我的文字。