Проблема со словарями из нескольких слов в quanteda с использованием dfm_lookup - PullRequest
0 голосов
/ 12 марта 2020

Я новичок, использующий R и Quanteda, и не могу решить следующую проблему, даже прочитав похожие темы.

У меня есть набор данных, импортированный из Stata, где столбец "text" содержит твиты Из разных групп людей идентифицируется переменная «группа». Я хочу подсчитать вхождения слов, идентифицированных моим словарем на уровне группы, следующим образом:

Вот воспроизводимый пример:

dput(tweets[1:4, ])
structure(list(tweet_id = c("174457180812_10156824364270813", 
"174457180812_10156824136360813", "174457180812_10156823535820813", 
"174457180812_10156823868565813"), tweet_message = c("Climate change is a big issue", 
"We should care about the environment", "Let's rethink environmental policies", 
"#Davos WEF"
), date = c("2019-03-25T23:03:56+0000", "2019-03-25T21:10:36+0000", 
"2019-03-25T21:00:03+0000", "2019-03-25T20:00:03+0000"), group = c("1", 
"2", "3", "4")), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame"))

Сначала я создаю свой словарь:

    climatechange_dict <- dictionary(list(
  climate = c(
    "environment*",
    "climate change")))

Затем я указываю корпус

climate_corpus <- corpus(tweets$tweet_message)

Я создаю dfm для каждой группы:

group1_dfm <- dfm(corpus_subset(climate_corpus, tweets$group == "1"))

И затем я пытаюсь вычислить частоту слов в словаре для каждой группы:

group1_climate <- dfm_lookup(group1_dfm, dictionary = climatechange_dict)
group1 <- subset(tweets, tweets$group == "1")
group1$climatescore <- as.numeric(group1_climate[,1])

group1$climate <- "normal"
group1$climate[group1$climatescore > 0] <- "climate"
table(group1$climate)

Моя проблема заключается в том, что таким образом словарные словари, такие как «изменение климата», не учитываются. Я прочитал онлайн, мне нужно применить tokens_lookup () к токенам, а затем создать dfm, но я не знаю, как это сделать в этом случае. Я был бы очень признателен, если бы вы могли помочь мне в этом. Большое спасибо!

1 Ответ

1 голос
/ 13 марта 2020

Трудно убедиться, что это будет работать, так как вы не предоставляете воспроизводимый пример, но попробуйте это:

climate_corpus <- corpus(tweets, text_field = "tweet_message")

climatechange_dict <- 
    dictionary(list(climate = c("environment*", "climate change")))

groupeddfm <- tokens(climate_corpus) %>%
    tokens_lookup(dictionary = climatechange_dict) %>%
    dfm(groups = "group")

Это делает следующее:

  • создает корпус из вашего tweets data.frame и добавляет другие переменные в виде документов. (Если вы знаете, что является уникальным идентификатором документа, вы также можете указать этот столбец, используя docid_field = "<yourdocidentifier>".)

  • Выполняет ли словарь операцию поиска на токенах, что означает, что вы будете подобрать фразы, как "изменение климата". Этого не происходит с dfm_lookup(), потому что dfm() преобразует токены в «функции», которые больше не имеют записи порядка и поэтому не могут восстанавливать фразы.

  • Объединяет документы в группы по group столбцу tweets. Это устраняет необходимость какой-либо ручной группировки с использованием подмножеств. (Я думаю, это то, что вы хотели, верно?)

В результате dfm будет ngroups x 1, где 1 - это единственный ключ для вашего словаря. Вы можете легко привести это к data.frame или другому формату, используя convert().

...