Quanteda: Как использовать квадратные скобки для сопоставления шаблонов в стиле глобуса с помощью tokens_lookup? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть два взаимосвязанных вопроса относительно сопоставления с образцом в R с использованием пакета {quanteda} и функции tokens_lookup() со значением по умолчанию valuetype="glob" (см. здесь и здесь ).

Скажем, я хотел сопоставить немецкое слово, которое можно писать немного по-разному в зависимости от того, единственное оно или множественное: «Apfel» (EN: яблоко), «Äpfel» (EN: яблоки). Таким образом, для множественного числа мы используем умляут «ä» вместо «а» в начале. Поэтому, если я ищу фишки, я хочу убедиться, что нахожу я фрукты в тексте или нет, не зависит от того, является ли слово, которое я ищу, единственным или множественным. Это очень простой пример, и я знаю, что с таким же успехом могу создать словарь, в котором есть «äpfel *» и «apfel *», но мой вопрос в более общем плане касается использования специальных символов, таких как квадратные скобки.

По сути, я подумал, что могу просто go с квадратными скобками аналогично сопоставлению с образцом регулярного выражения: [aä]. В общем, я подумал, что могу использовать такие вещи, как [a-z], чтобы соответствовать любой отдельной букве от a до z или [0-9], чтобы соответствовать любому единственному числу от 0 до 9. Фактически, это то, что написано здесь . По какой-то причине ничего из этого не работает:

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.) Есть ли способ вообще использовать квадратные скобки при сопоставлении с шаблоном глобуса?

2.) Если да, [az] также будет соответствовать умляутам (ä, ö, ü), а если нет, как мы можем сопоставить такие символы?

1 Ответ

1 голос
/ 28 мая 2020

1) Нет, вы не можете использовать скобки с шаблоном подстановки. Однако они отлично работают с сопоставлением шаблонов регулярных выражений.

2) Нет, [az] не будет соответствовать умляутам.

Вот как это сделать, убрав из вашего вопроса все, что не обязательно к ответу на вопрос.

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"

Примечание. Нет необходимости импортировать всю тидиверсию только для того, чтобы получить %>%, поскольку quANTa делает это доступным через реэкспорт.

...