【发布时间】:2021-02-18 08:44:19
【问题描述】:
我在 quanteda 中发现 tokens_compound() 会更改不同 R 会话中令牌的顺序。也就是说,即使种子值是固定的,每次重新启动会话后结果都会有所不同,尽管它不会在单个会话中改变。
这是复制过程:
- 查找搭配、复合标记并保存它们。
library(quanteda)
set.seed(12345)
data(data_corpus_inaugural)
toks <- data_corpus_inaugural %>%
tokens(remove_punct = TRUE,
remove_symbol = TRUE,
padding = TRUE) %>%
tokens_tolower()
col <- toks %>%
textstat_collocations()
toks.col <- toks %>%
tokens_compound(pattern = col[col$z > 3])
write(attr(toks.col, "types"), "col1.txt")
-
结束并重新启动 R 会话并再次运行上述代码,将“col1.txt”替换为“col2.txt”。
-
比较两组token,发现它们是不同的。
col1 <- read.table("col1.txt")
col2 <- read.table("col2.txt")
identical(col1$V1, col2$V1) # This should return FALSE.
col1$V1[head(which(col1$V1 != col2$V1))]
col2$V1[head(which(col1$V1 != col2$V1))]
这在很多情况下都无关紧要,但 LDA(通过 {topicmodels})的结果会在不同的会话中发生变化。我猜是这样,因为如果我将tokens 中的功能顺序重置为as.list(),然后as.tokens()(dfm_sort() 不适用于此),LDA 的结果是不变的。
我想知道这是否只发生在我身上(Ubuntu 18.04.5、R 4.0.4 和 quanteda 2.1.2),并且很高兴听到另一个(更简单的)解决方案。
2 月 20 日更新
例如,LDA的输出不复现。
lis <- list()
for (i in seq_len(2)) {
set.seed(123)
lis[[i]] <- tokens_compound(toks, pattern = col[col$z > 3]) %>%
dfm() %>%
convert(to = "topicmodels") %>%
LDA(k = 5,
method = "Gibbs",
control = list(seed = 12345,
iter = 100))
}
head(lis[[1]]@gamma)
head(lis[[2]]@gamma)
【问题讨论】:
-
我还看到
identical(col1$V1, col2$V1)在 Windows 10 计算机 quanteda 2.1.2 上返回 FALSE。我认为您可能需要编辑您的标题和帖子。你问的是tokens_compound()还是text_compound()? -
谢谢。这是我的错字(应该是
tokens_compound())。