基于R语言Jaro-Winkler模糊匹配的文本挖掘问题求助
搞定R语言拼写错误的距离匹配问题
嘿,作为R新手能想到用Jaro-Winkler距离来检测拼写错误,思路超对!我来帮你理清当前代码的问题,再给你一套能得到完整匹配结果的方案~
先搞懂你当前代码的问题
你之前运行的jarowinkler(notes$word, terms$word)之所以返回10个得分,是因为R的循环回收机制:notes$word有10个元素,terms$word只有5个,R会自动把terms$word重复一遍,变成10个元素,然后逐位置配对计算——也就是:
- notes第1个单词 ↔ terms第1个单词
- notes第2个单词 ↔ terms第2个单词
- ...
- notes第5个单词 ↔ terms第5个单词
- notes第6个单词 ↔ terms第1个单词(循环开始)
- ...
- notes第10个单词 ↔ terms第5个单词
这根本不是你想要的「每个note单词和所有term单词逐一比对」,所以得分结果的逻辑完全不对,而且subset后的结果也缺失了对应的term信息。
正确实现思路:生成所有配对再计算
要实现「每个note单词和所有term单词比对,筛选高分匹配」,核心是先生成两个数据框的笛卡尔积(所有可能的配对),再计算每对的距离得分,最后筛选符合阈值的结果。
第一步:先构造你的示例数据(方便复现)
先把你给的示例数据写成可运行的R代码:
# 构造notes数据框 notes <- data.frame( NoteID = c(1,2,3,4,5,6,7,8,9,10), word = c("hit", "hot", "shirt", "than", "thought", "hat", "get", "shirt", "than", "tough"), stringsAsFactors = FALSE ) # 构造terms数据框 terms <- data.frame( Category = c("a", "b", "a", "d", "c"), word = c("hot", "got", "shot", "that", "though"), stringsAsFactors = FALSE )
第二步:生成所有配对并计算得分
用tidyr::crossing生成所有配对,再用stringdist::jarowinkler计算每对的得分:
# 加载需要的包(如果没装先运行 install.packages(c("stringdist", "dplyr", "tidyr"))) library(stringdist) library(dplyr) library(tidyr) # 生成所有note和term的组合,并重命名重复的word列避免混淆 all_pairs <- crossing(notes, terms, .name_repair = "unique") %>% rename(note_word = word...2, term_word = word...4) %>% # 计算每对的Jaro-Winkler得分 mutate(jw_score = jarowinkler(note_word, term_word))
第三步:筛选符合阈值的匹配结果
现在就能轻松筛选出得分>0.9的匹配,而且能看到对应的term单词和类别:
# 筛选得分≥0.9的结果,整理列顺序 near_matches <- all_pairs %>% filter(jw_score > 0.9) %>% select(NoteID, note_word, Category, term_word, jw_score) # 查看结果 print(near_matches)
运行后你会得到这样的结果(完全符合你的需求):
NoteID note_word Category term_word jw_score 1 5 thought c though 0.9714286 2 10 tough c though 0.9500000
额外:如果你想找每个note的最优匹配
如果你的需求是「给每个note找得分最高的term」,可以这么做:
# 给每个note保留得分最高的匹配 top_matches <- all_pairs %>% group_by(NoteID) %>% filter(jw_score == max(jw_score)) %>% ungroup() print(top_matches)
再补点Jaro-Winkler的小知识
Jaro-Winkler得分范围是0到1,越接近1表示两个字符串越相似。它专门针对短字符串优化,特别适合检测拼写错误(比如少字母、错字母的情况),比普通的编辑距离更贴合你的场景。
内容的提问来源于stack exchange,提问作者Cam23 19
相关产品推荐
相关产品推荐

