Quanteda:如何使用 tokens_lookup 将方括号与 glob 样式模式匹配一起使用?
Quanteda: How can I use square brackets with glob-style pattern matching using tokens_lookup?
关于在 R 中使用包 {quanteda}
和 tokens_lookup()
函数以及默认 valuetype="glob"
的模式匹配,我有两个相互关联的问题(参见 here and here)。
假设我想匹配一个德语单词,根据它是单数还是复数,拼写可能会略有不同:"Apfel"(EN:苹果)、“Äpfel”(EN:苹果)。对于复数,我们因此在开头使用变音符号“ä”而不是 "a"。因此,如果我查找标记,我想确保是否在文本中找到水果不取决于我查找的单词是单数还是复数。这是一个非常简单的示例,我知道我也可以构建一个包含“äpfel*”和 "apfel*" 的字典,但我的问题更普遍地是关于方括号等特殊字符的使用。
所以本质上,我认为我可以简单地使用类似于正则表达式模式匹配的方括号:[aä]
。更一般地说,我认为我可以使用 [a-z]
之类的东西来匹配从 a 到 z 的任何单个字母或 [0-9]
来匹配 0 到 9 之间的任何单个数字。事实上,这就是它所说的 here.出于某种原因,none 似乎有效:
library(quanteda)
text <- c(d1 = "i like apples and apple pie",
d2 = "ich mag äpfel und apfelkuchen")
dict_1 <- dictionary(list(fruits = c("[aä]pfel*"))) # EITHER "a" OR "ä"
dict_2 <- dictionary(list(fruits = c("[a-z]pfel*"))) # ANY LETTER
tokens(text) %>%
tokens_lookup(dict_1, valuetype = "glob")
tokens(text) %>%
tokens_lookup(dict_2, valuetype = "glob")
1.) 有没有办法在 glob 模式匹配中完全使用方括号?
2.) 如果是这样,[a-z] 是否也匹配变音符号 (ä,ö,ü) 或者如果不是,我们如何匹配这样的字符?
1) 不,不能将方括号与 glob 模式匹配一起使用。但是,它们与正则表达式模式匹配完美配合。
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 通过重新导出使其可用。
关于在 R 中使用包 {quanteda}
和 tokens_lookup()
函数以及默认 valuetype="glob"
的模式匹配,我有两个相互关联的问题(参见 here and here)。
假设我想匹配一个德语单词,根据它是单数还是复数,拼写可能会略有不同:"Apfel"(EN:苹果)、“Äpfel”(EN:苹果)。对于复数,我们因此在开头使用变音符号“ä”而不是 "a"。因此,如果我查找标记,我想确保是否在文本中找到水果不取决于我查找的单词是单数还是复数。这是一个非常简单的示例,我知道我也可以构建一个包含“äpfel*”和 "apfel*" 的字典,但我的问题更普遍地是关于方括号等特殊字符的使用。
所以本质上,我认为我可以简单地使用类似于正则表达式模式匹配的方括号:[aä]
。更一般地说,我认为我可以使用 [a-z]
之类的东西来匹配从 a 到 z 的任何单个字母或 [0-9]
来匹配 0 到 9 之间的任何单个数字。事实上,这就是它所说的 here.出于某种原因,none 似乎有效:
library(quanteda)
text <- c(d1 = "i like apples and apple pie",
d2 = "ich mag äpfel und apfelkuchen")
dict_1 <- dictionary(list(fruits = c("[aä]pfel*"))) # EITHER "a" OR "ä"
dict_2 <- dictionary(list(fruits = c("[a-z]pfel*"))) # ANY LETTER
tokens(text) %>%
tokens_lookup(dict_1, valuetype = "glob")
tokens(text) %>%
tokens_lookup(dict_2, valuetype = "glob")
1.) 有没有办法在 glob 模式匹配中完全使用方括号?
2.) 如果是这样,[a-z] 是否也匹配变音符号 (ä,ö,ü) 或者如果不是,我们如何匹配这样的字符?
1) 不,不能将方括号与 glob 模式匹配一起使用。但是,它们与正则表达式模式匹配完美配合。
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 通过重新导出使其可用。