You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:43:17