我的问题涉及在量化dfm中修剪/选择术语,这是基于先前的知识,即通常每个文档中只有一个术语对确定正确的标签很重要。有多种工具可用于修剪或选择,但似乎没有一种能满足我的需要,因为它们似乎没有考虑到产生的标签。如果我试图重新发明轮子,请指导我正确的方法,但除此之外,这里有一个小数据集,其中解释了我想要使用的机制,以获得我的术语列表(然后我可以将其应用于dfm_select的起始dfm(
启动dfm看起来是这样的(为了简单起见,data.frame(。t1…t6是出现的术语的名称,并且每个频率是1或0
my_dfm <- data.frame(t1=c(0,0,0,1,0,0), t2=c(0,1,1,0,0,0), t3=c(1,1,1,0,0,0), t4=c(0,0,1,1,1,0),t5=c(1,0,0,0,1,1))
my_dfm
# t1 t2 t3 t4 t5
# 1 0 0 1 0 1
# 2 0 1 1 0 0
# 3 0 1 1 1 0
# 4 1 0 0 1 0
# 5 0 0 0 1 1
# 6 0 0 0 0 1
标签不会被分组,但为了清楚起见,本例中的被分组在一起
my_labels <- data.frame(my_labels=c('a','a','a','b','b','b'))
my_labels
# my_labels
# 1 a
# 2 a
# 3 a
# 4 b
# 5 b
# 6 b
我想应用于修剪我的dfm的规则是,对于每个唯一标签{a,b},只选择足够的唯一术语,以确保每个文档{1..6}至少有一个匹配术语,并优先考虑在每组文档中出现最多的术语。因此,在本例中,对于标签a和b,总数看起来像这个
# a freq totals
c(0,2,3,1,1)
# 0 2 3 1 1
#
# b freq totals
c(1,0,0,2,2)
# 1 0 0 2 2
在这一点上,我需要确定哪些条款符合规则。对于标签a,t3满足所有三个文档,并且对于标签b,t4和t5组合满足相应的三个文档
# a_keep
c(0,0,1,0,0)
# 0 0 1 0 0
#
# b_keep
c(0,0,0,1,1)
# 0 0 0 1 1
重叠的";保持";矢量看起来像这样:
# keep
c(0,0,1,1,1)
# 0 0 1 1 1
所以我现在可以将其应用于我的dfm,并且只保留t3、t4、t5
我可以通过几个循环看到这样做的方法,但还没有尝试。逻辑:对于每个标签,计算术语freqs。然后从最高总术语开始,检查是否每个文档都被考虑在内,如果没有,则添加下一个最高频率术语,以此类推,直到所有文档都被计算在内。然后保留合并后的术语集(。不过,我想发现的是,实际上已经有一个dfm函数可以做到这一点,或者用一种比我在逻辑描述的中想象的更简单的方法来处理代码
有趣的问题:您希望将文档频率最高的特性保留在组中。我会通过按组划分dfm,然后使用非常通用的dfm_trim()
函数和排序文档频率过滤来实现这一点。
要将你的dfm设置为dfm,并添加一个文档变量:
library("quanteda")
## Package version: 2.1.1
# set up dfm
dfmat <- as.dfm(data.frame(
t1 = c(0, 0, 0, 1, 0, 0),
t2 = c(0, 1, 1, 0, 0, 0),
t3 = c(1, 1, 1, 0, 0, 0),
t4 = c(0, 0, 1, 1, 1, 0),
t5 = c(1, 0, 0, 0, 1, 1)
))
dfmat$labels <- c("a", "a", "a", "b", "b", "b")
现在将dfm分为不同的组,并选择排名最高的组。(要更改此项,请更改min_docfreq
值。(
# chooses the top document frequency by group
tokeep <- lapply(unique(dfmat$labels), function(x) {
dfm_subset(dfmat, labels == x) %>%
dfm_trim(min_docfreq = 1, docfreq_type = "rank")
})
结果按组显示,使用rbind()
可以很容易地重新组合。
tokeep
## [[1]]
## Document-feature matrix of: 3 documents, 1 feature (0.0% sparse) and 1 docvar.
## features
## docs t3
## 1 1
## 2 1
## 3 1
##
## [[2]]
## Document-feature matrix of: 3 documents, 2 features (33.3% sparse) and 1 docvar.
## features
## docs t4 t5
## 4 1 0
## 5 1 1
## 6 0 1
# make back into a single dfm
do.call(rbind, tokeep)
## Document-feature matrix of: 6 documents, 3 features (61.1% sparse).
## features
## docs t3 t4 t5
## 1 1 0 0
## 2 1 0 0
## 3 1 0 0
## 4 0 1 0
## 5 0 1 1
## 6 0 0 1