Quanteda: Как найти образцы из двух или более слов во фразе, если между ними может быть любое количество слов? - PullRequest
0 голосов
/ 28 мая 2020

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

library(quanteda)

text <- c(d1 = "apples word word word oranges", 
          d2 = "apples oranges", 
          d3 = "oranges and apples")

dict <- dictionary(list(fruits = c("apple* orange*")))

tokens(text) %>% 
  tokens_lookup(dict, valuetype = "glob") %>% 
  dfm()

Применение этого словаря к токенизированному тексту сверху приведет к результату 0-1-0 , в то время как я ожидал бы 1-1-0.

Итак, мой вопрос был бы в том, что с пробелами в сопоставлении с шаблоном глобуса и не должны ли звездочки соответствовать всему, включая пробелы? В более общем плане, как я могу сопоставить d1, d2 и, возможно, d3 с одним и тем же шаблоном?

EDIT:

При сопоставлении с шаблоном регулярного выражения это не будет большая проблема. Пример:

text <- c(d1 = "apples word word word oranges", 
          d2 = "apples oranges")

dict <- dictionary(list(fruits = c("apples.*oranges")))

tokens(text, what="sentence") %>%
  tokens_lookup(dict, valuetype = "regex") %>%
  dfm()

1 Ответ

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

tokens() сегментов на пробелах, а tokens_lookup() находит шаблоны в токенах - или в последовательностях токенов, если шаблон содержит пробелы в вашем словарном значении. Чтобы использовать соответствие glob для получения любого токена между еще двумя конкретными шаблонами c, вы можете указать * в качестве этой части шаблона. (Технически шаблоны с пробелами разбираются на последовательности, называемые «фразами» квантового языка. См. ?phrase.)

Итак, немного изменим ваш пример:

library("quanteda")
## Package version: 2.0.1

text <- c(
  d1 = "apples word word oranges",
  d2 = "apples and oranges",
  d3 = "oranges and apples"
)

dict <- dictionary(list(fruits = c(
  "apple* * orange*",
  "apple* * * orange*"
)))

tokens(text) %>%
  tokens_lookup(dict, valuetype = "glob", exclusive = FALSE)
## Tokens consisting of 3 documents.
## d1 :
## [1] "FRUITS"
## 
## d2 :
## [1] "FRUITS"
## 
## d3 :
## [1] "oranges" "and"     "apples"

Здесь мы получить образец apple*, за которым следует один из любых токенов или два любого токена, за которыми следует orange*.

Это не возьмет «апельсин», за которым следует «яблоко», однако, поскольку это обратная последовательность, и не будет забирать только «яблочный апельсин», поскольку между их. (Но вы можете добавить этот случай, добавив третье значение к ключу fruits как просто «яблоко * апельсин *».)

...