Quanteda:如何从单词列表中创建具有相同特征的 dfms

Quanteda: how to create identically-featured dfms from a list of words

我运行一篇n-gram矩阵上的randomforest文章,因为我想把它分为2类。作为 RF 的结果,我收到了一份重要变量列表。

现在我想 运行 随机森林仅在选定的前 n 个特征上,然后使用相同的特征来预测新的分类。为了那个原因 我只需要为最重要的变量(来自 RF)创建 dfm。 我如何根据这些重要变量的列表创建字典?

代码的相关部分...创建字典后我只有一个条目。如何正确创建它?

forestModel <-
  randomForest(x =  as.matrix(myStemMat),y=as.factor(classVect),
               ntree = 1000 )

impVariables <-
  data.frame(important = as.matrix(importance(forestModel)))

impVariables <-
  impVariables %>% mutate(impVar = row.names(impVariables)) %>% 
  arrange(desc(MeanDecreaseGini)) %>% 
  top_n(1000, wt = MeanDecreaseGini) %>% 
  select(impVar) %>% as.list() %>% dictionary()

myStemMat <-
  dfm(
    mycorpus,
    dictionary=impVariables,
    #   remove = stopwordsPL,
    stem = TRUE,
    remove_punct = TRUE,
    ngrams=c(1,2)
  )

简而言之,当我有一个字符串列表、单词列表、n-gram 列表时,如何创建一个字典以便我可以在 dfm() 函数中使用它来生成术语矩阵?

这里有一个link来完成代码"reproducible example"和它使用的数据。 https://www.dropbox.com/s/3oe1tcfcauer0wf/text_data.zip?dl=0

你应该仔细阅读 ?dictionary,因为这不是设计为特征 selection 的集合(尽管它可以是),而是在其中创建等价 类分配给字典键的值。

如果您的 impVariables 是特征的特征向量,那么您应该能够使用这些命令来执行您想要的 select离子:

toks <- 
    tokens(mycorpus, remove_punct = TRUE) %>%
    tokens_select(impVariables, padding = TRUE) %>%
    tokens_wordstem() %>%
    tokens_ngrams(n = 1:2)

dfm(toks)

最后一条命令生成的文档特征矩阵仅包含词干化的 ngram 特征,这些特征在随机森林模型的顶级特征中 selected。请注意,padding = TRUE 将防止在您的原始文本中形成从不相邻的 ngram。如果您不关心它,请将其设置为 FALSE(默认值)。

已添加:

从select离子词的字符向量到select dfm的列,这里有两种我们可以使用的方法。

我们将使用这些示例对象:

# two sample texts and their dfm representations
txt1 <- c(d1 = "a b c f g h",
          d2 = "a a c c d f f f")
txt2 <- c(d1 = "c c d f g h",
          d2 = "b b d i j")
(dfm1 <- dfm(txt1))
# Document-feature matrix of: 2 documents, 7 features (28.6% sparse).
# 2 x 7 sparse Matrix of class "dfmSparse"
#     features
# docs a b c f g h d
#   d1 1 1 1 1 1 1 0
#   d2 2 0 2 3 0 0 1

(dfm2 <- dfm(txt2))
# Document-feature matrix of: 2 documents, 8 features (43.8% sparse).
# 2 x 8 sparse Matrix of class "dfmSparse"
#     features
# docs c d f g h b i j
#   d1 2 1 1 1 1 0 0 0
#   d2 0 1 0 0 0 2 1 1

impVariables <- c("a", "c", "e", "z")

第一种方法:使用 dfm_select()

创建 dfm 和 select

在这里,我们根据特征的特征向量创建一个 dfm,以便我们将它们注册为特征,因为 dfm_select() 在 selection 对象是一个 dfm.

impVariablesDfm <- dfm(paste(impVariables, collapse = " "))
dfm_select(dfm1, impVariablesDfm)
# Document-feature matrix of: 2 documents, 4 features (50% sparse).
# 2 x 4 sparse Matrix of class "dfmSparse"
#     features
# docs a c e z
#   d1 1 1 0 0
#   d2 2 2 0 0

dfm_select(dfm2, impVariablesDfm)
# Document-feature matrix of: 2 documents, 4 features (87.5% sparse).
# 2 x 4 sparse Matrix of class "dfmSparse"
#     features
# docs a c e z
#   d1 0 2 0 0
#   d2 0 0 0 0

第二种方法:使用dfm_lookup()

创建字典并select

让我们创建一个辅助函数来从字符向量创建字典:

# make a dictionary where each key = its value
char2dictionary <- function(x) {
    result <- as.list(x)  # make the vector into a list
    names(result) <- x
    dictionary(result)
}

现在使用 dfm 查找,我们只得到键,即使是没有观察到的键:

dfm_lookup(dfm1, dictionary = char2dictionary(impVariables))
# Document-feature matrix of: 2 documents, 4 features (50% sparse).
# 2 x 4 sparse Matrix of class "dfmSparse"
#     features
# docs a c e z
#   d1 1 1 0 0
#   d2 2 2 0 0

dfm_lookup(dfm2, dictionary = char2dictionary(impVariables))
# Document-feature matrix of: 2 documents, 4 features (87.5% sparse).
# 2 x 4 sparse Matrix of class "dfmSparse"
#     features
# docs a c e z
#   d1 0 2 0 0
#   d2 0 0 0 0

注意:(但第一个至少适用于 v0.9.9.65):

packageVersion("quanteda")
# [1] ‘0.9.9.85’