OpenRefine

Материал из Поле цифровой дидактики
Краткое описание инструмента OpenRefine - свободный инструмент для извлечения и очистки табличных данных, которые можно связать с базами знаний, включая Викиданные. Он был разработан Google (под названием Google Refine) и сейчас превратился в проект, поддерживаемый сообществом.
Возможности
  • Бесплатен
  • С открытым исходным кодом
  • Запускается локально, не требует доступа в интернет, в этом смысле безопасен, имеет многоязычный интерфейс, включает русский
  • Обладает обширным гибким (программируемым) функционалом, поддерживается и активно развивается сообществом

Это инструмент для очистки наборов данных и для выполнения сложных операций с данными. У него есть свой язык GREL похожий на формумы Exel и OpenOffice.

Трудности использования высокий порог входа
Область знаний Информатика, Большие данные
Область применения образование
Поясняющее видео
Веб-сайт https://openrefine.org/
Пользователи Преподаватели, Исследователи
Используется для создания (проведения)
Разработчик
Сообщество вокруг средства
Лицензия Открытая
Год первого релиза
Совместное сетевое использование Нет
Какой язык основной English
Есть ли поддержка Искусственным Интеллектом Нет

Основные возможности

Фасетирование (Faceting)

Фасетирование позволяет разбить большой датасет на управляемые подмножества по определённым критериям. С помощью фасетов можно:

  • Просмотреть распределение значений в столбце (например, сколько авторов, сколько пустых ячеек)
  • Отфильтровать данные по выбранным значениям
  • Применить операции только к отфильтрованным строкам
  • Выявить аномалии и пропуски в данных
Пример
Если в столбце "Авторы" 500 уникальных значений, фасетирование позволит увидеть структуру данных и выявить, что "Иванов И.И." и "иванов и и" — это один человек.

Кластеризация (Clustering)

Кластеризация автоматически группирует похожие значения на основе различных алгоритмов:

  • Fingerprinting — консервативный метод (удаляет пунктуацию, регистр, сортирует слова)
  • N-Gram Fingerprinting — для выявления опечаток
  • Levenshtein — расстояние редактирования между строками

Трансформация данных с GREL

GREL (General Refine Expression Language) — встроенный язык программирования для сложных преобразований:

История операций (Undo/Redo)

OpenRefine ведёт полную историю всех операций, позволяя:

  • Отменить любую операцию (Undo)
  • Вернуться к любому состоянию проекта
  • Повторить последовательность операций на новом датасете


OpenRefine — это незаменимый инструмент для исследователей, работающих с данными. Он особенно полезен в библиометрических исследованиях, где качество данных критично для получения надёжных результатов. Простота использования в сочетании с мощностью GREL делает его идеальным выбором как для начинающих, так и для опытных аналитиков данных.


Методы

Key Collision методы (быстрые):

Fingerprint (по умолчанию, консервативный)
Удаляет пунктуацию, переводит в lowercase, сортирует слова
N-Gram Fingerprint
Использует n-граммы (последовательности символов)


Phonetic Fingerprint

С алгоритмами: Metaphone 3, Soundex, Cologne Phonetic, Beider-Morse


Nearest Neighbor методы (медленные, но точные):

Levenshtein Distance (Edit Distance)
Считает операции редактирования для преобразования одной строки в другую
PPM (Prediction by Partial Matching)
Очень агрессивный, много false positives


Подсказки

Контекст: что хотим сделать Где и в каком режиме Пример Expression (GREL)
Преобразовать текстовую дату в тип Date (для временных рядов) Меню столбца с датой → Edit cells → Common transforms → To date (выбор GREL не нужен, но важно понимать, что OpenRefine внутри применяет преобразование типа) (автоматическое преобразование ISO‑строки, например `"2022-07-06T06:37:06Z"`)

— отдельное выражение не вводим

Вытащить год из даты в новый столбец (переменная времени \(t\)) Меню столбца с датой → Edit column → Add column based on this column… → язык: GREL
value.toDate().toString("yyyy")

Создаёт столбец `year` с годом, используемым как временной индекс

Построить строковое представление «год‑месяц» (для месячных рядов) Меню столбца с датой → Add column based on this column…
value.toDate().toString("yyyy-MM")

Например, "2024-03"

Очистить пробелы в начале/конце и узнать длину строки Меню столбца с текстом → Edit cells → Transform…
value.trim().length()

Полезно для диагностики «грязных» строк, где есть лишние пробелы

Заменить подстроку (очистка категорий) Меню столбца → Edit cells → Transform…
value.replace("old","new")

Например, объединить разные варианты написания категорий

Объединить значения двух столбцов (конструирование идентификатора панели) Меню любого из столбцов → Edit column → Add column based on this column…
cells["user"].value + "_" + cells["board_id"].value

Создаёт composite key вида "user_board", удобный для группировок

Превратить JSON‑массив в строку с разделителем (подготовка к Split multi-valued cells) Меню столбца с массивом (например, idBoards) → Edit cells → Transform…
value.join("|")

После этого используем Edit cells → Split multi-valued cells… с разделителем |

Посчитать количество строк с той же парой user–board (агрегация по ключу) В режиме Rows, любой столбец → Edit column → Add column based on this column…
length(
  filter(
    rows,
    r,
    r.cells["user"].value == cells["user"].value &&
    r.cells["board_id"].value == cells["board_id"].value
  )
)

Даёт частоту пары (аналог COUNT(*) GROUP BY user, board_id)

Посчитать сумму числового показателя по user–board (например, events) Аналогично: Add column based on this column…, предварительно столбец events → To number
sum(
  forEach(
    filter(
      rows,
      r,
      r.cells["user"].value == cells["user"].value &&
      r.cells["board_id"].value == cells["board_id"].value
    ),
    r, r.cells["events"].value
  )
)

Аналог SUM(events) GROUP BY user, board_id

Фильтровать строки, где значение содержит подстроку (кастомный facet) Меню столбца → Facet → Custom text facet…
value.contains("wiki_edit")

Возвращает true/false для фасета, удобно для выделения определённых типов событий