楼主: 畅饮0
5646 11

[问答] 一道相对较难的用R语言实现较为精准的模糊匹配的题目,谢谢解答,有金币奖励 [推广有奖]

11
zhjx19 发表于 2022-12-14 10:49:17
zhjx19 发表于 2022-12-14 00:00
stringdist包可以计算字符串距离,选用有最长共同子串距离:
代码咋不显示呢

library(stringdist)

x = c("中泰中泰剑桥集团", "中国移动公司北京分部", "中国贝利发电公司",
      "北大荒中粮集团", "贝利发电有限责任公司",
      "北大荒中粮有限集团北京销售部", "北京市中和街道味千拉面",
      "北京市中和街道味有食堂NO1")

D = stringdistmatrix(x, x, method = "lcs")
D[D == 0] = Inf

J = apply(D, 1, which.min)

tibble::tibble(原序列 = x, 最接近 = x[J])

12
赵安豆 发表于 2024-6-13 08:18:39
在R语言里实现较为精准的模糊匹配主要可以通过使用stringdist包进行字符串相似度计算。下面我将给出一个解决方案,但请注意,由于数据源未提供,以下代码只能展示基本思路。

首先安装并加载所需的包:

```r
install.packages("tidyverse")
install.packages("stringdist")

library(tidyverse)
library(stringdist)
```

设定你的数据源示例(实际使用时请替换为真实数据):

```r
data_source <- data.frame(
  company_name = c('北京中和街道科技发展有限公司', '深圳市中和信息技术有限公司',
                   '上海中和科技集团有限公司', '广州中和软件开发有限公司',
                   '北京市中和街道社区服务中心', '深圳华强北电子市场')
)
```

定义一个函数用于模糊匹配:

```r
fuzzy_match <- function(data, threshold = 0.1) {
  n_companies <- nrow(data)

  # 计算字符串距离矩阵(这里使用了标准化Levenshtein距离)
  dist_matrix <- stringdistmatrix(toupper(data$company_name), toupper(data$company_name),
                                  method = "lv", normalize = TRUE)
  
  # 矩阵的行和列代表不同的公司名称
  matched_companies <- list()
  
  for (i in 1:n_companies) {
    if (is.null(matched_companies[[i]])) {
      # 找到与当前公司字符串相似度小于阈值的所有其他公司
      similar_companies <- which(dist_matrix[i,] < threshold & dist_matrix[i,] != 0)
      
      matched_companies[[i]] <- data$company_name[i]
      
      if (length(similar_companies) > 1) {
        for (j in similar_companies[-which(i == similar_companies)]) {
          # 如果两个公司字符串相似,将它们归为一组
          matched_companies[[i]] <- c(matched_companies[[i]], data$company_name[j])
         
          # 标记这些公司已被匹配,以避免重复匹配
          dist_matrix[i, j] <- 1.0
          dist_matrix[j, i] <- 1.0
        }
      }
    }
  }

  return(matched_companies)
}
```

使用该函数处理数据:

```r
results <- fuzzy_match(data_source)

# 打印结果
for (i in seq_along(results)) {
  cat("组", i, ":", paste(results[[i]], collapse = ", "), "\n")
}
```

需要注意的是,字符串距离阈值的选择对最终匹配结果有较大影响。你可能需要根据实际需求调整这个参数。

以上代码仅供参考,实际应用时请根据具体情况调整细节设置。

此文本由CAIE学术大模型生成,添加下方二维码,优先体验功能试用



您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-6 07:53