ТранскрибаторТранскрибатор
Практическая инструкция

Как присоединить замечания к CSV-расшифровке по replica_id через Python

Соединение реплик и замечаний по устойчивому ID без удаления строк. Проверка повторных ключей, неизвестных ID и новая колонка review_comment.

Транскрибатор
ЗАПИСЬПЛАН РАБОТЫСверьте версии и IDПроверьте ключи замечанийСохраните полную таблицуПроверить результатОТ СЛОВ К РЕЗУЛЬТАТУ
Работа с реальной записьюНаглядный учебный примерШаблон для копирования
1Сверьте версии и ID2Проверьте ключизамечаний3Сохраните полнуютаблицу
Устойчивый ID связывает замечание с нужной репликой даже при иной сортировке таблицы.

Когда номера строк недостаточны

Редактор получил реплики в replicas.csv, а проверяющий вернул comments.csv с замечаниями. За время проверки таблицу могли отсортировать. Соединение по позиции строки привяжет замечание не к той фразе. Поиск по text тоже ненадёжен: одинаковые ответы встречаются в разных местах, а текст после правки меняется.

В этой схеме replica_id назначается до передачи на проверку и сохраняется при сортировке. Это поле вашего рабочего процесса; статья не утверждает, что сервис экспортирует его автоматически. Используйте уникальность в пределах конкретной версии и источника. При объединении интервью добавьте устойчивый идентификатор записи или заранее обеспечьте общий уникальный ключ.

Определите правила двух таблиц

replicas.csv содержит replica_id, text и при необходимости speaker, timecode. comments.csv содержит replica_id и comment. Пример допускает не более одного замечания на ключ. Если комментариев несколько, заранее выберите другой формат или проверенное объединение: обычный словарь иначе способен незаметно оставить только последнее значение.

Код останавливается на пустом или повторном ID, неполной записи и лишних полях. Повторные заголовки запрещены. Перед запуском выполните проверку CSV. Ключи сравниваются точно; пробелы не удаляются автоматически.

Присоедините замечания, сохранив все реплики

Положите обе таблицы рядом с join_comments.py и выполните python join_comments.py. Файл replicas-reviewed.csv создаётся отдельно. В нём сохраняются исходные поля и порядок реплик, затем добавляется review_comment. Если комментария нет, поле остаётся пустым — реплика не исчезает.

Любой ключ замечания, отсутствующий в replicas.csv, останавливает запись результата. Не отбрасывайте такие замечания молча: возможны другая версия, опечатка или удалённая реплика. Проверьте причину с исходным комплектом, прежде чем исправлять ключ. Список ID в сообщении программы может относиться к рабочему материалу; не публикуйте его без необходимости.

import csv
from pathlib import Path

def load(name, required):
    with Path(name).open(encoding="utf-8-sig", newline="") as file:
        reader = csv.DictReader(file)
        fields = reader.fieldnames or []
        rows = list(reader)
    if len(fields) != len(set(fields)) or not set(required) <= set(fields):
        raise ValueError(f"Проверьте колонки: {name}")
    result = {}
    for row in rows:
        if None in row or any(v is None for v in row.values()):
            raise ValueError(f"Повреждённая запись: {name}")
        key = row["replica_id"]
        if not key.strip() or key in result:
            raise ValueError(f"Пустой или повторный ID: {name}: {key!r}")
        result[key] = row
    return fields, result

fields, replicas = load("replicas.csv", ["replica_id", "text"])
_, comments = load("comments.csv", ["replica_id", "comment"])
if "review_comment" in fields: raise ValueError("Имя review_comment уже занято")
unknown = set(comments) - set(replicas)
if unknown: raise ValueError(f"ID замечаний без реплики: {sorted(unknown)}")
with Path("replicas-reviewed.csv").open("x", encoding="utf-8-sig", newline="") as file:
    writer = csv.DictWriter(file, fieldnames=fields + ["review_comment"])
    writer.writeheader()
    for key, row in replicas.items():
        writer.writerow({**row, "review_comment": comments.get(key, {}).get("comment", "")})
print("Реплик:", len(replicas), "Замечаний:", len(comments))

Сверьте соединённую таблицу и решения редактора

Число выходных реплик должно равняться исходному. Откройте несколько замечаний, включая последнее и ключ из середины, и проверьте текст, говорящего и время. Замечание может содержать предложение исправления, но код не применяет его: review_comment остаётся отдельным основанием для проверки.

Текстовую основу записи можно подготовить через Транскрибатор. Если файл большой, отдельное задание поможет сохранить выборочную проверку, но критичные замечания прослушивайте адресно.

После редактуры сохраните решения «принято / отклонено / требуется уточнение» и новую версию. Не удаляйте устойчивые ID при пересборке текста. Пример держит обе таблицы в памяти и не рассчитан на неограниченный объём; наличие ключа подтверждает связь по схеме, а не правильность содержания замечания.

Учебный пример

Учебный пример: одна реплика без замечания

Вымышленные ключи показывают сохранение всех строк основной таблицы.

replica_idЗамечаниеРезультат
R-01Проверить названиеТекст сохранён, комментарий добавлен
R-02Нет записи в comments.csvРеплика сохранена, поле пустое
R-99Нет в основной таблицеОстановка для сверки
КлючУстойчивый IDСверить версииСвязьНе более одного замечанияОтклонить повторыВыходВсе исходные репликиПроверить количество
Соединение переносит замечание, а решение о правке остаётся отдельным действием.

Пустое поле review_comment означает отсутствие строки замечания или пустой комментарий, а не автоматическое подтверждение качества реплики.

Лист сверки замечаний

Рабочая заготовкаВыделите и скопируйте
Основная таблица: [версия]
Таблица замечаний: [версия]
Правило replica_id: [описание]
Повторные ID: [проверка]
Неизвестные ID: [решения]
Реплик до и после: [числа]
Проверенные связи: [ключи]
Решения редактора: [отдельный журнал]

Частые вопросы

Можно соединить по номеру строки?

Только если позиционная связь гарантирована. При сортировке используйте устойчивый ID.

Можно несколько замечаний на ключ?

Этот пример останавливается на повторах. Для нескольких нужен другой формат связи.

Текст автоматически исправится?

Нет. Добавляется отдельная колонка замечания.

Почему неизвестный ключ останавливает код?

Чтобы не потерять замечание молча и проверить соответствие версий.