R语言组合字母结果验证及内存优化问题咨询
问题1:加载德语词典并校验生成的字母组合
方法1:使用现成R包词典
借助qdapDictionaries包自带的德语单词集合,步骤如下:
- 安装并加载包:
install.packages("qdapDictionaries") library(qdapDictionaries)
- 获取德语词典:
german_dict <- qdapDictionaries::german
- 将组合合并为单词并匹配词典:
letters <- c("a","g","t") sum_3 <- expand.grid(letters, letters, letters, stringsAsFactors = FALSE) # 把每行的三个字母合并成完整单词 sum_3$word <- apply(sum_3, 1, paste, collapse = "") # 筛选出词典中存在的单词(会包含"tag") valid_words <- sum_3$word[sum_3$word %in% german_dict] print(valid_words)
方法2:加载本地词典文件
如果有本地德语词典(每行一个单词的.txt文件),直接读取即可:
# 读取本地词典文件 german_dict <- readLines("path/to/your/german_dictionary.txt") # 后续校验步骤与上述一致
问题2:拆分笛卡尔积生成,避免内存耗尽
当字母数量和维度n增大时,expand.grid会生成指数级组合,直接生成全部会导致内存溢出,推荐两种优化思路:
思路1:逐步过滤有效单词,减少后续组合数
不用一次性生成所有维度的组合,从1维开始,每次生成下一个维度的组合后立即过滤无效单词,只保留有效前缀继续迭代:
letters <- c("a","g","t","x","y") n <- 4 german_dict <- qdapDictionaries::german # 初始化:先保留单个字母中的有效单词 valid_words <- letters[letters %in% german_dict] # 迭代生成更高维度的组合 for (i in 2:n) { # 生成当前有效单词与字母的所有组合,合并成新单词 temp <- expand.grid(valid_words, letters, stringsAsFactors = FALSE) temp$new_word <- paste(temp$Var1, temp$Var2, sep = "") # 过滤出词典中存在的单词 valid_words <- unique(temp$new_word[temp$new_word %in% german_dict]) # 无有效单词时提前终止循环 if (length(valid_words) == 0) break } # 最终得到n维的有效单词 print(valid_words)
思路2:分批次生成组合,处理后释放内存
如果必须生成全部组合,用迭代器分批次生成,每处理一批就丢弃无用数据,避免一次性占用大量内存:
library(iterators) letters <- c("a","g","t","x","y") n <- 4 chunk_size <- 1000 # 每次处理的组合数量 german_dict <- qdapDictionaries::german # 创建笛卡尔积迭代器,不会一次性生成所有组合 iter <- iproduct(rep(list(letters), n)) valid_words <- c() while (hasNext(iter)) { # 读取一批组合 batch <- lapply(1:chunk_size, function(x) if (hasNext(iter)) nextElem(iter) else NULL) batch <- Filter(Negate(is.null), batch) # 合并成单词 batch_words <- sapply(batch, paste, collapse = "") # 筛选有效单词并追加到结果 valid <- batch_words[batch_words %in% german_dict] valid_words <- c(valid_words, valid) } print(valid_words)
内容的提问来源于stack exchange,提问作者TomTe
相关产品推荐
相关产品推荐

