Вычисление сходства строк в процентах

Данная функция использует пакет «stringdist» в R и сообщает минимальные изменения, необходимые для замены одной строки на другую. Я хочу узнать, насколько похожа одна строка на другую в формате "%". Пожалуйста, помогите мне и спасибо.

stringdist("abc","abcd", method = "lv")

person Ashmin Kaul    schedule 27.09.2017    source источник
comment
Возможно, этот ответ будет полезен. Это действительно зависит от вашего определения подобия.   -  person Andrey Kolyadin    schedule 27.09.2017


Ответы (3)


Вы можете использовать пакет RecordLinkage и использовать функцию levenshteinSim, т.е.

#This gives the similarity
RecordLinkage::levenshteinSim('abc', 'abcd')
#[1] 0.75

#so to get the distance just subtract from 1, 
1 - RecordLinkage::levenshteinSim('abc', 'abcd')
#[1] 0.25
person Sotos    schedule 27.09.2017
comment
Я не знал об этом пакете - действительно крутой. Согласно документации, есть даже функция levenshteinDist, непосредственно вычисляющая расстояние. - person A. Stam; 27.09.2017
comment
@ А.Стам Ага. Однако это расстояние не нормировано - person Sotos; 27.09.2017
comment
Мне нужно только это, можете ли вы дать мне тот же результат в % - person Ashmin Kaul; 27.09.2017
comment
Привет, я хочу знать, процент (1:10) с использованием пакета Scales дает мне значения в %, но с символьным типом данных, я хочу представлять числа в %, но также сделать это числовым, пожалуйста, помогите. - person Ashmin Kaul; 05.10.2017
comment
Вы не можете поставить символ % после значения и установить его как числовое. Вот почему мы записываем проценты как 0,.... - person Sotos; 05.10.2017

Что-то вроде этого может сработать:

d <- data.frame(original = c("abcd", "defg", "hij"), new = c("abce", "zxyv", "hijk"))
d$dist <- stringdist(d$original, d$new, method = "lv")
d$similarity <- 1 - d$dist / nchar(as.character(d$original))

#### Returns:
####   original  new dist similarity
#### 1     abcd abce    1  0.7500000
#### 2     defg zxyv    4  0.0000000
#### 3      hij hijk    1  0.6666667
person A. Stam    schedule 27.09.2017
comment
Эй, очень близко, если я увижу вашу первую строку, я должен получить 0,75 вместо 0,25, что представляет 75% сходства между строками, аналогично вторая строка должна быть 0%, так как они совершенно не похожи. Спасибо за помощь. - person Ashmin Kaul; 27.09.2017
comment
Я изменил свой ответ, чтобы рассчитать сходство, а не расстояние. - person A. Stam; 27.09.2017
comment
Мне нужен показатель сходства в процентах, большое спасибо за помощь. - person Ashmin Kaul; 27.09.2017
comment
Что вы имеете в виду под процентами? Вы можете просто умножить результат на 100, если хотите 75 вместо 0,75. Или вам нужно что-то другое? - person A. Stam; 27.09.2017
comment
Большое спасибо за твою помощь. - person Ashmin Kaul; 27.09.2017

Вот функция в базе R. Я добавил проверку на наличие векторов одинаковой длины в качестве входных данных. При желании вы можете изменить эту логику.

strSim <- function(v1, v2) {
            if(length(v1) == length(v2)) 1 - (adist(v1, v2) / pmax(nchar(v1), nchar(v2)))
            else stop("vector lengths not equal")}

это возвращает

strSim("abc", "abcd")
     [,1]
[1,] 0.75
person lmo    schedule 27.09.2017