Реплики одного говорящего из CSV: как сохранить выборку через Python
Отбор строк по speaker в отдельный CSV с сохранением колонок и исходного порядка. Как проверить метку участника и не потерять контекст соседних реплик.
Убедитесь, что метка соответствует человеку
Выборка нужна, например, чтобы подготовить реплики интервьюируемого к проверке или собрать все места, помеченные как неизвестный участник. Сначала сопоставьте speaker с реальными голосами в начале, середине и конце записи.
В учебном файле метка A обозначает выбранного участника. Значения A, «Спикер 1» и имя человека не равнозначны автоматически. Если метки были исправлены только в части таблицы, фильтр соберёт неполный набор. Основу можно подготовить через расшифровку аудио.
Сохраните структуру и точное условие
В примере сравнение чувствительно к регистру; крайние пробелы speaker убираются только для отбора. Все поля выбранных строк записываются в исходном порядке колонок. Исходный файл не изменяется.
Перед отбором проверьте структуру CSV. Код ожидает UTF-8 и запятую. Для другого разделителя задайте его явно в читателе и писателе.
Создайте новую выборку
Сохраните код как select_speaker.py рядом с transcript.csv, измените wanted и имя выходного файла, затем выполните python select_speaker.py или python3 select_speaker.py. Режим "x" защищает существующую выборку от перезаписи.
import csv
from pathlib import Path
wanted = "A"
with Path("transcript.csv").open(encoding="utf-8-sig", newline="") as source:
reader = csv.DictReader(source)
headers = reader.fieldnames or []
if not {"speaker", "text"}.issubset(headers):
raise ValueError("Нужны speaker и text")
rows = list(reader)
if len(headers) != len(set(headers)) or any(None in row for row in rows):
raise ValueError("Проверьте структуру CSV")
selected = [row for row in rows if (row["speaker"] or "").strip() == wanted]
with Path("speaker-A.csv").open("x", encoding="utf-8-sig", newline="") as target:
writer = csv.DictWriter(target, fieldnames=headers)
writer.writeheader()
writer.writerows(selected)
print("Всего:", len(rows), "Выбрано:", len(selected))
Код загружает строки в память, поэтому рассчитан на обычную рабочую таблицу, а не неограниченный объём данных. Если выбрано 0 строк, проверьте метку и импорт. Пустая выборка не доказывает отсутствие участника в аудио.
Проверьте состав и контекст
На учебных строках A, B, A ожидаются две строки A в прежнем порядке. Сверьте таймкоды и последнюю выбранную реплику с исходником. Не сортируйте по тексту только ради аккуратного списка.
Для сводки количества записей каждой метки пригодится группировка speaker. Для цитаты возвращайтесь к вопросу и соседним репликам: выделение одного человека убирает часть контекста.
Учебный пример: A, B, A
Вымышленная таблица показывает сохранение порядка выбранных реплик.
| Исходная позиция | speaker | В выборке |
|---|---|---|
| 1 | A | Первая строка |
| 2 | B | Не включена |
| 3 | A | Вторая строка |
При передаче выборки укажите условие отбора и приложите ссылку на исходную версию документа в Вашем рабочем процессе.
Паспорт выборки говорящего
Исходный CSV: [версия] Выбранный speaker: [точное значение] Проверка по голосу: [таймкоды] Регистр: [учитывается] Крайние пробелы: [Trim при сравнении] Всего записей: [число] Выбрано: [число] Выходной файл: [имя] Контекст проверен: [реплики]
Частые вопросы
Фильтр узнаёт человека по голосу?
Нет. Он отбирает по текстовой метке speaker.
Порядок реплик изменится?
В приведённом примере подходящие строки сохраняются в исходном порядке.
Почему выбрано 0 строк?
Проверьте значение speaker, регистр и корректность импорта.
Можно цитировать выборку без исходника?
Перед цитированием проверьте вопросы и соседние реплики в полном разговоре.