JaroWinkler 方法 --> 识别字符串中的 Character/Numeric 个点

JaroWinkler Method --> Identifying Character/Numeric spots in a string

我正在解决一个问题,以确定指定的字符串是否具有正确的格式。我正在尝试使用模糊匹配技术 JaroWinkler 来查找参考字符串和感兴趣的字符串之间的相似性得分。

字符串的正确格式遵循以下顺序(N=数字,C=字符):NNNCCCCCC

我在另一个 Whosebug 问题上发现了类似的问题,并在此处稍微编辑了代码:

library(RecordLinkage)
library(dplyr)
library(stringdist)

ref <-c('123ABCDEF')
words <-c("456GHIJKL","123ABCDEF","78D78DAA2","660ABCDEF")

wordlist <- expand.grid(words = words, ref = ref, stringsAsFactors = FALSE)

df <- wordlist %>% 
        group_by(words) %>% 
        mutate(match_score = jarowinkler(words, ref))

df <- as.data.frame(df)
df

我知道 JaroWinkler 方法用于识别常见字符并考虑字符串距离,但我不确定这是否是最佳方法。理想情况下,我希望单词向量中的第一个和最后一个元素被分类为正确并获得 1 的分数,因为它们具有 NNNCCCCCC 格式。

但是,当我 运行 这段代码时,我得到以下信息:

      words       ref match_score
1 456GHIJKL 123ABCDEF   0.0000000
2 123ABCDEF 123ABCDEF   1.0000000
3 78D78DAA2 123ABCDEF   0.3148148
4 660ABCDEF 123ABCDEF   0.7777778

这种匹配练习有没有更好的方法?任何帮助,将不胜感激!谢谢!

正如上面评论中所建议的,我会进行精确的字符串匹配。目前唯一不确定的是“字符”是什么意思?仅来自 A-Z 或 als 的字母,例如标点符号?如果只有字母,请看下面的代码。

library(tidyverse)

words <-c("456GHIJKL","123ABCDEF","78D78DAA2","660ABCDEF")

str_detect(words, "[[:digit:]]{3}(?=[[:alpha:]]{6})")

给出:

[1]  TRUE  TRUE FALSE  TRUE

更新答案以反映 TO 改变的模式

words <-c("456GHIJKL","123ABCDEF","78D78DAA2","660ABCDEF", "660A7CDEF")

str_detect(words, "[[:digit:]]{3}(?=[[:alpha:]]{1})(?=[[:digit:]]{1}|[[:alpha:]]{1})(?=[[:alpha:]]{5})")

给出:

[1]  TRUE  TRUE FALSE  TRUE  TRUE