Quanteda dfm_lookup с использованием словарей с шаблонами / выражениями из нескольких слов - PullRequest
0 голосов
/ 23 января 2020

Я использую словарь для определения использования определенного набора слов в корпусе. Я включил шаблоны из нескольких слов в словарь, однако я не думаю, что dfm_lookup (из пакета quanteda) соответствует выражениям из нескольких слов. Кто-нибудь знает, как сделать то же самое, что и dfm_lookup со словарем, содержащим выражения из нескольких слов?

library(quanteda)

BritainEN <- 
  dictionary(list(identity=c("British", "Great Britain")))


British <- dfm_lookup(debate_dfm,
                       BritishEN,case_insensitive=T)

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Чтобы ответить на ваш вопрос в комментарии:

Как это работает, если в словаре есть слово, которое затем также появляется в выражении из нескольких слов в словаре

Если текст содержит «Северную Ирландию», а словарь содержит как «Северная Ирландия», так и «Ирландия», он будет учитываться только один раз, но ТОЛЬКО ЕСЛИ оба значения находятся в одной и той же словарной группе, как в Briti sh пример в ответе Кена.

См. Примеры ниже для различий.

Пример комбинированного словаря:

library("quanteda")

Ireland_combined <- 
  dictionary(list(identity = c("Ireland", "Northern Ireland")))

txt <- c(doc1 = "Northern Ireland is a country.",
         doc2 = "Some citizens of Ireland live in Northern Ireland.")

tokens(txt) %>%
  tokens_lookup(dictionary = Ireland_combined , exclusive = FALSE)

# tokens from 2 documents.
# doc1 :
# [1] "IDENTITY" "is"       "a"        "country"  "."       
#
# doc2 :
# [1] "Citizens" "of"       "IDENTITY" "live"     "in"       "IDENTITY" "."  


tokens(txt) %>%
  tokens_lookup(dictionary = Ireland_combined ) %>%
  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

Пример отдельных словарных статей:

Ireland_seperated <- 
  dictionary(list(identity1 = c("Ireland"),
                  identity2 = "Northern Ireland"))

tokens(txt) %>%
  tokens_lookup(dictionary = Ireland_seperated , exclusive = FALSE)

# tokens from 2 documents.
# doc1 :
# [1] "IDENTITY2" "IDENTITY1" "is"        "a"         "country"   "."        
# 
# doc2 :
# [1] "Citizens"  "of"        "IDENTITY1" "live"      "in"        "IDENTITY2" "IDENTITY1" "."      

tokens(txt) %>%
  tokens_lookup(dictionary = Ireland_seperated ) %>%
  dfm()

# Document-feature matrix of: 2 documents, 2 features (0.0% sparse).
# 2 x 2 sparse Matrix of class "dfm"
#       features
# docs   identity1 identity2
#   doc1         1         1
#   doc2         2         1
2 голосов
/ 23 января 2020

Да - вам нужно использовать 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 нашим вариантом использования!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...