[Algoritmos] [PLN#9] Anaphora Resolution - Como processar anáforas


Neste post entenderemos como funciona o algoritmo de resolução de anáforas. Em primeiro lugar devemos entender o que são anáforas.

Leia estes versos de Manuel Bandeira:

“Vi uma estrela tão alta,
Vi uma estrela tão fria!
Vi uma estrela luzindo
Na minha vida vazia”.


Observe que o poeta inicia os três primeiros versos com a mesma expressão “Vi uma estrela”, com o objetivo de enfatizar essa ideia. Esse recurso usado tão frequentemente na poesia é uma figura de linguagem chamada anáfora.

A anáfora consiste em repetir uma palavra ou expressão a espaços regulares durante o texto. É muito comum nas trovas populares, cordéis e poemas.

No contexto de Processamento de Linguagem Natural a resolução de anáforas aparece mais comumente como a resolução de pronomes de acordo com referencias apresentadas anteriormente no texto. Observe o exemplo:

John is a employee. He always is late.

Neste exemplo o empregado chamado John é apresentado. Na segunda frase o nome de John é substituído pelo pronome "He". Realizar o reconhecimento destas conexões é um problema bastante complexo em NLP. 

Caso seja necessário descer a este nível de detalhe, é possível consultar artigos que explicitam a técnica. Confira alguns links que podem ajudar neste trabalho.






Buscando uma abordagem mais prática, demonstraremos a seguir um exemplo de resolução de anáforas na língua inglesa. 

Observe a seguinte frase:

"Barack Obama was born in Hawaii.  He is the president. Obama was elected in 2008."

Aqui temos três sentenças distintas, são elas: 

1 - Barack Obama was born in Hawaii. 
2 - He is the president.
3 - Obama was elected in 2008.

Na segunda frase, por exemplo, o pronome "He" refere-se ao presidente Barack Obama. O objetivo do algoritmo implementado é identificar esta relação. A universidade de Stanford apresentou um módulo do seu parser que resolve este problema. Veja um exemplo de código Java que utiliza o algoritmo de resolução de Anáforas.


import java.util.Properties;

import edu.stanford.nlp.coref.CorefCoreAnnotations;
import edu.stanford.nlp.coref.data.CorefChain;
import edu.stanford.nlp.coref.data.Mention;
import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.util.CoreMap;

public class AnaphoraResolutionExample {

    public static void main(String[] args) throws Exception {
        Annotation document = new Annotation("Barack Obama was born in Hawaii.  He is the president. Obama was elected in 2008.");
        Properties props = new Properties();
        props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,parse,mention,coref");
        StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
        pipeline.annotate(document);
        System.out.println("---");
        System.out.println("coref chains");
        for (CorefChain cc : document.get(CorefCoreAnnotations.CorefChainAnnotation.class).values()) {
            System.out.println("\t" + cc);
        }
        for (CoreMap sentence : document.get(CoreAnnotations.SentencesAnnotation.class)) {
            System.out.println("---");
            System.out.println("mentions");
            for (Mention m : sentence.get(CorefCoreAnnotations.CorefMentionsAnnotation.class)) {
                System.out.println("\t" + m);
            }
        }
    }
}


Saida: 

coref chains
CHAIN3-["Barack Obama" in sentence 1, "He" in sentence 2, "Obama" in sentence 3]
---
mentions
Barack Obama
Hawaii
---
mentions
the president
He
---
mentions
Obama

2008


Vale ressaltar que para que este código funcione é necessário ter adicionado as bibliotecas do Stanford Parser. Este exemplo e outros códigos podem ser acessados no nosso GitHub. Clique na imagem abaixo para acessar:





[Algoritmos] [PLN#9] Anaphora Resolution - Como processar anáforas [Algoritmos] [PLN#9] Anaphora Resolution - Como processar anáforas Reviewed by Vinicius dos Santos on 11:46:00 Rating: 5

Nenhum comentário

Escreve ai sua opinião!