Como usar um stemmer

Como usar um stemmer

Pré-processamento  

Antes de utilizar qualquer algoritmo de PLN é importante considerar que o texto possui diversos recursos linguísticos que podem alterar a forma da escrita de uma palavra.   

Um exemplo muito simples são os verbos:   

Verbo falar: Eu falo, Tu falas, Ele fala, Nós Falamos, Vós Falais, Eles Falam.   

Já podemos perceber que o tempo verbal e a pessoa na qual ele está sendo conjugado influenciam em sua escrita. Porém existem muitos outros conceitos que influenciam na escrita, por exemplo, singular e plural, etc.   Outro aspecto muito importante é que estas regras variam de acordo com a língua utilizada. Em línguas descendentes do Latim como o Português e Espanhol as regras podem se assemelhar bastante. Considerando todo este contexto fica a seguinte pergunta: como lidar com todas estas variações para trabalhar com as Linguagem Natural?  

O uso de um Stemmer  

O recurso mais utilizado para lidar com estas diferenças na Linguagem Natural é a redução de uma palavra para sua raiz. Este é um recurso já conhecido na área da linguística que foi aplicado para ajudar no processamento de dados. Observe o exemplo:   Falando, falar, falamos, falais, falam, falei, falarão 

Todos estas palavras podem ser reduzidas ao radical fala;

Conhecendo esta possibilidade os desenvolvedores construíram um método capaz de reduzir qualquer palavra para o seu radical. A este algoritmo damos o nome de Stemmer. 

Usando um Stemmer   Uma implementação muito interessante de um Stemmer é aquela chamada de Porter Stemmer. Este algoritmo foi proposto por Martin Porter no artigo escrito em 1980 em seu artigo “An algorithm for suffix stripping“. Este artigo já foi citado mais de 8000 vezes de acordo com o Google Scholar.  

Para entender seu funcionamento a fundo recomendamos a leitura do artigo original.   A seguir temos um trecho de código Java que invoca o Porter Stemmer:    

public String performStemming(String words) {
     ArrayList<String> retorno = new ArrayList<>();
     ArrayList<String> cWords = stringToArrayOfWords(words);
     for (String s : cWords) {
          retorno.add(stem(s));
     }
       return StringUtils.arrayOfWordsToString(retorno);

}


//Metodos auxiliares
public static ArrayList<String> stringToArrayOfWords(String contentToConvert) {
      ArrayList<String> words = new ArrayList<>();
      if (contentToConvert != null) {
          for (String s : contentToConvert.split(" ")) {
              words.add(s);
          }
      }
        return words;

}

O código completo de Porter e outros algoritmos de PLN você pode encontrar no nosso GitHub!  

Acesse clicando na imagem abaixo

Vinicius dos Santos

Apenas um apaixonado por Ciência da Computação e forma com que ela pode transformar vidas!

Deixe uma resposta