Яндекс.Задания — тестирование диктанта

Цель: получение текстов разнообразных вариантов написания диктанта для построения тепловой карты ошибок с последующим анализом возможных ошибок/вариантов и корректировки разметки.

Ограничение: цельный текст диктанта под секретом, нельзя его полностью показывать отдельному человеку.

Решение: предлагать пользователям сервиса «Яндекс.Заданий» писать отдельные предложения под диктовку, а затем склеивать результаты в единые тексты, затем формировать архив для импорта.

Зарегистрируйтесь в сервисе Яндекс.Задания в качестве заказчика.

Пополните баланс на нужную сумму (в рублях). Примерная экономика: 1,85 ₽ за предложение. В диктанте в среднем 15-20 предложений, следовательно, одно написание будет стоить от 28 до 37 рублей.

Можно пополнить баланс с расчётного счёта юрлица.

Создайте новый проект. Шаблон: «Аудио → Расшифровка аудиозаписей».

Название для исполнителей: «Напишите предложение из школьного диктанта».

Описание для исполнителей: «Нужно послушать и записать предложение со всеми знаками препинания, опираясь на собственную грамотность».

Интерфейс задания → Конструктор шаблонов → Конфигурация: вставить json из поля ниже.

json
{
  "view": {
    "type": "view.list",
    "items": [
      {
        "label": "Послушайте предложение из диктанта (это ОДНО предложение)",
        "type": "view.audio",
        "url": {
          "type": "data.input",
          "path": "audio"
        },
        "validation": {
          "type": "condition.played-fully",
          "hint": "Послушайте аудиозапись"
        }
      },
      {
        "type": "field.textarea",
        "label": "Запишите услышанное предложение со всеми знаками препинания, опираясь ТОЛЬКО на собственную грамотность (без словарей, справочников и поисковиков), см. Инструкцию. ",
        "data": {
          "type": "data.output",
          "path": "transcription"
        },
        "validation": {
          "type": "condition.required",
          "hint": "Введите услышанное"
        }
      }
    ]
  },
  "plugins": [
    {
      "type": "plugin.toloka",
      "layout": {
        "kind": "scroll",
        "taskWidth": 500
      }
    }
  ]
}

Инструкция для исполнителей

В поле «Инструкция для исполнителей» вставляется инструкция:

Используйте наушники для прослушивания аудиозаписи.

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

Некоторые правила:
* Тире (в отличие от дефиса) отделяется пробелами с обеих сторон: "это - тире".
* Предложение начинается с заглавной буквы.

Задание будет отклонено, если Ваш текст совсем не похож на продиктованный.

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

Создаётся новый пул заданий («Добавить пул»), для каждого диктанта отдельный. Называние пишется в поле «Название пула (доступно только вам)», например, «Диктант 1» (название текущего диктанта). В публичное описание вставляется инструкция для исполнителей задания (например, Внимательно послушайте и запишите предложение со всеми знаками препинания, опираясь только на собственную грамотность (без словарей, справочников и поисковиков)).

На странице пула выставляются следующие параметры:

  • В поле «Аудитория» убирается галочка «В моих заданиях может содержаться шокирующий или порнографический контент», сохраняется опция «Языки» в поле «= Значение» выставляется «Русский». На шкале «Соотношение скорости и качества» выбирается, например, топ 60% лучших исполнителей.

  • В поле «Контроль качества» удаляются поля «Учитывать последних страниц заданий… Минимальное время на страницу заданий», «Мнение большинства». Оставляется правило контроля качества «Выполненные задания», там проставляются значения: Если отправленных страниц = 3, то приостановить в пуле навсегда — для того, чтобы один человек смог увидеть не более трёх предложений диктанта. В «Причина» вписывается «Ответ получен».

  • В окне «Цена» в поле «Цена за страницу заданий, ₽» выставляется цена 1,85, в поле «Перекрытие» выставляется значение 120.

  • В расширенных настройках → Дополнительные настройки выбирается «Время на страницу заданий, с» — 600, «Тип пула» — Пул с обычными заданиями. Выбирается опция «Сохранять порядок заданий».

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

  1. На странице проекта со всеми пулами заданий навести мышь на нужный и выбрать кнопку «Клонировать».
  2. На странице выбранного пула в дополнительных опциях по кнопке «…» выбрать «Клонировать».

Можно взять готовый шаблон или создать таблицу с нуля.

Формируется таблица в гугл.документах (https://sheet.new/) с двумя листами:

  • INPUT
  • OUTPUT

На листе INPUT добавляется в ячейку A1 строка INPUT:audio.

Ниже вставляются ссылки на аудиофайлы предложений в прямом порядке. Ссылки на предложения можно получить в Учительской: страница диктанта → Страница диктовки → кнопка «Скачать» → «Скачать предложения».

Примерно так должен выглядеть лист:

Далее с листа копируется первый столбец и вставляется в текстовый файл. Каждая ссылка разделяется пустой строкой:

INPUT:audio
https://teacher.dict.orfogrammka.ru/api/media/61f0d7a8a5fd104693b9638c/6235982d9b28050b5b2b8b26.mp3

https://teacher.dict.orfogrammka.ru/api/media/61f0d7a8a5fd104693b9638c/623598f49b28050b5b2b8b33.mp3

https://teacher.dict.orfogrammka.ru/api/media/61f0d7a8a5fd104693b9638c/623599539b28050b5b2b8b3d.mp3

Файл сохраняется с расширением .tsv и загружается в текущий пул задач (кнопка «Загрузить задания»).

На странице пула нажимается кнопка «Запустить разметку». После модерации проект будет запущен и откроется исполнителям.

После выполнения всех заданий можно скачать результаты по кнопке «Скачать результаты» в пуле. В окне скачивания выбираются только статусы «Принятые» и «ID Исполнителя».

Данные из скачанного файла импортируются в таблицу, на лист OUTPUT так, чтобы в каждой строке была ссылка на аудиофайл, текст результата и ID толокера:

1. Значения сортируются по столбцу с «ID толокера» (столбец «C»).
2. Для всех недобросовестных толокеров, явно не старавшихся написать предложения, в столбце «D» пишется слово «бан» (для последующей фильтрации).
3. С помощью фильтра по значению «бан» (в столбце «D») копируются в новый лист с названием «BAN» все строки.
4. В листе «BAN» по столбцу «C» удаляются все повторы, чтобы в «ID толокеров» не осталось дублей.

5. Столбец с «ID толокеров» без первой строки сохраняется в новую таблицу типа ban.csv.
6. На странице Пользователи через «Загрузить файл» (1) загружается получившаяся csv-таблица. При загрузке списка пользователей нажимается «Добавить». На открывшейся странице с пользователями выбирается кнопка «Заблокировать» (2), место блокировки в открывшемся окне — «У меня».


7. В изначальном листе с помощью фильтра выбираются все строки без значения «бан», копируются и вставляются в новый лист с названием «OUTPUT». Старый лист удаляется.
8. Все строки сортируются по столбцу «B» («Сортировать А > Я»), чтобы было проще убирать лишнее: удаляются пустые строки, обрывочные написания, незаконченные предложения (пропуск двух и более слов).

После анализа таблица готова для работы скрипта по формированию текстов диктанта.

В среде AppsScript создаётся новый проект (или можно запросить доступ к готовому проекту). Вставляется следующий код ниже.

js
//--------------------------------------------------------------------------------------------
//                        ---=== основные параметры скрипта ===---
//
// URL таблицы с данными по диктанту в нужном формате: два листа INPUT, OUTPUT. 
// В первом упорядоченные ссылки на звуковые фрагменты по предложениям, во втором результаты из Толоки
const sheetName = 'https://docs.google.com/spreadsheets/d/1fbP4rylF5ryZS905D2xlgA9qhRimD6IxpHPR-bbz3tE/edit'; 
//
// id директории, куда сохранять файлы диктантов (берётся из URL'а https://drive.google.com/drive/folders/%id)
const folderSave = '1s9p2RBowh3hou94p_jDdJ1Zv4Ty7fqu-'; 
//
//id диктанта из Учительской (берётся из URL'а диктанта)
const dictId = '61f8e9a6a5fd104693b9646d'; 
//--------------------------------------------------------------------------------------------
 
function RunImport() { 
  Logger.log("Запуск скрипта формирования текстов диктантов из результатов Яндекс.Толоки...");  //https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app
 
 
  var sheetDict = SpreadsheetApp.openByUrl(sheetName); 
  Logger.log('Получен доступ к гугл.таблице "%s"', sheetDict.getName());
  var dictFolder = DriveApp.getFolderById(folderSave); 
  Logger.log('Получен доступ к директории "%s"', dictFolder.getName());
 
  var range = sheetDict.getRange("INPUT!A2:A100");  //задаём название листа и интервал со значениями ссылок на диктовки предложений (задания в Толоке)
  var sentencesIds = getSentenceIds(range.getValues());  
  var range = sheetDict.getRange("OUTPUT!A2:B"); //задаём название листа и интервал со значениями результатов Толоки  
  mergeResults(range.getValues(), sentencesIds, dictFolder);  
  Logger.log("Готово!");        
};
 
function saveDict(text, dictFolder){  
  var fileName = dictId + '_' + createUUID() + '.txt';
  dictFolder.createFile(fileName, text);  
  Logger.log('диктант "%s" сохранён (размер %d символов)', fileName, text.length);  
}
 
function mergeResults(valuesInput, sentencesIds, dictFolder){
  var dictText = [];
  var link = '';
  var text = '';
  var idx = -1;
 
  for (var i = 0,countLines = valuesInput.length; i < countLines; i++)   {
   link =  valuesInput[i][0].trim();
   text = valuesInput[i][1].trim();
 
   if (link.length > 2 && text.length > 2) {
     idx = sentencesIds.indexOf(link);
     if (idx == -1) { 
       Logger.log('В таблице предложений не найден элемент со ссылкой %s', link) 
     } else {
       if (dictText[idx] == null) {
         dictText[idx] = text;
         valuesInput[i][0] = '?';
         valuesInput[i][1] = '?';
         if (Object.keys(dictText).length == sentencesIds.length) 
         {
           var fullText = dictText.join(" ");           
           saveDict(fullText, dictFolder);
           dictText.length = 0;           
           i = 0;
         }
       }
     }
   }  
  }    
}
 
// получение массива id предложений по ссылкам на аудиозаписи
function getSentenceIds(valuesInput){
 
  var sentencesIds = [];
  for (var i = 0,countLines = valuesInput.length; i < countLines; i++)   {
   if (valuesInput[i][0].length > 1) {
     sentencesIds.push(valuesInput[i][0].trim())
   }
  }
  return (sentencesIds)
}
 
function createUUID() {
    // http://www.ietf.org/rfc/rfc4122.txt
    var s = [];
    var hexDigits = "0123456789abcdef";
    for (var i = 0; i < 36; i++) {
        s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
    }
    s[14] = "4";  
    s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  
    //s[8] = s[13] = s[18] = s[23] = "-";
 
    var uuid = s.join("");
    return uuid;
}

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

После заполнения нужных параметров нажимается команда «Выполнить».

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

Архив импортируется в Учительскую в формате для импорта.

В комментарии к Редмайн-задаче даётся ссылка на гугл-таблицу, ссылка на «Карту ошибок», прикрепляется zip-архив с текстами из Яндекс.Заданий.

  • /opt/bitnami/dokuwiki/data/pages/tech/toloka.txt
  • Последнее изменение: 2024/02/10 00:12
  • anastasia_melnikova