У меня есть фрейм данных с 5 миллионами различных названий компаний, многие из которых относятся к одной и той же компании, написанной по-разному или с орфографическими ошибками. В качестве примера я использую название компании «Amminex», а затем пытаюсь разбить его на 5 миллионов названий компаний:
Companylist <- data.frame(Companies=c('AMMINEX'))
Это мой большой список названий компаний, которые я открываю:
Biglist <- data.frame(name=c(Biglist[,]))
Я помещаю AMMINEX и 5 миллионов компаний в одну матрицу:
Matches <- expand.grid(Companylist$Companies,Biglist$name.Companiesnames)
Измените имена столбцов:
names(Matches) <- c("Companies","CompaniesList")
Я использую stringdist с методом косинуса:
Matches$dist <- stringdist(Matches$Companies,Matches$CompaniesList, method="cosine")
Я удаляю все расстояния выше 0,2, чтобы избавиться от плохих совпадений:
Matches_trimmed <- Matches[!(Matches$dist>0.2),]
Я сортирую по столбцу расстояния, чтобы лучшие совпадения отображались вверху:
Matches_trimmed <- Matches_trimmed[with(Matches_trimmed, order(dist)), ]
Как видите, результаты не очень удовлетворительны:
Первая строка хороша, но затем появляется куча плохих совпадений, прежде чем, наконец, внизу я получаю хорошие совпадения «AMMINEX AS».
Это не работает для меня. Можно ли как-то улучшить это нечеткое сопоставление или, может быть, использовать другой метод для получения лучших результатов? Может быть, метод, который будет смотреть порядок, в котором буквы появляются в строках?
"true_name garbage"
, вы можете создать дополнительную коварианту, которая представляет собой первые n букв названия компании, и попытаться найти точные совпадения в названии основы в дополнение к нечетким совпадениям в целом -- это добавило бы веса таким шаблонам, как"AMMINEX" -> "AMMINEX AS"
- person gfgm   schedule 31.03.2018df1$stem_n <- substr(df1$name, 1, n)
и т. д. - person gfgm   schedule 31.03.2018