получить, какой процент документов содержит функцию - quanteda - PullRequest
1 голос
/ 21 октября 2019

Я пытаюсь понять, какой% документов содержит функцию, использующую quanteda. Я знаю, что dfm_weight() доступен, но я полагаю, что функция «prop» просматривает частоту функций в документе, а не в разных документах.

Моя цель состоит в том, чтобы не делать оператор ifelse идержите все это в quanteda, но я не уверен, что это возможно. Вывод, который я ищу, представляет собой линейную гистограмму, сгруппированную по годам, которая имеет особенности по оси Y и процент встречаемости в документах по оси X. В таком случае интерпретация будет выглядеть следующим образом: «В 20% всех комментариев в 2018 году люди упоминают слово X, по сравнению с 24% в 2019 году».

library(quanteda)
library(reshape2)
library(dplyr)

df$rownum = 1:nrow(df) # unique ID
dfCorp19 = df %>%
  corpus(df, text_field = 'WhatPromptedYourSearch', docid_field = 'rownum')

x = dfm(dfCorp19,
        remove=c(stopwords(), toRemove),
        remove_numbers = TRUE,
        remove_punct = TRUE) %>%
    textstat_frequency(groups ='year') 

x = x %>% group_by(group) %>% mutate(prop = ifelse(group=='2019', docfreq/802, docfreq/930))
x = dcast(x,feature ~ group, value.var='prop')

1 Ответ

3 голосов
/ 21 октября 2019

Вот попытка использовать некоторые демонстрационные данные, где группа - декада.

library("quanteda")
#> Package version: 1.5.1

docvars(data_corpus_inaugural, "decade") <-
    floor(docvars(data_corpus_inaugural, "Year") / 10) * 10

dfmat <- dfm(corpus_subset(data_corpus_inaugural, decade >= 1970))

target_word <- "nuclear"

Теперь мы можем просто извлечь data.frame для целевой функции. Обратите внимание на функцию rowSums(), поскольку в противном случае любой срез dfm по-прежнему является dfm (а не вектором).

df <- data.frame(docname = docnames(dfmat),
                 decade = docvars(dfmat, c("decade")),
                 contains_target = rowSums(dfmat[, "nuclear"]) > 0,
                 row.names = NULL)
df
#>         docname decade contains_target
#> 1    1973-Nixon   1970            TRUE
#> 2   1977-Carter   1970            TRUE
#> 3   1981-Reagan   1980           FALSE
#> 4   1985-Reagan   1980            TRUE
#> 5     1989-Bush   1980           FALSE
#> 6  1993-Clinton   1990           FALSE
#> 7  1997-Clinton   1990            TRUE
#> 8     2001-Bush   2000           FALSE
#> 9     2005-Bush   2000           FALSE
#> 10   2009-Obama   2000            TRUE
#> 11   2013-Obama   2010           FALSE
#> 12   2017-Trump   2010           FALSE

При этом легко суммировать пропорции и наносить их на график с использованием некоторого dplyr и ggplot2 .

library("dplyr")
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
df2 <- df %>%
    group_by(decade) %>%
    summarise(n = n()) %>%
    mutate(freq = n / sum(n))

library("ggplot2")
g <- ggplot(df2, aes(y = freq, x = decade)) +
    geom_bar(stat = "identity") +
    coord_flip() +
    xlab("") + ylab("Proportion of documents containing target word")
g

Создано в 2019-10-21 с помощью пакета Представить (v0.3.0)

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