PowerShell Group-Object: как посчитать CSV-реплики каждого говорящего
Сводка по колонке speaker через Import-Csv и Group-Object: контроль разделителя, пустые метки и сумма записей. Почему количество реплик не равно времени речи.
Подготовьте таблицу с одной репликой на запись
Сводка полезна перед разбором интервью: увидеть, какие метки участников есть в файле, найти неожиданного «Спикера 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. Пустая группа остаётся частью контроля.
| speaker | Count | Проверка |
|---|---|---|
| A | 2 | Проверить метку по голосу |
| B | 1 | Не сравнивать с длительностью |
| Пустое значение | 1 | Найти неизвестную реплику |
Сохраните рядом правила меток и дату проверки. Тогда сводку новой версии можно сравнить по одинаковой схеме.
Проверка сводки говорящих
CSV и версия: [имя] Разделитель: [символ] Колонка говорящего: [имя] Единица записи: [правило] Крайние пробелы: [Trim для сводки] Регистр: [учитывается / нет] Группы: [метка — Count] Пустые метки: [число] Сумма Count: [число] Метки по аудио проверены: [места]
Частые вопросы
Count показывает минуты речи?
Нет. Это число объектов CSV в группе. Для длительности нужны интервалы.
Пустую группу нужно убрать?
Сначала выясните, какие записи в неё попали. Она может показывать неизвестного говорящего.
A и a считаются разными?
В приведённой группировке регистр не различается. Для чувствительных к регистру идентификаторов задайте другое правило.
Сводка подтверждает правильность диаризации?
Нет. Соответствие меток голосам проверяется по исходной записи.