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’
我运行一篇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,以便我们将它们注册为特征,因为 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()
让我们创建一个辅助函数来从字符向量创建字典:
# 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’