Manipulação de strings não é uma tarefa trivial e muito menos glamourosa, mas atualmente há vários formas e softwares que lidam com strings de uma forma intuitiva afim de auxiliar o analista de dados. Uma dessas formas e softwares é o pacote stringr da linguagem de programação R.
Mas o que é uma string na linguagem R?
Na linguagem R qualquer valor escrito em um par de aspas simples ou duplas é tratado como uma string, como pode ser visto na linha de código abaixo. Lembrando que as aspas no início e no final de uma string devem ser aspas duplas ou aspas simples. Eles não podem ser misturados. É válido ressaltar que internamente, o R armazena cada string entre aspas duplas, mesmo quando você as cria com aspas simples.
a <- 'Aprendendo sobre stringr' #ASPAS SIMPLES
print(a)
b <- "Aprendendo sobre stringr" #ASPAS DUPLAS
print(b)
E nem sempre nos reportamos a este tipo de variável como strings, mas sim em variáveis do tipo character, já que esta é a classe na qual estas variáveis pertencem. Porém, no universo da computação, é comum se referir a variáveis do tipo texto como string e, por isso, o nome do pacote é stringr.
base::class(a)
[1] "character"
O criador deste pacote sensacional é o estatístico Hadley Wickham, que por um acaso também é o criador do tidyverse e vários outros pacotes bem conhecidos no universo da ciência de dados. O pacote stringr também se encontra no escopo dos pacotes tidyverse.
O pacote stringr fornece um conjunto de ferramentas internamente consistentes para trabalhar com cadeias de caracteres, ou seja, sequências de caracteres entre aspas. Para isso existem quatro famílias principais de funções no pacote stringr:
Manipulação de caracteres: essas funções permitem que você manipule caracteres individuais dentro das strings em vetores de caracteres.
Ferramentas de espaço em branco para adicionar, remover e manipular espaços em branco.
Operações sensíveis à localidade cujas operações variam de local para local.
Funções de correspondência de padrões.
Cada função de correspondência de padrões tem os mesmos dois primeiros argumentos, um vetor de caracteres de strings para processar e um único pattern para corresponder. Essas funções de correspondência de padrões são utilizadas com o fim de detectar, localizar, extrair, combinar, substituir e dividir strings.
Note que a variedade de utilidades deste pacote pode ser consultada diretamente no console do R ao escrever str_ (após carregar o pacote) e aguardar um instante que a seguinte lista de funções será exibida:
Destaco que todas as funções em stringr começam e tomam um vetor de strings como o primeiro argumento str_. Uma estratégia que auxilia na identificação do pacote e função utilizada em sua mineração de texto. (Facilita MUITO!)
Agora vamos explorar esse pacote? Inicialmente vamos instalar e carregar carregar o pacote:
utils::install.packages("stringr")
base::library(stringr)
Para cada exemplificação vou utilizar um vetor com diferentes argumentos para melhor entendimento das maravilhas deste pacote. A primeira aplicação é obter o comprimento de uma string com a função str_lenght().
stringr::str_length("Mineração de texto não é fácil")
[1] 30
Atente-se que os espaços em branco também são contabilizados quando utilizamos a função str_lenght(). Essa utilidade é equivalente a função nchar() do pacote base. Mas a intenção de uma mineração de texto não é contabilizar os espaços em branco, já que este não me retornam informações relevantes. E como retirar esses espaços em branco da minha string? Três funções adicionam, removem ou modificam os espaços em branco. Essas funções são str_pad(), str_trim() e str_wrap().
A função str_pad() preenche uma string com um comprimento fixo, adicionando espaços em branco extras a esquerda, a direita ou em ambos os lados. Por default o pads adiciona ao lado esquerdo, mas temos as opções both e right. E se você é atenciose, você percebeu que o espaçamento entre as palavras está diferente e isso é devido a contagem de como este espaço extra é inserido. Se sua palavra possui dois caracteres como "de" , o str_pad() acrescentará mais oito espaços em branco ao lado esquerdo, direito ou ambos.
a <- c("Mineração", "de", "Texto")
stringr::str_pad(a, 10)
stringr::str_pad(a, 10, side = "both")
[1] " Mineração" " de" " Texto"
[1] "Mineração " " de " " Texto "
Logo, se o seu interesse é que todas as strings tenham o mesmo comprimento, utilize a combinação entre o str_pad() e o str_trunc().
a %>%
str_trunc(10) %>%
str_pad(10, "right")
[1] "Mineração " "de " "Texto "
O oposto do str_pad() é o str_trim(). Ele remove os espaços em branco a direita e a esquerda. No exemplo abaixo removemos os espaços em branco ao lado esquerdo.
a <- c(" Mineração", " de", " Texto")
stringr::str_trim(a, side = "left")
[1] "Mineração" "de" "Texto"
Você também pode usar a função str_wrap() para modificar os espaços em branco para realizar uma quebra de texto resultando em um parágrafo, por exemplo. Este parágrafo será configurado de forma que o comprimento de cada linha seja o mais semelhante possível. A função str_c() tem a função de concatenar strings em uma única string.
frase <- stringr::str_c(
"Mineração de texto, conhecida também",
"como mineração de dados textuais e semelhante",
"à análise textual, refere-se ao processo",
"de obtenção de informações",
"importantes de um texto. "
)
cat(stringr::str_wrap(frase, width = 30))
O resultado é o texto escrito da seguinte forma:
Mineração de texto, conhecida
tambémcomo mineração de
dados textuais e semelhanteà
análise textual, refere-
se ao processode obtenção de
informaçõesimportantes de um
texto.
Repare que a primeira linha tem o tamanho igual a 29, a segunda linha igual a 23 e assim em diante. Lembre-se que a tentativa é tornar o parágrafo o mais semelhante possível e não necessariamente igual.
Outras funções sensacionais são str_to_upper() e str_to_lower(). O nome delas é bem sugestivo e suas funcionalidades são de extrema valia na análise de textos.
a <- c("Mineração", "de", "Texto")
stringr::str_to_lower(a)
[1] "mineração" "de" "texto"
stringr::str_to_upper(a, locale = "en")
[1] "MINERAÇÃO" "DE" "TEXTO"
O parâmetro locale sempre é padronizado para inglês afim de garantir que o comportamento padrão seja idêntico em todos os sistemas. As localidades sempre incluem um código de idioma ISO-639-1 de duas letras (como “en” para inglês ou “zh” para chinês) e, opcionalmente, um código de país ISO-3166 (como “en_UK” vs “en_US”). Você pode ver uma lista completa de localidades disponíveis executando stringi::stri_locale_list().
Mas ainda assim nossa frase de exemplo possui acentos, como retirá-los? Para este fim utilizei o abjutils::rm_accent(). O pacote abjultils possui um Kit de Ferramentas com algumas funções úteis utilizadas pela Associação Brasileira de Jurimetria. Você pode utilizar também outras funções do pacote stringr para atingir esse objetivo (não muito escaláveis).
a <- c("Mineração", "de", "Texto")
stringr::str_replace_all(a, "[ç]", "c")
[1] "Mineracão" "de" "Texto"
Outra função para este fim é a função stri_trans_general do pacote stringi. É escalável e não demanda muitas linhas de código.
library(stringi)
a <- c("Mineração", "de", "dados")
stringi::stri_trans_general(a, "Latin-ASCII")
[1] "Mineracao" "de" "dados"
Fernanda, o que faço para remover ou aplicar qualquer outra função desejada em caracteres especiais? É importante ressaltar que trabalhar com textos exige um certo conhecimento de expressões regulares ou simplesmente regex. Essas expressões permitem identificar conjuntos de caracteres, palavras e outros padrões por meio de uma sintaxe concisa.
O pacote stringi citado acima, atua com várias expressões regulares e é válido estudar o regex através deste pacote pela facilidade de entendimento, material disponível e interligação com o pacote stringr.
E o que diferencia esses dois pacotes? As funções passadas até o momento não exigem algum conhecimento prévio de expressões regulares e não possuem o parâmetro pattern como opção entre essas funções.
Um exemplo de aplicação do parâmetro pattern é utilizando a função str_detect() que retorna TRUE se uma string atende a uma expressão regular e FALSE caso contrário é utilizando o "$". Veja abaixo que a regex/pattern indica que o texto deve ser terminado em "goias".
stringr::str_detect("goiania goias", pattern = "goias$")
[1] TRUE
stringr::str_detect("goiania goias gyn", pattern = "goias$")
[1] FALSE
E assim como "$", existem diversos caracteres auxiliares que vão contribuir na manipulação dos textos. É importante ressaltar que este parâmetro refere-se a um padrão a ser procurado e a interpretação padrão é uma expressão regular, conforme descrito em stringi :: stringi-search-regex, ou seja, qualquer valor repassado a este parâmetro de qualquer função do pacote stringr será entendido como uma regex.
Para estudos fututos indico o stringi e e uma página que relata as expressões regulares utilizadas na linguagem R. E abaixo se encontra disponível para download a Cheat Sheet do pacote stringr.
Bons estudos!
Fernanda Kelly R. Silva | Fundadora R-Ladies GYN
Comments