关于使用包{quanteda}
和带有默认值tokens_lookup()
的valuetype="glob"
函数(请参见here和here)的R中的模式匹配,我有两个相互关联的问题。
假设我想匹配一个德语单词,根据其单数或复数形式,拼写可能会略有不同:“ Apfel”(EN:苹果),“Äpfel”(EN:苹果)。因此,对于复数,我们在开头使用变音符号“ä”而不是“ a”。因此,如果我查找标记,我想确保我是否在文本中找到结果不取决于我所查找的单词是单数还是复数。这是一个非常简单的示例,我知道我也可以构建一个以“äpfel*”和“ apfel *”为特征的字典,但是我的问题通常是关于方括号等特殊字符的使用。
所以本质上,我以为我可以简单地使用方括号,类似于正则表达式模式匹配:[aä]
。更一般地说,我认为我可以使用[a-z]
来匹配从a到z的任何单个字母,或者使用[0-9]
来匹配0到9之间的任何单个数字。事实上,这就是here的含义。由于某些原因,这些似乎都不起作用:
library(quanteda)
library(tidyverse)
text <- c(d1 = "I like apples and apple pie", d2 = "Ich mag Äpfel und Apfelkuchen")
text %>% tokens() %>% tokens_tolower() -> toks
dict_1 <- dictionary(list(fruits = c("[aä]pfel*"))) # EITHER "a" OR "ä"
dict_2 <- dictionary(list(fruits = c("[a-z]pfel*"))) # ANY LETTER
dfm(tokens_lookup(toks, dict_1, valuetype = "glob"))
dfm(tokens_lookup(toks, dict_2, valuetype = "glob"))
1。)是否可以在全局模式匹配中使用方括号?
2。)如果是,[a-z]是否也匹配变音符号(ä,ö,ü),否则,我们如何匹配这样的字符?
1)不,您不能将括号与全局模式匹配一起使用。但是,它们与正则表达式模式匹配完美配合。
2]不,[a-z]不匹配变音符号。
这里是方法,将您的所有问题都剥离掉,而这对于回答问题是不必要的。
library("quanteda")
## Package version: 2.0.1
text <- "Ich mag Äpfel und Apfelkuchen"
toks <- tokens(text)
dict_1 <- dictionary(list(fruits = c("[aä]pfel*")))
dict_2 <- dictionary(list(fruits = c("[a-z]pfel*")))
tokens_lookup(toks, dict_1, valuetype = "regex", exclusive = FALSE)
## Tokens consisting of 1 document.
## text1 :
## [1] "Ich" "mag" "FRUITS" "und" "FRUITS"
tokens_lookup(toks, dict_2, valuetype = "regex", exclusive = FALSE)
## Tokens consisting of 1 document.
## text1 :
## [1] "Ich" "mag" "Äpfel" "und" "FRUITS"
注意:不需要为了获取%>%
就导入所有tidyverse,因为quanteda通过重新导出使它可用。