2016-04-13 2 views
1

В настоящее время я работаю над проектом программирования в R (для школы), и я использую набор данных, сделанный из большого количества пользователей LastFm (приложение, которое собирает данные, когда вы используете медиа плеер). Я хочу работать над возможной связью между двумя переменными, присутствующими в наборе данных, которые являются «никнейм» и «настоящим именем». Для этого я хотел бы вычислить переменную, которая представляет скорость сходства между символами.сравнение строки в R

В качестве примера взять одного человека (независимо от других переменных):

name = 'chris meller' 
nickname = 'mellertime' 

До сих пор пытался сортировать строки, чтобы проверить на одинаковых символов один за другим, но я застрял здесь , То, что я нашел, - это просто способ проверить, присутствует ли «имя» внутри «никнейма» с различными функциями.

>paste(sort(unlist(strsplit(name, ""))), collapse = "") 
[1] "eeeillmmrt" 
>paste(sort(unlist(strsplit(nickname, ""))), collapse = "") 
[1] " ceehillmrrs" 

То, что я хотел бы знать, если есть способ, чтобы подсчитать количество одинаковых букв между 2 строки символов, независимо от того?

Я хотел бы закончить с чем-то вроде этого:

function(a,b) 
[1] 0.63 
# a,b are 2 character strings 

где результат представляет собой отношение числа идентичного характера между двумя строками, разделенных на количестве символов в реальном имени.

+1

Граф письма с 'таблицы (strsplit ('eeeillmmrt', '') [[1]])', но расстояние редактирования (см. '? adist'), вероятно, будет более полезным. – alistaire

+0

@alistaire спасибо за подсказку, я никогда не слышал, чтобы расстояние Левенштейна, которое используется в adist, если я не могу найти свой путь, я, вероятно, что-то сделаю с Левенштейном. –

+0

@allstaire, не могли бы вы дать больше информации о реализации «adist»? Я не мог заставить его вернуть то, что искали ОП. Я даже попытался немного поработать в пакете 'stringdist', но не смог получить подходящее решение. –

ответ

0

Попробуйте это:

SimilarityRatio <- function(wholeName, nickname, matchCase) { 

    n1 <- sort(strsplit(paste(strsplit(wholeName, " ")[[1]], collapse = ""), "")[[1]]) 
    n2 <- sort(strsplit(paste(strsplit(nickname, " ")[[1]], collapse = ""), "")[[1]]) 

    if (!matchCase) { 
     n1 <- tolower(n1) 
     n2 <- tolower(n2) 
    } 

    MyLen <- tempLen <- length(n1) 
    j <- 1L 
    numMatch <- 0L 

    while (j <= tempLen) { 
     test1 <- n1[j] %in% n2 
     if (test1) { 
      myRemove <- min(which(n2 %in% n1[j])) 
      n1 <- n1[-j] 
      n2 <- n2[-myRemove] 
      numMatch <- numMatch + 1L 
      tempLen <- tempLen - 1L 
     } else { 
      j <- j+1L 
     } 
    } 

    numMatch/MyLen 
} 

Ниже приведены некоторые тестовые примеры:

> SimilarityRatio("chris meller", "mellertime", FALSE) 
[1] 0.6363636 
> SimilarityRatio("SuperMan3000", "The3Musketeers", FALSE) 
[1] 0.5 
> SimilarityRatio("SuperMan3000", "The3Musketeers", TRUE) 
[1] 0.4166667 
> SimilarityRatio("should a garbage collection be performed immediately", "same expression can vary considerably depending on whether", FALSE) 
[1] 0.7608696 
+0

Человек, он отлично работает, я так благодарен! Большое спасибо. –

Смежные вопросы