Qual a relação entre as duas partes do título deste post? O que a remoção de acentos de uma palavra em português pode ter a ver com o Ano Novo muçulmano? A resposta é transliteração.
Transliteração é uma operação em strings pouco discutida, mas bastante importante quando lidamos com idiomas que não o inglês. Ela implica na conversão de texto de um sistema de escrita para outro, substituindo letras (ou caracteres) de formas previsíveis, como, por exemplo, α → a ou æ → ae.
Em português é comum transliterarmos palavras sem mesmo saber o que isso significa. Por exemplo, a palavra חנוכה (/ˡχanuka/) é normalmente escrita como “chanucá” apesar de essa não ser uma correspondência da pronúncia hebraica para os sons do português. Se quiséssemos uma transposição de pronúncia, provavelmente escreveríamos “ranucá”, mas o mais correto é justamente transliterar a palavra de modo a preservar uma certa correspondência entre as letras do hebraico e as letras do português; sendo assim, a primeira letra é transformada em um CH e não em um R. O mesmo ocorre com a romanização do japonês e do mandarim, etc.
Letras estrangeiras
E qual a importância da transliteração no dia a dia? Em primeiro lugar, quando lidamos com idiomas que apresentam caracteres distintos dos nossos, muitas vezes as funções padrão do R não são capazes de tratar eles corretamente!
Vejamos por exemplo uma palavra do alemão e uma do holandês: “groß” e “ijsvrij”. No alemão, a versão capitalizada do beta (ß) é SS, enquanto no holandês o dígrafo IJ é na verdade uma letra só. Vejamos o que acontece se usamos as funções padrões:
toupper("groß")
## [1] "GROß"
stringr::str_to_title("ijsvrij")
## [1] "Ijsvrij"
Para corrigir esses problemas (o “ß” e o “Ij”), devemos utilizar funções do
pacote stringi
que são capazes de transliterar as strings antes de aplicar
as outras transformações:
library(stringi)
stri_trans_toupper("groß", locale = "de_DE")
## [1] "GROSS"
stri_trans_totitle("ijsvrij", locale = "nl_NL")
## [1] "IJsvrij"
Acentos do português
O segundo uso da transliteração (e provavelmente mais comum no dia a dia) é a remoção dos acentos do português. Muitas vezes recebemos arquivos e tabelas nos quais a acentuação das palavras está quebrada ou incorreta, tornando necessária a remoção dos diacríticos (acentos ortográficos + til + cedilha + trema + etc.) de todas as strings.
Jamais devemos criar uma regex para realizar essa tarefa porque a chance de ela não funcionar é muito grande! Suponha que esquecemos de um acento na regex, uma forma capitalizada, ou mesmo a existência de palavras em outros idiomas no meio de um texto em português. A solução para esse problema é, você adivinhou, a transliteração.
stri_trans_general("Stríng cõm müìtôs açëntòs", "Latin-ASCII")
## [1] "String com muitos acentos"
A função stri_trans_general()
recebe dois argumentos: uma string e um
identificador de transformação. Neste caso e quando estivermos lidando com
português em geral, o que queremos é passar uma string no alfabeto latino (o
nosso alfabeto) para ASCII (o conjunto
restrito de caracteres sem nenhum tipo de diacrítico) e, portanto, utilizamos o
ID "Latin-ASCII"
.
Ano Novo muçulmano
O terceiro e último uso da transliteração serve para quando lidamos com línguas que apresentam ligaduras (duas ou mais letras unidas em um único glifo). O árabe é o melhor exemplo disso porque grande parte da sua arte caligráfica envolve a composição de diversas palavras em uma só figura [observe o círculo central da imagem do Alcorão deste post e repare como ele é preenchido por diversas palavras entrelaçadas].
Como o Ano Novo muçulmano deste ano é amanhã (ao pôr-do-sol do dia 30/08/19), acho que vale a pena aprender como lidar com a ligadura mais famosa do árabe: a frase conhecida como Sallallahou Alayhe Wasallam que significa “bênçãos de Deus estejam sobre Ele e Sua família e paz”. Esta frase é comumente conectada ao nome dos profetas do Islã em sinal de respeito e, pela frequência de seu uso, foi convertida em apenas um caractere Unicode:
Faça um teste e copie o símbolo acima. Você pode notar que ele é de fato apenas um glifo como qualquer outro e que pode ser enviado por qualquer WhatsApp da vida!
A questão é que se estivermos analisando texto em árabe, esse tipo de ligadura
pode atrapalhar, por exemplo, a contagem de palavras. Para lidar com essas
situações (especificamente em árabe) usamos a função stri_trans_nfkc()
.
stri_trans_nfkc("\ufdfa")
## [1] "صلى الله عليه وسلم"
E pronto! Agora nenhum feriado internacional vai pegar a sua programação de surpresa.
Obs.: Acima utilizei o
código Unicode da ligadura
porque senão ela atrapalharia a formatação da caixa de código,
mas basta executar cat("\ufdfa")
no seu R para ver que ele realmente
representa o S.A.W.