[Algoritmos] [PLN#10] Information Extractor - como extrair triplas
O Processamento de Linguagem Natural além de identificar palavras importantes e compreender como elas podem ser utilizadas, também busca encontrar relações entre as palavras. A linguística claramente mostra que uma frase é composta por palavras que são conectadas por um contexto e informações. Mas seria possível um programa de computador compreender quais são as conexões existentes em um texto em linguagem natural?
Os esforços para compreender a linguagem a ponto de conseguir interagir com ela é um desafio que já obteve muitos avanços na área de Inteligência Artificial. Um destes esforços importantes é o computador Watson da IBM que promete ser uma grande porta de entrada para desenvolvedores que desejam integrar o PLN em suas aplicações.
Veja esta matéria bastante divertida feita pelo Jovem Nerd sobre a exposição de arte organizada pelo grupo de estudos da IBM.
Mesmo que empresas grandes como a IBM, Google, Microsoft tenham despertado para o poder do Processamento de Linguagem Natural como ferramenta útil, estas empresas ainda caminham juntamente com a comunidade e desfrutam de descobertas compartilhadas por inúmeros estudiosos do mundo todo.
É claro que compreender partes da fala humana e gerar uma resposta automaticamente é um trabalho bastante complexo. Mas neste post vamos explicitar uma parte importante sobre a extração de informações. O algoritmo denominado Subject-Verb-Object é bastante utilizado na literatura de processamento de linguagem natural, pois identifica sequências comuns na comunicação humana.
Este algoritmo tem como premissa que muitas frases criadas tem a estrutura de um sujeito (agente) que realiza uma ação (verbo) sobre um determinado objeto. Observe o exemplo:
Maria dirige o carro.
Na frase acima temos: "Maria" como o sujeito, "dirige" como a ação tomada e "o carro" como objeto. Sendo assim, esta sequência forma uma tripla que contém uma informação válida. Esta busca por informações em um texto é denominada "Information Extraction" ou "Extração de Informações".
Mais uma vez a Universidade de Stanford, como destaque neste tipo de pesquisa, disponibiliza gratuitamente o projeto desenvolvido pelo seu grupo de PLN um extrator de informações. O download destes pacotes pode ser feito neste link. Esta ferramenta é baseada no Stanford parser e utiliza vários algoritmos para extrair estes relacionamentos.
Veja um exemplo de utilização do código na linguagem Java:
import edu.stanford.nlp.ie.util.RelationTriple;
import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.naturalli.NaturalLogicAnnotations;
import edu.stanford.nlp.util.CoreMap;
import java.util.Collection;
import java.util.Properties;
/**
* A demo illustrating how to call the OpenIE system programmatically.
*/
public class OpenIEexample {
public static void main(String[] args) throws Exception {
// Create the Stanford CoreNLP pipeline
Properties props = new Properties();
props.setProperty("annotators", "tokenize,ssplit,pos,lemma,depparse,natlog,openie");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
// Annotate an example document.
Annotation doc = new Annotation("I like milk, I am a cat.");
pipeline.annotate(doc);
// Loop over sentences in the document
for (CoreMap sentence : doc.get(CoreAnnotations.SentencesAnnotation.class)) {
// Get the OpenIE triples for the sentence
Collection<RelationTriple> triples = sentence.get(NaturalLogicAnnotations.RelationTriplesAnnotation.class);
// Print the triples
for (RelationTriple triple : triples) {
System.out.println(triple.confidence + "\t"
+ triple.subjectLemmaGloss() + "\t"
+ triple.relationLemmaGloss() + "\t"
+ triple.objectLemmaGloss());
}
}
}
}
---------------------------Output -----------------------------
1.0 I be cat
Lembrando que outros códigos sobre este assunto estão em nosso GitHub. Clique na imagem abaixo para acessar:
Post a Comment