Да - вам нужно использовать tokens_lookup()
на токенах, прежде чем вы сформируете dfm. После того, как вы токенизировали отдельные слова, они больше не существуют как упорядоченная последовательность, вам нужно соответствовать значениям из нескольких слов в вашем словаре. 1) сформируйте объект токенов, 2) используйте tokens_lookup()
, чтобы применить словарь к токенам, а затем 3) сформируйте dfm.
library("quanteda")
#> Package version: 1.5.2
BritainEN <-
dictionary(list(identity = c("British", "Great Britain")))
txt <- c(doc1 = "Great Britain is a country.",
doc2 = "British citizens live in Great Britain.")
tokens(txt) %>%
tokens_lookup(dictionary = BritainEN, exclusive = FALSE)
#> tokens from 2 documents.
#> doc1 :
#> [1] "IDENTITY" "is" "a" "country" "."
#>
#> doc2 :
#> [1] "IDENTITY" "citizens" "live" "in" "IDENTITY" "."
tokens(txt) %>%
tokens_lookup(dictionary = BritainEN) %>%
dfm()
#> Document-feature matrix of: 2 documents, 1 feature (0.0% sparse).
#> 2 x 1 sparse Matrix of class "dfm"
#> features
#> docs identity
#> doc1 1
#> doc2 2
добавлено
Чтобы ответить на вопрос дополнительного комментария и расширить очень полезный ответ @ phiver на этот вопрос, существует также аргумент nested_scope
, предназначенный для совпадений, которые могут встречаться в пределах значения другого словаря MWE.
Пример:
library("quanteda")
## Package version: 1.5.2
Ireland_nested <- dictionary(list(
ie_alone = "Ireland",
ie_nested = "Northern Ireland"
))
txt <- c(
doc1 = "Northern Ireland is a country.",
doc2 = "Some citizens of Ireland live in Northern Ireland."
)
toks <- tokens(txt)
tokens_lookup(toks, dictionary = Ireland_nested, exclusive = FALSE)
## Tokens consisting of 2 documents.
## doc1 :
## [1] "IE_NESTED" "IE_ALONE" "is" "a" "country" "."
##
## doc2 :
## [1] "Some" "citizens" "of" "IE_ALONE" "live" "in"
## [7] "IE_NESTED" "IE_ALONE" "."
tokens_lookup(toks,
dictionary = Ireland_nested, nested_scope = "dictionary",
exclusive = FALSE
)
## Tokens consisting of 2 documents.
## doc1 :
## [1] "IE_NESTED" "is" "a" "country" "."
##
## doc2 :
## [1] "Some" "citizens" "of" "IE_ALONE" "live" "in"
## [7] "IE_NESTED" "."
Первый соответствует обеим клавишам, поскольку уровень вложенности находится только внутри ключа, но шаблон вложенности встречается в двух разных ключах. (В @ phiver шаблоны были вложены в ключ, в моем примере это не так.) Если nested_scope = "dictionary"
, то поиск вложенных шаблонных совпадений выполняется по всему словарю, а не только по ключу, поэтому в моем примере он не дублируется.
То, что вы выберете, зависит от вашей цели. Мы разработали quanteda , чтобы иметь значения по умолчанию, которые ожидают и ожидают большинство пользователей, но добавили дополнительные опции, подобные этой, для тех, у кого есть конкретные потребности c. (И обычно эти потребности сначала выражаются Кохеем или мной, работающим над конкретным c нашим вариантом использования!)