【问题标题】:fuzzy matching two strings uring r模糊匹配两个字符串
【发布时间】:2016-10-28 06:21:20
【问题描述】:

我有两个向量,每个向量都包含一系列字符串。例如,

V1=c("pen", "document folder", "warn")
V2=c("pens", "copy folder", "warning")

我需要找出哪两个最匹配。我直接使用 levenshtein 距离。但这还不够好。就我而言,钢笔和钢笔应该是同一个意思。文档文件夹和复制文件夹可能是一回事。警告和警告实际上是相同的。我正在尝试使用像 tm.但我不太确定哪些功能适合这样做。谁能告诉我这个?

【问题讨论】:

  • 你需要看stringdist
  • 可能需要制作一个自定义字典。 This example using wordnet 可能会有所帮助
  • 阅读 Levenshtein 距离。基本上 - 需要进行多少“单步”更改才能匹配字符串。最佳匹配是最小化这个值。 ?adist

标签: r text match fuzzy


【解决方案1】:

根据我的经验,余弦匹配非常适合此类工作:

V1 <- c("pen", "document folder", "warn")
V2 <- c("copy folder", "warning", "pens")   
result <- sapply(V1, function(x) stringdist(x, V2, method = 'cosine', q = 1))
rownames(result) <- V2
result
                  pen document folder      warn
copy folder 0.6797437       0.2132042 0.8613250
warning     0.6150998       0.7817821 0.1666667
pens        0.1339746       0.6726732 0.7500000

当距离足够近时,您必须定义一个截止点,距离越小它们匹配得越好。您还可以使用 Q 参数,该参数表示应该相互比较多少个字母组合。例如:

result <- sapply(V1, function(x) stringdist(x, V2, method = 'cosine', q = 3))
rownames(result) <- V2
result
                  pen document folder      warn
copy folder 1.0000000       0.5377498 1.0000000
warning     1.0000000       1.0000000 0.3675445
pens        0.2928932       1.0000000 1.0000000

【讨论】:

  • 非常感谢大家!我会尝试这些方法。只有一件事我不确定:我的字符串实际上比这个例子复杂得多。字符串可能类似于“星期二肯德基警告笔文件夹 13 * 15 其中两个”。这意味着其中有一些无用的子字符串和一些符号。恐怕在这种情况下,直接使用那些距离函数不是很合适。所以我考虑先用tm包进行预处理?有什么建议吗?
  • tm 包非常适合预处理。此链接可能会帮助您预处理数据:rstudio-pubs-static.s3.amazonaws.com/…
【解决方案2】:

这是Levenshtein distance 的维基。它测量需要采取多少删除/更改/插入操作来转换字符串。模糊匹配的一种方法是最小化这个值。

这是一个例子。我稍微调整了一下顺序,让它不那么无聊:

V1 <- c("pen", "document folder", "warn")
V2 <- c("copy folder", "warning", "pens")

apply(adist(x = V1, y = V2), 1, which.min)
[1] 3 1 2

输出表示,V2的哪些位置对应V1的最接近变换,按V1的顺序排列。

data.frame(string_to_match = V1, 
           closest_match = V2[apply(adist(x = V1, y = V2), 1, which.min)])
  string_to_match closest_match
1             pen          pens
2 document folder   copy folder
3            warn       warning

【讨论】:

    猜你喜欢
    • 2012-02-14
    • 2014-11-02
    • 2018-05-31
    • 2021-04-19
    • 1970-01-01
    • 2014-12-30
    • 2015-07-11
    • 2014-12-11
    • 2015-02-07
    相关资源
    最近更新 更多