Tratar nomes internacionais

Pessoal, eu tô tratando uma base que possui nomes de todos os países, e estou tendo problemas.
Meu objetivo inicialmente seria organizar os nomes pra fazer algumas contagens e filtragens (baseadas em outras variáveis da base), mas aí eu comecei a perceber q isso não funciona muito bem porque tenho nomes asiáticos e nomes escritos em línguas que o R não parece lidar muito bem (por exemplo, fui tentar fazer contagem de letras de nomes árabes e ele me retornou 0).
Queria saber se alguém tem algum método que usa para casos parecidos, ou tenha alguma sugestão de material que eu possa seguir.

O link para a base é esse:
https://drive.google.com/file/d/1hCnTycdcjT4n6oYtaxE1mzf2uEVch2NR/view?usp=sharing

E o código até agora é este:

 ## Adicionando primeiro nome de autores
df_autores_f_l <- data.table::fread("df_gist.csv") %>%
  dplyr::select(id, authors_f = authors, authors_l = `authors/lastname`) %>%
  dplyr::filter(authors_f != "", authors_f != "vazio")

autores_fn <- df_autores_f_l$authors_f
## Separa em uma lista de mais de um elemento
autores_fn_split <- autores_fn %>%
  stringr::str_split(., '\\|')
rm(autores_fn, df_autores)
## Agora a ideia seria agrupar os nomes, para adicionar um ponto ao primeiro nome. Ao final seria: Maria Luiza ->  M. L.
## Uso str_to_title porque alguns nomes estão com todas as letras em maiúsculo. Ex: CRISTINA SILVA -> Cristina Silva
autores_fn_split_ <- lapply(autores_fn_split, function(x) stringr::str_to_title(x))
## Depois seleciono apenas as iniciais de cada nome. Seguindo o exemplo anterior: Cristina Silva -> C S
autores_fn_split__ <- lapply(autores_fn_split_, function (x) stringr::str_extract_all(x, stringr::regex("[:upper:]")))
## Agora temos uma lista de listas, ao invés de uma lista de caractéres, cada elemento da lista é um autor
## Caso o autor possua mais de um primeiro nome, ele terá os elementos encadeados em uma string (Ex: "C S").
## A ideia é que fique, ao final, seguindo o exemplo: C S -> C. S. (para cada autor)
#autores_fn_split___ <- lapply(autores_fn_split__, function (x) paste0(x, "."))
# Acima não deu certo, porque existem autores que possuem mais de um nome, então só adicionar o ponto ao final não resolve.
# Ex: C S -> C S.
i=1
j=1
debug = F

for(i in 1:length(autores_fn_split__)){
  for(j in 1:length(autores_fn_split__[[i]])){
    if(autores_fn_split__[[i]][[j]] > 1){
      if(debug){
        print(paste0("i = ", i))
        print(paste0("j = ", j))
        print(autores_fn_split__[[i]][[j]])
      }

    }
  }
}

Parei por aqui porque comecei a ter problemas com nomes árabes, mas teria problema com nomes asiáticos também, devido ao uso de outros tipos de alfabetos usados.

Oi, Mikael, tudo bom?

Pelo que eu entendi, ou você tem um problema de transliteração ou você realmente precisa encontrar uma base em que os nomes estejam em um único idioma. Se for o primeiro caso, acredito que esse post vá te ajudar:

Obrigado, vou procurar sobre transliteração, nem conhecia o termo, mas acho que pode me ajudar sim.
Mas o problema me parece ser bem mais complexo do que eu imaginava, se eu tenho uma base com nomes de todo o mundo, teria que fazer algum tipo de separação (por país?) da base pra tratar dessa forma, certo?

Depende sempre do objetivo. Nunca trabalhei com uma base com alfabetos diferentes, mas pode ser que faça sentido em algum caso. Em geral, eu acho que o melhor é estar padronizado, em um idioma apenas.

Entendi, vou procurar um pouco mais sobre isso, não irei marcar como resolvido para caso alguém tenha mais alguma outra ideia de como lidar, mas você já me deu uma boa base pra começar, muito obrigado.

1 curtida