Além da sobreposição total: cobertura adaptativa de anotadores para grandes conjuntos de dados
Rotular tudo em duplicado sai caro; rotular tudo uma única vez deixa você às cegas. O Potato 2.6 permite atribuir um anotador à maioria dos itens e três a uma amostra estratificada, com reforços adaptativos e encaminhamento automático para arbitragem.
Todo projeto de anotação de porte considerável tem uma tensão recorrente. Se cada item recebe dois ou três anotadores, você consegue medir a concordância e confiar nos seus rótulos, mas acabou de multiplicar o orçamento por dois ou por três. Se cada item recebe um único anotador, você rotula três vezes mais dados pelo mesmo dinheiro e não faz a menor ideia de quão confiável é qualquer um deles.
O meio-termo de sempre é bem conhecido de quem já conduziu um estudo: anotar a maior parte do corpus uma única vez e anotar em duplicado ou triplicado uma pequena amostra para vigiar a qualidade. O problema sempre foi fazer a ferramenta executar isso de forma limpa e, depois, fazer algo com a sobreposição quando ela está em mãos. O Potato 2.6 incorpora esse desenho de fábrica, por meio de dois blocos de configuração (num_annotators_per_item e per_annotator_quota), além de reforços adaptativos e encaminhamento para arbitragem.
Este artigo percorre o desenho de cobertura, do caso simples ao adaptativo. A documentação de cobertura heterogênea traz a referência completa.
Cobertura adaptativa de anotadores no Potato
Limites por item com uma amostra de sobreposição
num_annotators_per_item aceita um único inteiro como limite uniforme, ou um mapeamento estruturado quando você quer cobrir itens diferentes de modos diferentes. A forma comum é um valor padrão de um, com uma amostra estratificada elevada a três:
num_annotators_per_item:
default: 1
overlap_sample:
fraction: 0.1
count: 3
stratify_by: domain
seed: 42
min: 1O bloco overlap_sample eleva o limite sobre um subconjunto determinístico de itens. A amostragem ocorre uma única vez na inicialização, e os itens escolhidos ficam marcados internamente, de modo que a lógica de atribuição passa a tratá-los como de alta cobertura dali em diante. Os campos são diretos: fraction é a proporção amostrada, count é o limite elevado (precisa exceder o valor padrão) e seed torna a escolha reprodutível entre reinicializações.
O detalhe em que vale a pena se deter é stratify_by. Aponte-o para um campo dos seus dados (domain aqui) e a proporção é aplicada por estrato, em vez de sobre o conjunto inteiro. Cada categoria contribui para a amostra de sobreposição de forma proporcional, então você não mede concordância sobre uma amostra que por acaso é 90% de um único domínio. Se o seu corpus mistura notícias, redes sociais e textos clínicos, cada um aparece na amostra de qualidade na proporção do seu tamanho.
Reforço adaptativo: gaste mais onde é difícil
Uma amostra de sobreposição fixa é escolhida às cegas, antes de alguém ter anotado qualquer coisa. Mas os itens que mais precisam de um segundo e um terceiro olhar são aqueles em que os anotadores de fato discordam, e você só descobre quais são depois da primeira passagem. O reforço adaptativo trata exatamente disso:
num_annotators_per_item:
default: 1
adaptive:
enabled: true
disagreement_threshold: 0.5
boost_to: 3Assim que um item tem ao menos duas anotações e sua pontuação de desacordo cruza disagreement_threshold, seu limite é elevado a boost_to e o item volta à fila de atribuição para mais uma passagem. O reforço acontece uma única vez por item, então um item controverso recebe uma única escalada em vez de sair de controle. É uma cobertura que acompanha a dificuldade dos dados em vez de adivinhá-la de antemão.
Cotas por anotador
Os limites de cobertura controlam quantos anotadores cada item recebe. Um bloco separado controla quantos itens cada anotador recebe, algo que normalmente se quer variar conforme a experiência ou o contrato:
per_annotator_quota:
default: 100
by_user:
alice: 30
by_user_role:
expert: 30
novice: 200
user_roles:
alice: expert
carol: noviceA resolução vai do mais específico primeiro: by_user[uid], depois by_user_role[user_roles[uid]], por fim default. Assim você pode limitar um especialista específico a 30 itens, todo outro especialista a 30 por papel e os iniciantes a 200, sem que os dois sistemas interfiram nos limites por item acima.
Transformar a sobreposição em decisão
Coletar sobreposição é só metade do trabalho; o ponto é agir sobre os desacordos. Com o bloco de arbitragem ativado, os itens da amostra de sobreposição que atingem seu limite são pontuados automaticamente e empurrados para uma fila de arbitragem quando a concordância cai abaixo do seu limiar:
adjudication:
enabled: true
adjudicator_users: [admin]
min_annotations: 2
agreement_threshold: 0.75O efeito é que os itens de baixa concordância afloram no exato momento em que a amostra satura, em vez de esperar que alguém se lembre de reconstruir a fila manualmente. Um arbitrador abre a fila e vê os itens genuinamente contestados, já filtrados do grosso em que todos concordaram.
Lendo a concordância
Assim que os itens da amostra de sobreposição saturam, as estatísticas de concordância ficam disponíveis em /admin/iaa. O endpoint computa a métrica apropriada ao tipo de cada esquema em vez de impor um único número a tudo: kappa de Cohen e de Fleiss para esquemas nominais, weighted kappa para os ordinais, e kappa em nível de token mais span F1 para spans. Isso importa porque um κ calculado como se suas avaliações Likert ordinais fossem categorias sem ordem subestimaria a concordância real.
Para experimentar
Uma demonstração executável vem com a versão. A partir da raiz do repositório:
python potato/flask_server.py start examples/advanced/heterogeneous-coverage/config.yaml -p 8000Ela usa 20 itens de dois domínios, amostra 20% para uma sobreposição de três anotadores estratificada por domínio, ativa um reforço adaptativo no limiar de 0,5, define dois níveis de experiência e encaminha os itens de baixa concordância para a arbitragem: todo o desenho acima, de ponta a ponta.
A forma de um bom plano de cobertura
Reunido, o desenho permite decidir para onde vai seu orçamento de anotação em vez de espalhá-lo de modo uniforme. A maioria dos itens recebe uma passagem. Uma fatia estratificada recebe três, de modo que você pode relatar a confiabilidade em todo o corpus, e não apenas em um canto dele. Os itens que se revelam genuinamente difíceis são escalados automaticamente, e os contestados são encaminhados a um arbitrador. Você gasta o máximo nos dados mais incertos e pode defender cada decisão de cobertura em uma seção de métodos.
Quantos anotadores você de fato precisa para uma dada tarefa é uma questão à parte; o artigo quantos anotadores você precisa percorre as regras práticas. Esta versão trata de tornar fácil de expressar qualquer resposta a que você chegue. A cobertura heterogênea vem no Potato 2.6; consulte a documentação de cobertura heterogênea e a referência de atribuição de tarefas para tudo o que os blocos acima podem fazer.