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


Тестирование диктанта в Яндекс.Толоке

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

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

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

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

Пополните баланс на нужную сумму (в долларах). Примерная экономика: 3 цента за предложение. В диктанте в среднем 15-20 предложений, следовательно, одно написание будет стоить от 45 до 60 центов.

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

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

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

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

Интерфейс задания:

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».

Выставляется русский язык. Принимаются только исполнители, сдавшие тест на знание языка. Выбирается, например, топ 50% лучших исполнителей.

Цена: $0,02

Контроль качества: перекрытие задания — ставится число написаний диктанта, которое нужно получить. Например, 100 написаний. Добавляется правило контроля качества: если отправленных страниц заданий = 3, то приостановить в пуле навсегда — для того, чтобы один человек смог увидеть не более трёх предложений диктанта.

Тип пула: Пул с обычными заданиями.

Поставить галочку: сохранять порядок заданий.

Формируется таблица в гугл.документах (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

Файл сохраняется и загружается в текущий пул задач (кнопка «Загрузить»). Количество заданий на странице выбирается как «По пустой строке».

Можно взять готовый шаблон.

Разметка запускается и можно попить кофе, пока толокеры выполняют задания.

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

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

Следует просмотреть глазами все результаты, чтобы вручную удалить пустые и некорректные строки (сочетание Ctrl + Alt + -).

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

В среде 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;
}

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

Или можно запросить доступ к готовому проекту.

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

Архив для импорта готов.

  • /opt/bitnami/dokuwiki/data/attic/tech/toloka.1660805755.txt.gz
  • Последнее изменение: 2022/08/18 06:55
  • dmitry_kalashnikov