Наилучшая метрика расстояния сходства для двух строк - PullRequest
2 голосов
/ 09 ноября 2019

У меня есть набор названий компаний для сравнения, например, я хочу сопоставить эту строку: A&A PRECISION

с A&A PRECISION ENGINEERING

Однако, почти все меры подобия, которые я использую: как расстояние Хэмминга, расстояние Левенштейна, ограниченное расстояние Дамерау-Левенштейна, полное расстояние Дамерау-Левенштейна, расстояние Longest Common Substring, расстояние Q-граммы, расстояние косинуса, расстояние Жакара Джаро и расстояние Яро-Винклера

соответствует:B&B PRECISION вместо.

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

1 Ответ

1 голос
/ 09 ноября 2019

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

library(data.table)

x <- c("A&A PRECISION", "A&A PRECISION ENGINEERING", "B&B PRECISION")
y <- x

Мы хотим расширить сетку. Для этого я бы использовал функцию CJ в data.table. Затем мы проверим каждую пару и посмотрим, является ли x подстрокой y (это не работает наоборот):

CJ(x, y)[, similarity := apply(.SD, 1, function(x) x[2] %like% x[1]), .SDcols = c("x", "y")][x != y, ]
                           x                         y similarity
1:             A&A PRECISION A&A PRECISION ENGINEERING       TRUE
2:             A&A PRECISION             B&B PRECISION      FALSE
3: A&A PRECISION ENGINEERING             A&A PRECISION      FALSE
4: A&A PRECISION ENGINEERING             B&B PRECISION      FALSE
5:             B&B PRECISION             A&A PRECISION      FALSE
6:             B&B PRECISION A&A PRECISION ENGINEERING      FALSE

Имейте в виду, что вам нужно убедиться, чтостроки работают настолько аккуратно, насколько это возможно, и даже в этом случае это может не сработать.

Есть некоторые вещи, которые я проверю, чтобы очистить ваши строки:

  • Удалить несколько пробелов,
  • Удалять пробелы в начале / конце строки
  • Обеспечивать одинаковую кодировку
  • Гарантировать одинаковый CASE

Этого можно добиться с помощьюstringi пакет.

...