У меня есть файл CSV, экспортированный из Zotero, с метаданными записей моей библиотеки. Я знаю, что он содержит довольно много дубликатов, но избавиться от них не так просто:
Не все элементы с похожими названиями на самом деле являются дубликатами, например.
| Year | Author | Title | +------+-------------------------------+--------------+ | 2016 | Jones, Erik | Book Reviews | | 2016 | Hassner, Pierre; Jones, Erik | Book Reviews | | 2010 | Adams, Laura L.; Gagnon, Chip | Book Reviews |
Не все элементы, которые на самом деле похожи, имеют 100% идентичные строки метаданных, например.
| Author | Title | +---------------+-----------------------------------------------+ | Tichý, Lukáš; | Can Iran Reduce EU Dependence on Russian Gas? | | Tichy, L.; | "can iran reduce eu dependence onrussian gas" |
Это крайний случай (различия обычно не такие большие), но, как видите, предварительная очистка точно не решит эту проблему; поэтому идея состоит в том, чтобы исключить строки, содержащие похожие значения в двух и более столбцах, например, "Автор" и "Заголовок".
Что я пробовал/просматривал до сих пор:
- OpenRefine - почти не знаком с ним, поэтому ничего толкового придумать и найти не смог.
- Расширение нечеткого поиска Excel – на самом деле не работает путь мне нужен.
- Python — опять же, я плохо разбираюсь в языке; и я не смог найти подходящих решений/руководств.
- Р: опробовал несколько идей:
Сначала используйте agrep в цикле for для столбца «Автор», чтобы получить индексы строк с дубликатами; затем сделайте то же самое для столбца «Заголовок»; а затем сравните векторы и выполните дедупликацию строк, в которых значения совпадают. Излишне говорить, что я не мог двигаться дальше шага 1:
titles <- unlist(corpus$"Title")
for (i in 1:length(titles)){
Title_dupe_temp <- agrep(titles[i], titles[i+1:length(titles)],
max.distance = 1, ignore.case = TRUE, fixed = FALSE)
Title_dupes[i] <- paste(i, Title_dupe_temp, sep = " ")
}
В результате получается (почти) полная тарабарщина; плюс я получаю предупреждающие сообщения:
In Title_dupes[i] <- paste(i, Title_dupe_temp, sep = " ") :
number of items to replace is not a multiple of replacement length
Я также прочитал документацию fuzzywuzzyR, но не найти любые функции, которые могут помочь.
Наконец, я попробовал пакет RecordLinkage. Тем не менее, я не мог пройти мимо основ. Документация довольно обширна и не содержит подробностей во всех аспектах; руководств мало, а те, которые я нашел (например, это) использовать примеры наборов данных с готовыми векторами идентичности, поэтому я не мог понять, как воспроизвести это на моих данных.
Так что на данный момент мне все равно, делать ли это в OpenRefine/R/Py/SQL/что угодно, просто сделать это любым способом.