[{"data":1,"prerenderedAt":314},["ShallowReactive",2],{"page-\u002Fqualia\u002Fgomtch-encontre-texto-mesmo-que-ele-nao-queira-ser-encontrado":3},{"id":4,"title":5,"body":6,"description":172,"extension":304,"meta":305,"navigation":306,"path":307,"published-at":308,"rawbody":309,"seo":310,"stem":311,"written-at":312,"__hash__":313},"content\u002Fqualia\u002Fgomtch-encontre-texto-mesmo-que-ele-nao-queira-ser-encontrado.md","gomtch —encontre texto mesmo que ele não queira ser encontrado!",{"type":7,"value":8,"toc":296},"minimark",[9,14,18,29,77,80,93,96,99,107,111,122,131,138,141,160,164,167,174,180,195,202,209,213,231,264,278,282,288],[10,11,13],"h2",{"id":12},"um-pouco-de-contexto","Um pouco de contexto",[15,16,17],"p",{},"Com as discussões sobre censura e liberdade de expressão nas redes sociais, fica fácil perder de vista a parte técnica que permeia qualquer decisão que pode ser tomada pelas plataformas. Por mais avançados que sejam os algorítmos e as I.A que analisam textos publicados por usuários, ainda assim, pouco pode uma máquina fazer quando um usuário esperto quer esconder a transmissão de uma informação.",[15,19,20,21,28],{},"Um bom exemplo talvez seja o ",[22,23,27],"a",{"href":24,"rel":25},"https:\u002F\u002Fpt.wikipedia.org\u002Fwiki\u002FLeet",[26],"nofollow","Leet"," que foi criado para enganar filtros de texto em plataformas e permitir que usuários tramitissem informações não permitidas.",[30,31,32],"blockquote",{},[15,33,34,35,39,40,43,44,47,48,53,54,59,60,65,66,69,70,43,73,76],{},"O ",[36,37,38],"strong",{},"leet",", também conhecido como ",[36,41,42],{},"eleet"," ou ",[36,45,46],{},"leetspeak"," é uma alternativa ao ",[22,49,52],{"href":50,"rel":51},"https:\u002F\u002Fpt.wikipedia.org\u002Fwiki\u002FAlfabeto",[26],"alfabeto"," inicialmente usado para o idioma inglês, usado principalmente na internet. Ele usa várias combinações de caracteres ",[22,55,58],{"href":56,"rel":57},"https:\u002F\u002Fpt.wikipedia.org\u002Fwiki\u002FASCII",[26],"ASCII"," para substituir letras do ",[22,61,64],{"href":62,"rel":63},"https:\u002F\u002Fpt.wikipedia.org\u002Fwiki\u002FAlfabeto_latino",[26],"alfabeto latino",". Por exemplo, a própria palavra leet admite muitas variações, quando é escrita em leet como ",[36,67,68],{},"l33t",", ",[36,71,72],{},"1337",[36,74,75],{},"l337"," e a palavra eleet pode ser escrita como 31337 ou 3l33t.¹",[15,78,79],{},"Fica claro que a transmissão de informações escritas é mais complexa do que simplesmente “escrever corretamente”. Contanto que o interlocutor seja capaz de entender a mensagem, a comunicação pode ser considerada estabelecida com sucesso.",[30,81,82],{},[15,83,84,85,88,89,92],{},"In visual word recognition a reader is able to recognize single letters at an abstract level independently of the physical properties of these letters. Readers perform fine-grained discrimination processes to correctly differentiate between very similar strings (e.g., foe and toe), while at the same time they overlook small differences to achieve the corresponding abstract letter representation from different allographs of the same lexical item (e.g., foot, ",[36,86,87],{},"F","o",[36,90,91],{},"O","t, FOOT).²",[15,94,95],{},"Apresenta-se então um desafio para as plataformas. Mesmo que haja um esforço em criar punições para usuários que infrinjam os termos de uso da comunidade (normalmente propagação de discursos de ódio em geral), como encontrar os usuários infratores?",[15,97,98],{},"Claro, pode-se contratar funcionários apenas para analisar posts (como faz o Facebook até este artigo ser publicado) e com os resultados criar modelos de I.A que encontrem os “termos proibidos” antes mesmo destes irem ao ar na plataforma. Porém, é importante ter em vista que modelos de I.A são trabalhosos em questão de desenvolvimento, custosos em termo de execução e requerem uma amostra grande (para não dizer enorme) de exemplos para treinamento.",[15,100,101,106],{},[22,102,105],{"href":103,"rel":104},"https:\u002F\u002Fgithub.com\u002Fnicolasassi\u002Fgomtch",[26],"gomtch"," se apresenta como uma solução de custo reduzido para resolver este problema.",[10,108,110],{"id":109},"o-que-é-gomtch","O que é gomtch",[15,112,113,116,117,121],{},[22,114,105],{"href":103,"rel":115},[26]," é uma ferramenta completamente em Go para comparação de documentos. A solução apresenta uma série de funcionalidades já integradas para normalização de texto e generalização de casos de acordo com a configuração desejada pelo usuário para cada documento por meio da API. Ao final do processo, idealmente, o usuário teria como resultado um mapa de ",[118,119,120],"em",{},"matches"," sendo que as chaves são os documentos encontrados e os valores qual a forma em que foram encontrados no texto (ex: Documento é “amigo” e a forma é “am!go”).",[30,123,124],{},[15,125,126,127,130],{},"Soluções com o mesmo propósito já existem aos montes, ",[22,128,105],{"href":103,"rel":129},[26]," se propõe a ser apenas mais uma com sua implementação especifica, além de focar em trazer flexibilidade ao usuário da API e suporte para idiomas além do inglês.",[15,132,133,134,137],{},"Diferente de outras ferramentas com o mesmo propósito, ",[22,135,105],{"href":103,"rel":136},[26]," não retorna uma porcentagem a partir da comparação dos documentos, ao invés disso ele retorna diretamente quais documentos foram encontrados.",[15,139,140],{},"Algumas das funcionalidades para normalização de texto já implementadas são:",[142,143,144,148,151,154,157],"ul",{},[145,146,147],"li",{},"parseamento de HTML (remove todas as tags HTML e mantém apenas o texto)",[145,149,150],{},"remoção de caracteres sequenciais (reaaal = real)",[145,152,153],{},"normalização para UPPER ou lowercase",[145,155,156],{},"normalização de unicode (canção = cancao)",[145,158,159],{},"substituição de caracteres\u002Ftermos ou por meio de regex",[10,161,163],{"id":162},"pipeline","Pipeline",[15,165,166],{},"Press enter or click to view image in full size",[15,168,169],{},[170,171],"img",{"alt":172,"src":173},"","https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1000\u002F1*71GOHsuZlpVevWJeAM2MxA.jpeg",[15,175,176,179],{},[22,177,105],{"href":103,"rel":178},[26]," não diferencia entre documentos de referência e documentos de comparação, assim, estes são intercambiáveis.",[15,181,182,183,186,187,190,191,194],{},"Ao criar um novo documento a partir de um corpo de texto quaisquer, ",[22,184,105],{"href":103,"rel":185},[26]," automaticamente normaliza e ",[118,188,189],{},"tokeniza"," de acordo com as configurações fornecidas pelo usuário. Todas as normalizações e a forma de ",[118,192,193],{},"tokenização"," são opcionais.",[15,196,197,198,201],{},"O usuário pode comparar um documento (o documento de referência) com ",[118,199,200],{},"n"," outros documentos (documentos de comparação). Quanto mais documentos de comparação maior o tempo de execução da aplicação. O tamanho do documento de referência também impacta no tempo de execução da aplicação.",[15,203,204,205,208],{},"Por fim, a solução retorna um mapa com o ",[118,206,207],{},"index"," dos documentos encontrados como chave e a forma dos valores encontrados como valores das chaves.",[10,210,212],{"id":211},"match-scores-e-heurísticas-de-comparação","Match scores e heurísticas de comparação",[15,214,215,216,219,220,222,223,226,227,230],{},"Cada comparação funciona a partir de um ",[118,217,218],{},"match-score"," escolhido pelo usuário da API. O ",[118,221,218],{}," pode ser tão simples quanto um número que representará a porcentagem que um token precisa ser igual ao token a sem comparado (",[118,224,225],{},"minimum match-score",") quanto uma função complexa (",[118,228,229],{},"custom match-score",").",[15,232,233,236,237,239,240,243,244,247,248,251,252,255,256,259,260,263],{},[118,234,235],{},"Match-scores"," são muito importantes pois indicam à ferramenta como esta deve trabalhar com caracteres especiais e números presentes nos documentos. Sendo o ",[118,238,218],{}," de 100%, por exemplo, ",[22,241,105],{"href":103,"rel":242},[26]," vai considerar qualquer subversão à um token como sendo uma diferença (ex: ",[118,245,246],{},"match-score 100% :"," amigo != amig0). Já com ",[118,249,250],{},"match-scores"," mais brandos ou funções de ",[118,253,254],{},"match-score,"," ",[22,257,105],{"href":103,"rel":258},[26]," pode considerar tokens diferentes como iguais (ex: ",[118,261,262],{},"match-score 90% :"," amigo == amig0).",[15,265,266,267,270,271,274,275,277],{},"É importante ter em mente que por padrão ",[22,268,105],{"href":103,"rel":269},[26]," compara números com números e só considera igualdade completa (ex: 1 == 1). Também, ",[22,272,105],{"href":103,"rel":273},[26]," só considera letras com letras (ex: A == A). Por fim, comparações de números com letras e letras com caracteres especiais são orquestradas pelo ",[118,276,218],{}," definido pelo usuário.",[10,279,281],{"id":280},"referências","Referências",[15,283,284,285],{},"¹ ",[22,286,24],{"href":24,"rel":287},[26],[15,289,290,291],{},"² ",[22,292,295],{"href":293,"rel":294},"http:\u002F\u002Fjaduna.webs.ull.es\u002FMolinaro_etal_NeuroPsy_2009.pdf",[26],"Nicola Molinaro, Jon Andoni Duñabeitia, Alejandro Marìn-Gutièrrez, Manuel Carreiras. From numbers to letters: Feedback regularization in visual word recognition.",{"title":172,"searchDepth":297,"depth":297,"links":298},2,[299,300,301,302,303],{"id":12,"depth":297,"text":13},{"id":109,"depth":297,"text":110},{"id":162,"depth":297,"text":163},{"id":211,"depth":297,"text":212},{"id":280,"depth":297,"text":281},"md",{},true,"\u002Fqualia\u002Fgomtch-encontre-texto-mesmo-que-ele-nao-queira-ser-encontrado","2026-04-20","---\ntitle: \"gomtch —encontre texto mesmo que ele não queira ser encontrado!\"\nwritten-at: 2020-12-30\npublished-at: 2026-04-20\n---\n\n## Um pouco de contexto\n\nCom as discussões sobre censura e liberdade de expressão nas redes sociais, fica fácil perder de vista a parte técnica que permeia qualquer decisão que pode ser tomada pelas plataformas. Por mais avançados que sejam os algorítmos e as I.A que analisam textos publicados por usuários, ainda assim, pouco pode uma máquina fazer quando um usuário esperto quer esconder a transmissão de uma informação.\n\nUm bom exemplo talvez seja o [Leet](https:\u002F\u002Fpt.wikipedia.org\u002Fwiki\u002FLeet) que foi criado para enganar filtros de texto em plataformas e permitir que usuários tramitissem informações não permitidas.\n\n> O **leet**, também conhecido como **eleet** ou **leetspeak** é uma alternativa ao [alfabeto](https:\u002F\u002Fpt.wikipedia.org\u002Fwiki\u002FAlfabeto) inicialmente usado para o idioma inglês, usado principalmente na internet. Ele usa várias combinações de caracteres [ASCII](https:\u002F\u002Fpt.wikipedia.org\u002Fwiki\u002FASCII) para substituir letras do [alfabeto latino](https:\u002F\u002Fpt.wikipedia.org\u002Fwiki\u002FAlfabeto_latino). Por exemplo, a própria palavra leet admite muitas variações, quando é escrita em leet como **l33t**, **1337** ou **l337** e a palavra eleet pode ser escrita como 31337 ou 3l33t.¹\n\nFica claro que a transmissão de informações escritas é mais complexa do que simplesmente “escrever corretamente”. Contanto que o interlocutor seja capaz de entender a mensagem, a comunicação pode ser considerada estabelecida com sucesso.\n\n> In visual word recognition a reader is able to recognize single letters at an abstract level independently of the physical properties of these letters. Readers perform fine-grained discrimination processes to correctly differentiate between very similar strings (e.g., foe and toe), while at the same time they overlook small differences to achieve the corresponding abstract letter representation from different allographs of the same lexical item (e.g., foot, **F**o**O**t, FOOT).²\n\nApresenta-se então um desafio para as plataformas. Mesmo que haja um esforço em criar punições para usuários que infrinjam os termos de uso da comunidade (normalmente propagação de discursos de ódio em geral), como encontrar os usuários infratores?\n\nClaro, pode-se contratar funcionários apenas para analisar posts (como faz o Facebook até este artigo ser publicado) e com os resultados criar modelos de I.A que encontrem os “termos proibidos” antes mesmo destes irem ao ar na plataforma. Porém, é importante ter em vista que modelos de I.A são trabalhosos em questão de desenvolvimento, custosos em termo de execução e requerem uma amostra grande (para não dizer enorme) de exemplos para treinamento.\n\n[gomtch](https:\u002F\u002Fgithub.com\u002Fnicolasassi\u002Fgomtch) se apresenta como uma solução de custo reduzido para resolver este problema.\n\n## O que é gomtch\n\n[gomtch](https:\u002F\u002Fgithub.com\u002Fnicolasassi\u002Fgomtch) é uma ferramenta completamente em Go para comparação de documentos. A solução apresenta uma série de funcionalidades já integradas para normalização de texto e generalização de casos de acordo com a configuração desejada pelo usuário para cada documento por meio da API. Ao final do processo, idealmente, o usuário teria como resultado um mapa de _matches_ sendo que as chaves são os documentos encontrados e os valores qual a forma em que foram encontrados no texto (ex: Documento é “amigo” e a forma é “am!go”).\n\n> Soluções com o mesmo propósito já existem aos montes, [gomtch](https:\u002F\u002Fgithub.com\u002Fnicolasassi\u002Fgomtch) se propõe a ser apenas mais uma com sua implementação especifica, além de focar em trazer flexibilidade ao usuário da API e suporte para idiomas além do inglês.\n\nDiferente de outras ferramentas com o mesmo propósito, [gomtch](https:\u002F\u002Fgithub.com\u002Fnicolasassi\u002Fgomtch) não retorna uma porcentagem a partir da comparação dos documentos, ao invés disso ele retorna diretamente quais documentos foram encontrados.\n\nAlgumas das funcionalidades para normalização de texto já implementadas são:\n\n- parseamento de HTML (remove todas as tags HTML e mantém apenas o texto)\n- remoção de caracteres sequenciais (reaaal = real)\n- normalização para UPPER ou lowercase\n- normalização de unicode (canção = cancao)\n- substituição de caracteres\u002Ftermos ou por meio de regex\n\n## Pipeline\n\nPress enter or click to view image in full size\n\n![](https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1000\u002F1*71GOHsuZlpVevWJeAM2MxA.jpeg)\n\n[gomtch](https:\u002F\u002Fgithub.com\u002Fnicolasassi\u002Fgomtch) não diferencia entre documentos de referência e documentos de comparação, assim, estes são intercambiáveis.\n\nAo criar um novo documento a partir de um corpo de texto quaisquer, [gomtch](https:\u002F\u002Fgithub.com\u002Fnicolasassi\u002Fgomtch) automaticamente normaliza e *tokeniza* de acordo com as configurações fornecidas pelo usuário. Todas as normalizações e a forma de *tokenização* são opcionais.\n\nO usuário pode comparar um documento (o documento de referência) com _n_ outros documentos (documentos de comparação). Quanto mais documentos de comparação maior o tempo de execução da aplicação. O tamanho do documento de referência também impacta no tempo de execução da aplicação.\n\nPor fim, a solução retorna um mapa com o _index_ dos documentos encontrados como chave e a forma dos valores encontrados como valores das chaves.\n\n## Match scores e heurísticas de comparação\n\nCada comparação funciona a partir de um _match-score_ escolhido pelo usuário da API. O _match-score_ pode ser tão simples quanto um número que representará a porcentagem que um token precisa ser igual ao token a sem comparado (_minimum match-score_) quanto uma função complexa (_custom match-score_).\n\n_Match-scores_ são muito importantes pois indicam à ferramenta como esta deve trabalhar com caracteres especiais e números presentes nos documentos. Sendo o _match-score_ de 100%, por exemplo, [gomtch](https:\u002F\u002Fgithub.com\u002Fnicolasassi\u002Fgomtch) vai considerar qualquer subversão à um token como sendo uma diferença (ex: _match-score 100% :_ amigo != amig0). Já com _match-scores_ mais brandos ou funções de _match-score,_ [gomtch](https:\u002F\u002Fgithub.com\u002Fnicolasassi\u002Fgomtch) pode considerar tokens diferentes como iguais (ex: _match-score 90% :_ amigo == amig0).\n\nÉ importante ter em mente que por padrão [gomtch](https:\u002F\u002Fgithub.com\u002Fnicolasassi\u002Fgomtch) compara números com números e só considera igualdade completa (ex: 1 == 1). Também, [gomtch](https:\u002F\u002Fgithub.com\u002Fnicolasassi\u002Fgomtch) só considera letras com letras (ex: A == A). Por fim, comparações de números com letras e letras com caracteres especiais são orquestradas pelo _match-score_ definido pelo usuário.\n\n## Referências\n\n¹ [https:\u002F\u002Fpt.wikipedia.org\u002Fwiki\u002FLeet](https:\u002F\u002Fpt.wikipedia.org\u002Fwiki\u002FLeet)\n\n² [Nicola Molinaro, Jon Andoni Duñabeitia, Alejandro Marìn-Gutièrrez, Manuel Carreiras. From numbers to letters: Feedback regularization in visual word recognition.](http:\u002F\u002Fjaduna.webs.ull.es\u002FMolinaro_etal_NeuroPsy_2009.pdf)",{"title":5,"description":172},"qualia\u002Fgomtch-encontre-texto-mesmo-que-ele-nao-queira-ser-encontrado","2020-12-30","GVlYFsZtWuLCUF9vQoiwSb_V3waAw7i41syCaNno5GY",1776715314687]