Метод JaroWinkler --› Идентификация символьных/числовых мест в строке

Я работаю над проблемой, чтобы определить, имеет ли указанная строка правильный формат. Я пытаюсь использовать метод нечеткого сопоставления JaroWinkler, чтобы найти показатель сходства между эталонной строкой и интересующими строками.

Правильный формат строки соответствует следующему порядку (N=число, C=символ): NNNCCCCCC.

Я нашел аналогичную проблему в другом вопросе 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

Есть ли лучший метод для этого типа упражнений на сопоставление? Любая помощь будет оценена по достоинству! Благодарю вас!


person user2813606    schedule 30.11.2020    source источник
comment
Если вы ищете конкретный шаблон, я бы не стал использовать приблизительное сопоставление строк. У вас есть четкий шаблон: 3 цифры, за которыми следуют 6 символов. Поэтому вам лучше выполнить точное сопоставление строк.   -  person deschen    schedule 01.12.2020


Ответы (1)


Как было предложено в комментарии выше, я бы сделал точное сопоставление строк. Только пока неясно, что вы имеете в виду под персонажами? Только буквы от A до Z или als, например. знаки препинания? Если только буквы, см. код ниже.

library(tidyverse)

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

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

который дает:

[1]  TRUE  TRUE FALSE  TRUE

Обновление ответа, чтобы отразить измененный шаблон ТО

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
person deschen    schedule 30.11.2020
comment
Огромное спасибо! Как я могу обеспечить некоторую гибкость, если, скажем, 5-е место также может быть персонажем? - person user2813606; 01.12.2020
comment
Может быть персонажем или должен быть персонажем? - person deschen; 01.12.2020
comment
Я думаю примерно так: если бы я хотел сказать, что позиции 1-3 должны быть числовыми, позиция 4 должна быть символьной, позиция 5 может быть любой, а затем позиции 6-9 должны быть числовыми. - person user2813606; 03.12.2020
comment
см. мой обновленный пост выше - person deschen; 03.12.2020
comment
Спасибо еще раз! Это было очень полезно! - person user2813606; 04.12.2020