首页 > 解决方案 > 保留从转换过程中删除的行

问题描述

从这个命令

quant_stm <- convert(tDfm, to = "stm")

我收到一条警告消息警告消息:

In dfm2stm(x, docvars, omit_empty = TRUE) :
  Dropped empty document(s): g_32, m_21, g_32, [... truncated]

有什么方法可以将这个警告消息的值保存在数据框中?

标签: rquanteda

解决方案


不是我能想出来的。为什么?因为 stm 的“文档”输入的数据结构没有任何方法可以记录没有特征的文档。

让我们来看看它是如何工作的。首先,我们创建一个包含四个不同特征的三个文档的 dfm,其中一个文档仅包含第四个特征(称为“d”)。

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

dfmat <- dfm(c(
  "a a c c",
  "b b c c",
  "d d d d"
))

现在,如果我们删除该功能,第三个文档现在是空的。这就是上面输出中删除的内容。

(x <- dfm_remove(dfmat, "d"))
## Document-feature matrix of: 3 documents, 3 features (55.6% sparse).
##        features
## docs    a c b
##   text1 2 2 0
##   text2 0 2 2
##   text3 0 0 0

quanteda 内部函数dfm2dtm()中,正在发生的事情是这样的:

x <- x[, order(featnames(x))]
x <- as(x, "dgTMatrix")
structure(quanteda:::ijv.to.doc(x@i + 1, x@j + 1, x@x),
  names = rownames(x)[which(rowSums(x) > 0)]
)
## $text1
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    2
## 
## $text2
##      [,1] [,2]
## [1,]    2    3
## [2,]    2    2

请注意,该对象是 stm 输入的“文档”部分,该结构为每个文档记录一个包含两行的矩阵,其中第一行是“词汇”元素的索引,第二行是计数对于那个词汇元素(特征)。只记录计数非零的词汇元素 - 这就是为什么 text2 中没有第一行为“1”的列(因为 text2 没有“a”特征)。

所以:该方案本身无法记录未找到的内容,如果在文档中找不到任何内容,则将其省略。

请注意,没有真正使用的理由,convert(x, to = "stm")因为该stm()函数可以直接采用 dfm。(searchK()但不能,所以你可能需要它。)


推荐阅读