Это старая версия документа!


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

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

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

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

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

Пополните баланс на нужную сумму (в рублях). Примерная экономика: 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
      }
    }
  ]
}

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

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

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

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

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

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

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

Создаётся новый пул заданий («Create new pool»), для каждого диктанта отдельный. В поле «Pool type» выбирается опция «General tasks». Называние пишется в поле «Pool name (private)», например, «Диктант 1» (название текущего диктанта). В «Private comment» записывается название проекта.

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

  • На странице «Select the audience for your task» убирается галочка «My task may contain shocking or pornographic content», сохраняется опция «Languages» в поле «= Value» выставляется «Russian», ставится галочка «Tolokers who passed the language test». На шкале «Specify the percentage of top-rated Tolokers who can access tasks in the pool» выбирается, например, топ 60% лучших исполнителей.

  • На странице «Set up quality control» удаляется окошко с полями «Recent task suites to use… Minimum time per task suite». Через новое «Add a quality control rule» выбирается правило контроля качества «Submitted responses», там проставляются значения: If submitted tasks suites = 3, then suspend in pool permanently — для того, чтобы один человек смог увидеть не более трёх предложений диктанта. В «Reason» вписывается «Ответ получен».

  • На странице «Set the task price and overlap» в поле «Price per task suite, $» выставляется цена 0,02, в поле «Number of Tolokers per task Overlap» выставляется значение 120.

  • На странице «Add optional pool settings» проставляется галочка «Keep task order», остальные параметры оставляются по умолчанию.

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

Формируется таблица в гугл.документах (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 и загружается в текущий пул задач (страница «Prepare and upload data»). После «Continue» в окне «Smart mixing» выставляются параметры: «General tasks» — 1, «Control tasks» — 0, «Training tasks» — 0.

У оставшегося окна нажимается «Do it later».

На открывшейся странице («Overview») нажимается «Start labeling»«Launch». После модерации Толоки проект будет запущен и откроется толокерам.

После выполнения всех заданий толокерами можно скачать результаты по кнопке «Download results» в пуле. В окне скачивания выбираются только статусы «General», «Accepted», «Toloker ID», «Include responses from banned Tolokers».

Данные из скачанного файла импортируются в таблицу, на лист 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/attic/tech/toloka.1707521245.txt.gz
  • Последнее изменение: 2024/02/09 23:27
  • anastasia_melnikova