Как присоединить замечания к CSV-расшифровке по replica_id через Python
Соединение реплик и замечаний по устойчивому ID без удаления строк. Проверка повторных ключей, неизвестных ID и новая колонка review_comment.
Когда номера строк недостаточны
Редактор получил реплики в 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 | Нет в основной таблице | Остановка для сверки |
Пустое поле review_comment означает отсутствие строки замечания или пустой комментарий, а не автоматическое подтверждение качества реплики.
Лист сверки замечаний
Основная таблица: [версия] Таблица замечаний: [версия] Правило replica_id: [описание] Повторные ID: [проверка] Неизвестные ID: [решения] Реплик до и после: [числа] Проверенные связи: [ключи] Решения редактора: [отдельный журнал]
Частые вопросы
Можно соединить по номеру строки?
Только если позиционная связь гарантирована. При сортировке используйте устойчивый ID.
Можно несколько замечаний на ключ?
Этот пример останавливается на повторах. Для нескольких нужен другой формат связи.
Текст автоматически исправится?
Нет. Добавляется отдельная колонка замечания.
Почему неизвестный ключ останавливает код?
Чтобы не потерять замечание молча и проверить соответствие версий.