我正在使用词典来搜索语料库中出现的术语,这些术语可能会单独出现,尽管它们经常会重叠:
corpus <- c("According to the Canadian Charter of Rights and Freedoms, all Canadians...")
dict <- dictionary(list(constitution = c("charter of rights", "canadian charter")))
kwic(corpus, dict)
以上内容(正确地)两次标识了以下句子:
"According to the Canadian Charter of Rights and Freedoms, all Canadians..."
但是,为了确定出现这些术语的频率,并避免重复计算,我需要确保仅在出现“加拿大宪章”一词的情况下才对它进行计数。的权利...”
我该怎么做?
编辑:刚刚注意到,如果使用tokens_lookup
,这不是问题,所以这个问题是一个静默点。保留它以防对其他人有帮助。
答案 0 :(得分:1)
当您要求kwic
时,即使它们重叠,也会获得所有模式匹配。因此,按照我认为您要求的那样,避免重叠的方法是将多字表达式(MWE)手动转换为单个标记,以防止它们重叠。在您的情况下,您要在不包含“权利”的情况下计算“加拿大宪章”。然后,我建议您标记文本,然后以确保它们不会重叠的顺序混合MWE。
library("quanteda", warn.conflicts = FALSE)
## Package version: 1.4.0
## Parallel computing: 2 of 12 threads used.
## See https://quanteda.io for tutorials and examples.
txt <- "The Canadian charter of rights and the Canadian charter are different."
dict <- dictionary(list(constitution = c("charter of rights", "canadian charter")))
toks <- tokens(txt)
tokscomp <- toks %>%
tokens_compound(phrase("charter of rights"), concatenator = " ") %>%
tokens_compound(phrase("Canadian charter"), concatenator = " ")
tokscomp
## tokens from 1 document.
## text1 :
## [1] "The" "Canadian" "charter of rights"
## [4] "and" "the" "Canadian charter"
## [7] "are" "different" "."
这已将词组变成单个标记,在此处以空格分隔,这意味着在kwic()
(如果您要使用的是)中,它们不会重复计算,因为它们现在是唯一的MWE匹配。
kwic(tokscomp, dict, window = 2)
##
## [text1, 3] The Canadian | charter of rights | and the
## [text1, 6] and the | Canadian charter | are different
请注意,仅是为了对它们进行计数,您可以将dfm()
与字典一起用作select
参数的值:
dfm(tokscomp, select = dict)
## Document-feature matrix of: 1 document, 2 features (0.0% sparse).
## 1 x 2 sparse Matrix of class "dfm"
## features
## docs charter of rights canadian charter
## text1 1 1
最后,如果您主要是想将“加拿大权利宪章”与“加拿大宪章”区分开,则可以先将前者和后者进行混合(最好长到最短)。但这不完全是您的要求。