0

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

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

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

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

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

4

1 回答 1

1

正如上面评论中所建议的,我会做一个精确的字符串匹配。现在唯一不确定的是“字符”是什么意思?只有来自 AZ 或 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
于 2020-11-30T21:23:44.373 回答