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

PowerShell Group-Object: как посчитать CSV-реплики каждого говорящего

Сводка по колонке speaker через Import-Csv и Group-Object: контроль разделителя, пустые метки и сумма записей. Почему количество реплик не равно времени речи.

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

Подготовьте таблицу с одной репликой на запись

Сводка полезна перед разбором интервью: увидеть, какие метки участников есть в файле, найти неожиданного «Спикера 3» или пустые значения. Это контроль данных, а не оценка активности человека.

В учебной схеме используются timecode, speaker и text. Одна запись CSV должна соответствовать выбранной единице реплики. Если один ответ разбит на десять сегментов, его Count будет отличаться от экспорта с одним длинным сегментом.

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

Проверьте импорт и названия колонок

Откройте PowerShell в папке с transcript.csv. Команда ниже рассчитана на файл UTF-8 с запятой в качестве разделителя. Если Ваш CSV использует точку с запятой, измените -Delimiter на ";".

Import-Csv превращает колонки в свойства объектов. Поэтому колонка «Говорящий» не появится как speaker автоматически. Укажите фактическое имя в проверке и выражении группировки. При неправильном разделителе сначала исправьте импорт, а не переименовывайте случайную единственную колонку.

CSV с неоднозначными или лишними полями проверьте отдельно, например скриптом структуры CSV. Простая сводка не является полным валидатором таблицы.

Получите группы и проверьте пустую метку

Выполните приведённые команды в PowerShell. Они только читают входной CSV и выводят сводку; исходник не перезаписывается. Сначала используйте учебный файл с двумя репликами A, одной B и одной пустой меткой.

$rows = @(Import-Csv -LiteralPath '.\transcript.csv' -Encoding UTF8 -Delimiter ',')
if ($rows.Count -eq 0) { throw 'Нет записей: проверьте CSV' }
if (-not ($rows[0].PSObject.Properties.Name -contains 'speaker')) {
    throw 'Колонка speaker не найдена'
}
$rows |
    Group-Object -Property { ([string]$_.speaker).Trim() } -NoElement |
    Sort-Object -Property Count -Descending |
    Select-Object Name, Count

Trim убирает крайние пробелы у метки для этой сводки. Исходное поле не изменяется. Group-Object без -CaseSensitive группирует без различения регистра: A и a могут оказаться вместе. Если регистр является частью Вашего идентификатора, задайте соответствующее правило явно.

Пустую группу не удаляйте автоматически. Она показывает записи без определённого говорящего. Найдите их в таблице и проверьте, допустима ли такая метка или требуется повторное прослушивание.

Сверьте сумму и не делайте лишних выводов

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

Варианты «Алексей», «Алексей П.» и «Спикер 1» не становятся одним человеком только из-за сходства. Сначала подтвердите соответствие по записи и правилам проекта. После исправления меток пересчитайте сводку.

Не называйте человека доминирующим по Count: короткие междометия и длинные ответы дают одинаковые единицы счёта. Для текстовых повторений есть частотный список слов, но и он требует чтения контекста. Для времени речи нужны отдельные интервалы начала и конца.

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

Учебный пример: четыре записи и три группы

Вымышленная таблица содержит две записи A, одну B и одну без speaker. Пустая группа остаётся частью контроля.

speakerCountПроверка
A2Проверить метку по голосу
B1Не сравнивать с длительностью
Пустое значение1Найти неизвестную реплику
ЗаписьЕдиница экспортаУточнить сегментациюГруппаМетка speakerПроверить варианты имёнИтогСумма Count = 4Сверить все записи
Сводка описывает таблицу, а не измеряет вклад человека в разговор.

Сохраните рядом правила меток и дату проверки. Тогда сводку новой версии можно сравнить по одинаковой схеме.

Проверка сводки говорящих

Рабочая заготовкаВыделите и скопируйте
CSV и версия: [имя]
Разделитель: [символ]
Колонка говорящего: [имя]
Единица записи: [правило]
Крайние пробелы: [Trim для сводки]
Регистр: [учитывается / нет]
Группы: [метка — Count]
Пустые метки: [число]
Сумма Count: [число]
Метки по аудио проверены: [места]

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

Count показывает минуты речи?

Нет. Это число объектов CSV в группе. Для длительности нужны интервалы.

Пустую группу нужно убрать?

Сначала выясните, какие записи в неё попали. Она может показывать неизвестного говорящего.

A и a считаются разными?

В приведённой группировке регистр не различается. Для чувствительных к регистру идентификаторов задайте другое правило.

Сводка подтверждает правильность диаризации?

Нет. Соответствие меток голосам проверяется по исходной записи.