Masculino ou Feminino?
Digite um nome próprio brasileiro típico e a planilha lhe dirá se ele é masculino ou feminino. Nos meus testes, ele acerta mais de 99% das vezes.
Clique na imagem para baixar a planilha
Sobre o algoritmo
Primeiro ele determina a última letra do nome. Para cada letra há um
default e uma tabela de terminações que são exceções.
As terminações estão com as letras invertidas em ordem alfabética para que a função
PROCH
do Excel aja como um batimento parcial por prefixo. Em certas situações é necessário um batimento exato; para isso servem as barras verticais no fim de algumas delas.
Se o nome constar na tabela de exceções, o resultado será o inverso do
default; caso contrário, será o
default. Zero é feminino, um é masculino.
Exemplos:
- "Kiko" termina com "o", e o default para a leta "o" é 1 (masculino). Tiramos o "o" final e invertemos: o resultado dá "kik". Essa string não consta na tabela de exceções, nem nenhum prefixo dela, então o nome é masculino mesmo.
- "Babi" termina com "i", e o default para essa letra é 1 (masculino). Tirando a letra final e invertemos, temos "bab"; o prefixo "ba" consta na tabela de exceções da letra "i", então o nome é feminino. (Se você tentar esse nome na planilha, verá que o "ba" fica em vermelho, indicando um batimento).
A implementação poderia ser um pouco mais simples se não fosse pelo que parece ser um
bug do Excel. Aparentemente há um limite na quantidade de células que a função
PROCH
pode lidar. Por isso, foi necessário partir a busca em dois. Curiosamente, só a letra "e" requer a segunda busca.
O Excel traz automaticamente alguns benefícios para nós; por exemplo, a comparação usada na função
PROCH
não distingue maiúsculas de minúsculas, o que nos poupa o trabalho de converter. As configurações regionais do Windows também ajudam: a comparação descarta acentos, de sorte que "á" é considerado igual a "à" que é considerado igual a "a". Isso nos poupa o trabalho de implementar um removedor de acentos.
O segredo do algoritmo, naturalmente, está na tabela. Em uma lista de nomes e sexos (principalmente resultados de corridas, tais como a
São Silvestre e as promovidas pela
Corpore) foi rodado um algortimo de particionamento recursivo por sufixo. Ele chegou à tabela mínima de sufixos necessária para implementar uma árvore de decisão que proveja o exato mesmo resultado da lista original. Contudo, o uso de sufixos mínimos adiciona a capacidade de lidar com nomes que não constavam na lista original. Assim, chegamos a uma tabela relativamente compacta (601 elementos, como mostra o total geral na planilha) que contém os
sufixos determinantes; isto é, aqueles que são realmente os decisivos para determinar o gênero da palavra.
Curiosidades
A tabela mostra que os nomes terminados com a letra "e" são os mais difíceis de decidir: eles normalmente são femininos, mas há 168 casos particulares que os tornam masculinos. Os outros mais difíceis são os sufixos "i", "a", "y", "s", "n", "r", com 96, 72, 54, 51, 33 e 33 exceções, respectivamente.
No outro extremo, a tabela aponta os sufixos "f", "j", "q", "v", "w" e "x" como sempre masculino, sem exceções. Isso é um reflexo do fato que o banco de dados no qual nos baseamos não tinha nomes femininos terminados nessas letras, mas parece temerário afirmar que não existam.
O
default de quase todos os sufixos é masculino; excetuam-se apenas os sufixos "e" e "a". Isso concorda com a percepção comum de que nomes próprios terminados com "a" quase sempre são de mulher. Feministas fanáticas possivelmente notarão esse fato como uma corroboração de que a desproporcionalidade masculina na ocupação de espaços se estende também aos nomes próprios.
Valor Didático
Eu costumava usar esse problema em cursos de programação como exemplo de finesse/teoria versus prática desabalada: pegue algum programador e peça para ele escrever
na mão um programa para fazer isso. Depois rode-o contra um banco de dados. Dificilmente ele conseguirá uma precisão muito maior que 95% -- e o código tipicamente fica uma nojeira e o desafiado sai exausto. Usando a abordagem correta, uma solução bem melhor sai com muito menos esforço. Por outro lado, se o desafiado partisse logo de cara para buscar um banco de dados e tentar uma abordagem semelhante a essa, é sinal de que ele já tem mais tino.
Implementações em Outras Linguagens
Essas duas implementações vêm com dados de teste. A precisão medida é de 99,66%.
Deve ser posível obter ainda mais precisão que isso levando em conta os outros nomes e quem sabe usando o
teorema de Bayes, tal como fazem os filtros de spam. A dificuldade aqui é obter um banco de dados suficientemente grande e confiável: nos a que tive acesso, a taxa média de erros de cadastro era da ordem de 1%, o que minava os resultados e torna necessário tediosa revisão manual.
Contribua!
Se você tem acesso a um cadastro de nomes próprios confiável e bem mantido, com mais de 500 mil nomes, que contenha o sexo do indivíduo (masculino/feminino) e que você não se importe em e/ou não teria restrição divulgar, por favor me mande! Preferivelmente em formato CSV com dois campos: nome completo e sexo. Com seus dados poderemos refinar as tabelas para obter mais precisão, testar novas técnicas, etc. Não deixarei de dar crédito a todos que participarem. Não divulgarei o banco de dados, a menos que me seja dada permissão explícita para isso.
Bancos de dados de nomes próprios de outros países que não o Brasil também são aceitos. Tenho curiosidade de saber o quanto esse algoritmo simples seria eficiente em nomes de outros idiomas. Outra questão em aberto é saber se seria possível gerar uma única tabela/algoritmo que desse precisão aceitável para a maioria dos idiomas baseados no alfabeto latino.
topo