quanteda: создание выходных данных для нескольких целей с использованием texttat_keyness аналогично texttat_frequency - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть корпус с 2 переменными документа: группа и интерес.

Я заинтересован в определении ключевых функций для данной комбинации интересов и группы (цели) по сравнению с остальной частью корпуса, используя тексты text_at_keyness и I хочу повторить это для любой возможной комбинации интересов и групп.

Я легко могу сделать это один раз следующим образом:

data_trim@docvars$focus <- 0 
data_trim@docvars$focus[data_trim@docvars$group=="One of the Groups" 
& data_trim@docvars$interest=="One of the interests"] <- 1 #I created the


keyness <- dfm(data_trim, groups = "focus")
k_sustainability <- textstat_keyness(keyness, target ="1")

однако я хотел бы найти простой способ произвести результаты для любых возможных комбинаций группы и цели без необходимости делать это вручную.

Я знаю, что функция textstat_frequency позволяет мне выбирать группы = c ("группа", "интерес") и производит вывод с наиболее часто встречающимися словами для любой комбинации «группа» и «интерес». Есть ли способ сделать то же самое с texttat_keyness?

(я показываю пример того, как выглядит вывод texttat_frequency выглядит так)

textstat_frequency(dt_tfidf, n = 20, groups = c("group", "interest"), force=TRUE)

feature     frequency   rank      docfreq      group
 ...          ...        1          ..         group1 & interest1
                         2                     group1 & interest1
                         3                     group1 & interest1
                         .                     ....
                         .
                         1                     group2 & interest1
                         2                     group2 & interest1
                         .                      .
                         .
                         18                     group100 & interest100
                         19                     group100 & interest100
                         20                     group100 & interest100      

, поэтому я хочу что-то подобное, используя texttat_keyness для получения что-то вроде этого (т. е. наличие 20 лучших функций для подсчета очков и соответствующая группа, идентифицируемая по рангу и группе столбцов, как у меня в texttat_frequency):

feature    chi2         p           n_target        n_reference rank    group
 ...         ..             .. ...      ..           ...          1.    group1 & interest1
  ....

1 Ответ

1 голос
/ 08 февраля 2020

textstat_keyness() определяет ключевые слова, наиболее связанные с целевым «документом» из dfm, по сравнению со всеми другими документами. Таким образом, для сравнения комбинаций вам необходимо сначала создать сгруппированный dfm в соответствии с комбинацией ваших групп. Затем вы можете l oop через dfm и создать сравнение для каждой группы со всеми остальными.

Вот как это сделать:

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

docvars(data_corpus_irishbudget2010, "govopp") <-
  ifelse(docvars(data_corpus_irishbudget2010, "party") %in% c("FF", "Green"),
    "Government", "Opposition"
  )
dfmatgr <- dfm(data_corpus_irishbudget2010, groups = c("govopp", "party"))
head(dfmatgr, nf = 5)
## Document-feature matrix of: 5 documents, 5 features (16.0% sparse) and 4 docvars.
##                   features
## docs               when  i presented the supplementary
##   Government.FF       9 90         1 933             7
##   Opposition.FG      19 42         1 802             1
##   Government.Green    9 33         0 224             0
##   Opposition.LAB     25 76         0 856             0
##   Opposition.SF      28 31         1 783             2

Это создает группы, которые в это дело правительства, оппозиции и партии. (Ваш пример может иметь перекрывающиеся группы, но, поскольку я не могу воспроизвести его, я использовал пример от одной из встроенных корпораций.)

Теперь мы создаем data.frame и l oop через цели , Для презентации я записал только 2 верхних ключевых слова, но вы можете изменить это значение на 20 или любое другое.

df <- data.frame()
for (g in docnames(dfmatgr)) {
  df_temp <- head(textstat_keyness(dfmatgr, target = g), 2)
  df_temp[["target"]] <- g
  df <- rbind(df, df_temp)
}

df
##         feature      chi2            p n_target n_reference           target
## 1          2010  59.14626 1.465494e-14       41          14    Government.FF
## 2        scheme  51.30431 7.910339e-13       31           8    Government.FF
## 11    taoiseach 116.89154 0.000000e+00       49          18    Opposition.FG
## 21          not  39.15371 3.917181e-10      127         259    Opposition.FG
## 12 enterprising 102.69108 0.000000e+00        9           0 Government.Green
## 22           we  67.76028 2.220446e-16       97         521 Government.Green
## 13       fianna  66.59467 3.330669e-16       47          25   Opposition.LAB
## 23         fáil  65.23011 6.661338e-16       44          22   Opposition.LAB
## 14        state  59.81864 1.043610e-14       42          32    Opposition.SF
## 24         care  32.97959 9.313121e-09       18          10    Opposition.SF

Примечание: Я настоятельно не рекомендую обращаться к документам, используя, например, data_trim@docvars$focus - используйте docvars() вместо этого, так как это всегда будет работать. Если мы изменим структуру объекта, ваш код сломается. (А в готовящейся версии 2 мы предоставляем доступ к документам, используя $.)

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