opennlp

Procesamiento de lenguaje natural en C# con OpenNLP

OpenNLP es una biblioteca para .NET de código abierto para el procesamiento de lenguaje natural en aplicaciones escritas en C#.

OpenNLP es un port a C# de la popular librería de Java. Proporciona una variedad de herramientas y modelos para tareas comunes, como:

  • Divisor de oraciones
  • Tokenizador
  • Etiquetador de partes del discurso
  • Agrupador
  • Correferencia
  • Reconocimiento de entidades nombradas
  • Árboles de análisis (o árboles de análisis sintáctico)

Está diseñada para ser utilizada por desarrolladores y científicos de datos en una amplia gama de aplicaciones, desde análisis de sentimientos hasta chatbots y sistemas de recomendación.

El repositorio incluye modelos entrenados para el lenguaje Inglés. Si los queréis en otro idioma tendréis que buscar modelos de OpenNLP en Españ (y en la mayoría de los casos, convertirlos).

También es posible entrenar vuestros propios modelos. En el repositorio indican como hacerlo, aunque prepararos porque es una tarea que requiere mucho texto y mucho tiempo.

Cómo usar OpenNLP

Podemos añadir la biblioteca a un proyecto de .NET fácilmente, a través del paquete Nuget correspondiente.

Install-Package OpenNLP

Aquí tenéis algunos de cómo utilizar OpenNLP extraídos de la documentación de la librería

Sentence splitter

Un divisor de oraciones divide un párrafo en oraciones.

var paragraph = "Mr. & Mrs. Smith is a 2005 American romantic comedy action film. The film stars Brad Pitt and Angelina Jolie as a bored upper-middle class married couple. They are surprised to learn that they are both assassins hired by competing agencies to kill each other.";

var modelPath = "path/to/EnglishSD.nbin";
var sentenceDetector = new EnglishMaximumEntropySentenceDetector(modelPath);
var sentences = sentenceDetector.SentenceDetect(paragraph);
/* 
 * sentences = ["Mr. & Mrs. Smith is a 2005 American romantic comedy action film.", 
 * "The film stars Brad Pitt and Angelina Jolie as a bored upper-middle class married couple.", 
 * "They are surprised to learn that they are both assassins hired by competing agencies to kill each other."]
 */

Técnicamente, el detector de oraciones calculará la probabilidad de que un carácter específico (’.’, ’?’, o ’!’ en el caso del inglés) marque el final de una oración.

Tokenizer

Un tokenizador divide un texto en palabras, símbolos u otros elementos significativos.

// Regular tokenizer
var modelPath = "path/to/EnglishTok.nbin";
var sentence = "- Sorry Mrs. Hudson, I'll skip the tea.";
var tokenizer = new EnglishMaximumEntropyTokenizer(modelPath);
var tokens = tokenizer.Tokenize(sentence);
// tokens = ["-", "Sorry", "Mrs.", "Hudson", ",", "I", "'ll", "skip", "the", "tea", "."]

Para inglés, existe un tokenizador específico basado en reglas (utilizando expresiones regulares) que tiene mejor precisión. Este tokenizador no requiere ningún modelo

// English tokenizer
var tokenizer = new EnglishRuleBasedTokenizer();
var sentence = "- Sorry Mrs. Hudson, I'll skip the tea.";
var tokens = tokenizer.Tokenize(sentence);
// tokens = ["-", "Sorry", "Mrs.", "Hudson", ",", "I", "'ll", "skip", "the", "tea", "."]

Part-of-speech tagger

Un etiquetador de partes del discurso asigna una parte del discurso (sustantivo, verbo, etc.) a cada token en una oración.

var modelPath = "path/to/EnglishPOS.nbin";
var tagDictDir = "path/to/tagdict/directory";
var posTagger = EnglishMaximumEntropyPosTagger(modelPath, tagdictDir);
var tokens = ["-", "Sorry", "Mrs.", "Hudson", ",", "I", "'ll", "skip", "the", "tea", "."];
var pos = posTagger.Tag(tokens);
// pos = [":", "NNP", "NNP", "NNP", ".", "PRP", "MD", "VB", "DT", "NN", "."]

Chunker

Un agrupador (chunker) es una alternativa a un analizador de oraciones completo que proporciona la estructura sintáctica parcial de una oración (por ejemplo, grupos de sustantivos/verbos).

var modelPath = "path/to/EnglishChunk.nbin";
var chunker = EnglishTreebankChunker(modelPath);
var tokens = ["-", "Sorry", "Mrs.", "Hudson", ",", "I", "'ll", "skip", "the", "tea", "."];
var pos = [":", "NNP", "NNP", "NNP", ".", "PRP", "MD", "VB", "DT", "NN", "."];
var chunks = chunker.GetChunks(tokens, tags);
// chunks = [["NP", "- Sorry Mrs. Hudson"], [",", ","], ["NP", "I"], ["VP", "'ll skip"], ["NP", "the tea"], [".", "."]]

Coreference

La correferencia detecta todas las expresiones que se refieren a las mismas entidades en un texto.

var modelPath = "path/to/coref/dir";
var coreferenceFinder = new TreebankLinker(modelPath);
var sentences = ["Mr. & Mrs. Smith is a 2005 American romantic comedy action film.", 
"The film stars Brad Pitt and Angelina Jolie as a bored upper-middle class married couple.", 
"They are surprised to learn that they are both assassins hired by competing agencies to kill each other."];
var coref = coreferenceFinder.GetCoreferenceParse(sentences);
// coref = 

Name entity recognition

El reconocimiento de entidades nombradas identifica entidades específicas en las oraciones. Con los modelos actuales, puedes detectar personas, fechas, lugares, dinero, porcentajes y tiempo.

var modelPath = "path/to/namefind/dir";
var nameFinder = new EnglishNameFinder(modelPath);
var sentence = "Mr. & Mrs. Smith is a 2005 American romantic comedy action film.";
// specify which types of entities you want to detect
var models = ["date", "location", "money", "organization", "percentage", "person", "time"];
var ner = nameFinder.GetNames(models, sentence);
// ner = Mr. & Mrs. <person>Smith</person> is a <date>2005</date> American romantic comedy action film.

Parse tree

Un analizador proporciona la estructura sintáctica completa de una oración.

var modelPath = "path/to/models/dir";
var sentence = "- Sorry Mrs Hudson, I'll skiip the tea.";
var parser = new EnglishTreebankParser(_modelPath);
var parse = parser.DoParse(sentence);
// parse = (TOP (S (NP (: -) (NNP Sorry) (NNP Mrs.) (NNP Hudson)) (, ,) (NP (PRP I)) (VP (MD 'll) (VP (VB skip) (NP (DT the) (NN tea)))) (. .)))