OpenRefine
| Краткое описание инструмента | OpenRefine - свободный инструмент для извлечения и очистки табличных данных, которые можно связать с базами знаний, включая Викиданные. Он был разработан Google (под названием Google Refine) и сейчас превратился в проект, поддерживаемый сообществом. |
|---|---|
| Возможности |
Это инструмент для очистки наборов данных и для выполнения сложных операций с данными. У него есть свой язык GREL похожий на формумы Exel и OpenOffice. |
| Трудности использования | высокий порог входа |
| Область знаний | Информатика, Большие данные |
| Область применения | образование |
| Поясняющее видео | |
| Веб-сайт | https://openrefine.org/ |
| Пользователи | Преподаватели, Исследователи |
| Используется для создания (проведения) | |
| Разработчик | |
| Сообщество вокруг средства | |
| Лицензия | Открытая |
| Год первого релиза | |
| Совместное сетевое использование | Нет |
| Какой язык основной | English |
| Есть ли поддержка Искусственным Интеллектом | Нет |
- см. примеры использования OpenRefine в статье Сравнительный анализ психологических школ
Основные возможности
Фасетирование (Faceting)
Фасетирование позволяет разбить большой датасет на управляемые подмножества по определённым критериям. С помощью фасетов можно:
- Просмотреть распределение значений в столбце (например, сколько авторов, сколько пустых ячеек)
- Отфильтровать данные по выбранным значениям
- Применить операции только к отфильтрованным строкам
- Выявить аномалии и пропуски в данных
- Пример
- Если в столбце "Авторы" 500 уникальных значений, фасетирование позволит увидеть структуру данных и выявить, что "Иванов И.И." и "иванов и и" — это один человек.
Кластеризация (Clustering)
Кластеризация автоматически группирует похожие значения на основе различных алгоритмов:
- Fingerprinting — консервативный метод (удаляет пунктуацию, регистр, сортирует слова)
- N-Gram Fingerprinting — для выявления опечаток
- Levenshtein — расстояние редактирования между строками
Трансформация данных с GREL
GREL (General Refine Expression Language) — встроенный язык программирования для сложных преобразований:
- Нормализация текста (приведение к lowercase, удаление пунктуации)
- Условные операции (if-then-else)
- Работа с массивами и строками
- Регулярные выражения
История операций (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
Подсказки по GREL
| Description | |
|---|---|
| GREL | GREL (Google/General Refine Expression Language) — это выражения, которые используются в OpenRefine для фильтрации, преобразования и агрегирования данных в ячейках и столбцах. По смыслу GREL для OpenRefine играет ту же роль, что формулы для Excel или SQL‑запросы для баз данных: позволяет выполнять более сложные операции, чем доступно через стандартные пункты меню. |
| Контекст: что хотим сделать | Где и в каком режиме | Пример 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 для фасета, удобно для выделения определённых типов событий |

