如何用R提取数据框中单词的字母及二元组构成?
解决思路与代码实现
问题原因分析
你之前的代码未得到正确结果,核心原因是tokens(corp)默认将整个单词作为独立token,而tokens_lookup仅匹配完整token。你的字典定义的是单个字母,自然无法匹配到完整单词的token,因此所有计数都为0。
正确实现步骤
要提取每个单词的字母及二元组构成,需先将单词拆分为单个字母的token,再分别统计单字母和二元组的出现次数,最后合并结果。
1. 加载工具包与数据
library(quanteda) # 示例数据 text <- c("table", "run", "mug")
2. 提取单字母特征
将每个单词拆分为单个字母的token,再统计所有26个字母的出现次数(未出现的补0):
# 拆分单词为单个字母的token toks_chars <- tokens(text, split = "") # 生成单字母计数的dfm dfm_chars <- dfm(toks_chars) # 生成所有小写字母的列表 all_letters <- letters # 确保dfm包含所有26个字母,未出现的字母补0 dfm_chars_full <- dfm_select(dfm_chars, pattern = all_letters, valuetype = "fixed")
3. 提取二元组特征
生成所有可能的二元组(aa到zz),再统计每个单词的二元组出现次数:
# 生成所有26*26=676个可能的二元组 all_bigrams <- expand.grid(letters, letters, stringsAsFactors = FALSE) all_bigrams <- paste0(all_bigrams$Var1, all_bigrams$Var2) # 从单字母token生成二元组token toks_bigrams <- tokens_ngrams(toks_chars, n = 2) # 生成二元组计数的dfm dfm_bigrams <- dfm(toks_bigrams) # 确保dfm包含所有二元组,未出现的补0 dfm_bigrams_full <- dfm_select(dfm_bigrams, pattern = all_bigrams, valuetype = "fixed")
4. 合并结果并格式化
将单字母和二元组的计数矩阵合并,设置行名为原单词:
# 合并两个dfm dfm_final <- cbind(dfm_chars_full, dfm_bigrams_full) # 将行名改为原单词 rownames(dfm_final) <- text # 转换为数据框格式方便查看 as.data.frame(dfm_final)
运行后会得到符合期望的输出:每行对应一个单词,列包含所有字母和二元组,值为该元素在单词中的出现次数。
内容的提问来源于stack exchange,提问作者Oksana Ts.
相关产品推荐
相关产品推荐

