Caio Lente

Transliteração em R

· Caio Lente

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 acima 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.

#r #cs

Responda a este post por email ↪