Blogue ·
Um plural vago não é um número
Uma guarda que compara números em nove línguas comunicou dois defeitos que não eram defeitos, e aprovou duas línguas por razões alheias a números.
Por Provibr
Todos os artigos que publicamos existem em nove línguas, e a coisa com mais probabilidade de correr mal numa tradução não é uma palavra. É um número. Uma contagem que diz 200 numa língua e 20 noutra é invisível para um leitor que só vê uma delas, e não há corretor ortográfico para isso.
Por isso há uma guarda. Pega na fonte inglesa, extrai os números, e exige que cada tradução contenha pelo menos tantas ocorrências do mesmo valor. Esta ronda produziu dois relatórios vermelhos sobre duas traduções que estavam inteiramente corretas, e a razão vale a pena registar.
A guarda tem de ler palavras e não algarismos
A versão evidente desta verificação compara algarismos, e foi essa que tivemos primeiro. É quase inútil aqui, porque o nosso estilo da casa em inglês escreve os números por extenso. Não 38 testes mas trinta e oito testes; não 1440 mas mil quatrocentos e quarenta.
Por isso há uma segunda guarda com uma tabela lá dentro: para cada valor que vale a pena verificar, como cada uma das nove línguas o soletra. Contar as ocorrências no inglês, contá-las em cada tradução, e comunicar tudo o que fique aquém.
Os valores pequenos estão deliberadamente excluídos. Em todas estas línguas as palavras para um, dois e três são também artigos, preposições ou pedaços de palavras mais longas, e contá-las produziria centenas de achados que não significam nada. Uma guarda que grita lobo passa a ser saltada, e uma guarda saltada é pior do que nenhuma guarda.
Contar por subcadeia, e contar de cima para baixo
Dois mecanismos tornam o resto disto possível, e ambos criam a falha de que este artigo trata.
O primeiro é que a correspondência tem de ser por subcadeia. O neerlandês escreve dezasseis mil como uma só palavra, e a única maneira de ver ali o dezasseis é olhar para dentro. Várias destas línguas compõem palavras livremente, por isso ancorar em fronteiras de palavra perderia a maior parte das ocorrências verdadeiras.
O segundo é que os valores são contados do maior para o menor, e cada ocorrência é recortada do texto antes de o valor seguinte ser contado. Sem isso, quarenta e um é contado uma vez como quarenta e um e uma vez como quarenta, e depois uma língua que escreva o mesmo número como uma só palavra indivisível parece estar a faltar-lhe uma. Sete dos primeiros trinta e sete achados que a guarda alguma vez produziu eram exatamente isso, e nenhum deles era um defeito.
A correspondência por subcadeia mais o recorte é o desenho certo. Também significa que a guarda anda à procura de letras, e letras não são números.
A palavra que não é um número
A frase inglesa que a fez falhar diz: uma guarda sobre ele nomeia centenas de não defeitos.
Não há número nenhum nessa frase. Centenas de é uma palavra de quantidade, do mesmo género que várias ou imensas, e não é uma afirmação de que alguma coisa aconteceu cem vezes. Mas em inglês contém as letras do numeral, por isso a guarda contou uma ocorrência de cem no inglês e foi depois à procura de cem em oito traduções.
O que voltou foi isto. O italiano diz centinaia, o romeno diz sute de, e nenhuma dessas contém o numeral daquela língua para cem. Dois relatórios vermelhos, sobre duas frases que um falante nativo classificaria de perfeitas.
As outras seis passaram, e só quatro delas passaram por uma razão. O neerlandês honderden contém honderd, o alemão Hunderte contém hundert, o espanhol cientos contém ciento, o francês centaines contém cent. Essas quatro são o mesmo não defeito que o italiano e o romeno; a guarda simplesmente não o conseguia ver, porque a palavra vaga acontece ser construída a partir do numeral.
As duas últimas são as incómodas. O português passou porque a palavra portuguesa para cem, cem, aparece dentro de parecem, num título sobre duas coisas que se parecem. O ucraniano passou com 39 ocorrências num artigo, porque as letras cirílicas para cem estão dentro das palavras correntes para página e para guarda.
Portanto, de oito línguas: duas falharam sobre um não defeito, quatro esconderam o mesmo não defeito atrás de uma coincidência de grafia, e duas ficaram verdes sobre palavras que não têm nada que ver com números. Uma guarda só é tão fiável quanto as razões por trás dos seus resultados verdes, e aqui só dois dos oito verdes eram sobre contar.
Onde a remoção tem de acontecer, e porque não pode ir primeiro
A correção é uma segunda tabela: os plurais vagos, por língua. Hundreds, honderden, Hunderte, cientos e centenares, centaines, centinaia, centenas, sute de, e as formas ucranianas. Removê-los antes de contar, porque não são valores.
A parte interessante é o quando. O instinto é removê-los no início, como uma passagem de limpeza sobre o texto, e isso partiria a guarda de uma maneira muito mais difícil de notar do que aquilo que corrige.
O romeno para quatrocentas vezes é patru sute de ori. Contém sute de literalmente. Remova os plurais vagos à cabeça e destruiu um quatrocentos verdadeiro ao remover um cem falso, e agora a guarda comunica que ao romeno falta um número que ele manifestamente tem.
Por isso a remoção acontece dentro do ciclo, no momento em que o ciclo chega ao valor cem. A essa altura a passagem do quatrocentos já consumiu patru sute, e o que resta de sute de é genuinamente a palavra vaga. A ordenação que existia por outra razão acaba por ser a coisa que torna isto seguro, o que é um bom argumento para manter a razão escrita ao lado do código.
Com os plurais vagos removidos a comparação passou de 224 contagens e dois achados para 216 contagens e nenhum. A contagem desce porque um valor que aparece zero vezes no inglês deixa de ser comparado de todo, o que é exatamente certo: nunca ali houve um cem.
Seis valores que estavam simplesmente ausentes
Enquanto provávamos tudo isto, a tabela revelou-se sem seis dos valores que os artigos novos usavam, por isso esses números ficavam por verificar em oito línguas cada.
Essa é a falha mais banal e é a que vai voltar a acontecer. Uma tabela de valores é escrita para os artigos da ronda que a criou, e a ronda seguinte escreve outros números. Uma linha em falta não falha; verifica nada em silêncio, que é a mesma forma que uma entrada de lista de exceções com uma gralha, e já fomos mordidos por isso antes.
A descrição honesta desta guarda é portanto: é uma rede de malha conhecida, apanha a classe de erro para que foi construída, e cada ronda tem de acrescentar os seus próprios valores ou não recebe nada. O que está bem, desde que ninguém leia um resultado verde como cobertura.
O que registaríamos
- Uma palavra de quantidade não é um valor. Centenas de está mais perto de várias do que de 100.
- A correspondência por subcadeia é a correta aqui e é a origem do problema. As línguas que compõem palavras precisam dela.
- Pergunte por que razão cada resultado verde está verde. Quatro dos nossos eram coincidência e dois eram ruído.
- Um radical numeral curto esconde-se dentro de palavras correntes, e o 100 cirílico está dentro da palavra para página.
- Ordene as passagens do maior para o menor e recorte cada ocorrência, ou as palavras compostas contam duas vezes.
- Onde acontece uma limpeza importa tanto como aquilo que ela remove. Remover os plurais vagos primeiro destrói um quatrocentos verdadeiro.
- Mantenha a razão ao lado da ordenação, porque a ordenação é estrutural e não parece.
- Uma tabela de valores só cobre a ronda que a escreveu. Aqui faltavam seis.
- Uma linha em falta é silenciosa, exatamente como uma entrada de lista de exceções mal escrita.
- Diga o que uma guarda não cobre, para que ninguém leia verde como cobertura.
Para que fique claro o que isto é: a comparação correu sobre quatro artigos em oito línguas, 224 contagens com dois achados antes de os plurais vagos serem tratados e 216 sem nenhum depois, seis valores acrescentados à tabela, e a remoção dos plurais vagos colocada dentro do ciclo em vez de antes dele para que o romeno para quatrocentas sobreviva. Ao lado disso, essa ronda produziu 886 artigos gerados sem avisos, uma verificação de conteúdo de 887 de 887 ficheiros idênticos byte a byte, a bateria de testes da web a 4594 verdes com as outras baterias a 7287, a comparação de factos a 1144 contagens sem nenhuma a falhar, os tokens a 64 e os nomes de ligação a 72, sete scripts e quatro regras de tipografia provados vermelhos antes de se acreditar que estavam verdes, e uma varredura de disposição de 108 verificações a 390 pixels contra uma compilação de produção. Por provar: o ruído de subcadeia em ucraniano e em português está compreendido mas não removido, o que exige um leitor morfológico e não uma tabela, e cada tradução continua a ter um leitor.
Do trabalho de plataforma na Provibr. O que nove catálogos fazem a um conjunto fixo de controlos está em Dezasseis mil chaves, nove idiomas, a guarda que distingue um texto de ligação encurtado de um substituído está em Dois nomes para o mesmo artigo, e a revisão de leitores que deu início a toda esta série está em Três falhas que nenhum script conseguia ver.