;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Como uma cidade nos EUA quer monitorar a fala para inibir a violência

Discurso de ódio - Mwangi Gatheca/Unsplash
Discurso de ódio Imagem: Mwangi Gatheca/Unsplash

Adriano Ferreira

Colaboração para o TAB

23/06/2020 04h00

Desde novembro de 2019, as autoridades de Chattanooga, no Tennessee (EUA), monitoram a fala para detectar palavras de ódio em tempo real. A medida tem o propósito de impedir atos violentos antes que aconteçam, e evitar crimes.

Em um banco de dados chamado de Hatebase (base do ódio, em tradução livre), cidadãos podem registrar palavras proferidas por outros com teor ameaçador, ofensivo e perigoso, para auxiliar investigações em lugares que possam se tornar alvos de ataques.

A base de dados é feita por uma empresa canadense chamada Hatebase, que atua em 200 países e registra termos ofensivos em 97 línguas e é parte do Projeto Sentinela. A cidade com aproximadamente 180 mil habitantes é a primeira do país a usar o recurso tecnológico.

Qualquer pessoa da região de Chattanooga que foi alvo de palavras racistas e discriminatórias deverá registrá-las em um formulário online, ado por um link no site da prefeitura. Quem presenciou a situação também é incentivado a fazer a denúncia. No formulário, o habitante da cidade preenche os termos usados, como eles podem ser entendidos pelo ouvinte, onde foram ditos, a quem estavam direcionados e a língua falada. As informações são enviadas de forma anônima. A denúncia será armazenada no Hatebase.

Por dia, a automação dessa tecnologia de armazenamento examina de mil a dez mil pontos de dados, dos quais algumas centenas se enquadram na classificação de discursos de ódio. Considerando o grande tráfego de internet, os EUA são o país com maior registro de termos ofensivos.

Histórico de discriminação

Essa nova maneira de detectar discursos intolerantes procura inibir a violência que já afetou a comunidade local anteriormente. Em 26 de julho de 2015, a cidade foi palco de sete assassinatos provocados por um muçulmano radical, Muhammad Youssef Abdulazeez, 24, em duas bases militares dos EUA. Atualmente, devido ao tenebroso episódio, os residentes muçulmanos locais temem reações de vingança.

Para a prefeitura, o desafio hoje é construir uma comunidade mais segura e acolhedora. Para isso, a linguagem abusiva terá uma avaliação que apontará a relação entre o discurso de ódio e os seus crimes contra grupos específicos. Esse tipo de iniciativa é utilizado com sucesso em países que monitoram a linguagem em conflitos étnicos armados, como Uganda, Kenya, Iraque e Burma.

A parceria de Chattanooga com o Hatebase, até o momento, não resultou em nenhuma ação penal ou investigação. "O estágio do monitoramento ainda está em um nível muito inicial, por isso, não tenho nenhum caso específico de consequências que podem acontecer", informa Kerry Hayes, chefe de equipe do escritório da prefeitura de Chattanooga.

A "base do ódio", por sua vez, não acompanha os resultados dos casos que procuram reduzir a violência pelo monitoramento das palavras cruéis. "Atuamos apenas com dados incorporados, sem análises individuais de riscos. Neutralizar a violência originada de um discurso de ódio, no mundo real, exige um entendimento amplo de tendências de dados", afirma Timothy Quinn, diretor do Hatebase.Pela perspectiva da empresa, ainda que uma pessoa registre um termo ofensivo que não tenha sido dito por ninguém, o dado é qualificado como válido porque existe alguém informando um termo de ódio.

Felipe Fontes, ativista social e fundador do Nearbee, empresa de tecnologia para proteção à vida, afirma que a iniciativa "é eficaz para a coleta de dados, porém é mais branda do que um formato onde o discurso de ódio seria criminalizado. No momento em que é criminalizado, não só a estatística, mas também um processo legal contra o indivíduo seriam promovidos, o que pode depender da liberdade de expressão contra as palavras ofensivas e até onde isso vira crime".

O ativista ainda alerta para o risco de que as estatísticas de palavras de ódio originadas através de um formulário e a sua divulgação pública, disponibilizada pela prefeitura, possam causar um efeito colateral. Qualquer um, bem intencionado ou não, que quiser buscar o lugar onde o discurso de ódio é proferido, poderá encontrar.