Este artículo está destinado a aquellos que nunca han trabajado con Stanford nlp y se enfrentan a la necesidad de estudiarlo y aplicarlo lo antes posible.
Este software es bastante común y, en particular, nuestra empresa,
BaltInfoCom , utiliza este programa.
Primero debe comprender algo simple: Stanford NLP funciona según el principio de anotar palabras, es decir, una o más anotaciones, como POS (Parte del habla - parte del habla), NER (Reconocimiento de entidad con nombre - Entidad con nombre), y etc.
Lo primero que ve un principiante cuando va al sitio web de Stanford NLP en la sección "
inicio rápido " es el siguiente diseño:
Properties props = new Properties(); props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,regexner,parse,depparse,coref"); StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
Aquí StanfordCoreNLP es un transportador, a cuya entrada nuestro texto se empaqueta previamente en un objeto CoreDocument. StanfordCoreNLP, este es el objeto más importante y de uso frecuente en toda la estructura, con el que se realiza todo el trabajo principal.
Primero, establecemos los parámetros en StanfordCoreNLP e indicamos la implementación de las acciones que necesitamos. Además, todas las combinaciones posibles de estos parámetros se pueden encontrar en el sitio web oficial en
este enlace.
- tokenizar - en consecuencia, tokenización
- ssplit: división en una oración
- pos - definición de una parte del discurso
- lema: agregar a cada palabra su forma inicial
- ner: definición de entidades con nombre, como "Organización", "Cara", etc.
- regexner: definición de entidades con nombre utilizando expresiones regulares
- análisis: análisis de cada palabra según la semántica (género, número, etc.)
- depparse: dependencias de sintaxis de análisis entre palabras en una oración
- coref- busca referencias a la misma entidad nombrada en el texto, por ejemplo, "Mary" y "she"
Aquí hay un ejemplo de cómo los anotadores (análisis y análisis) trabajan juntos:

Si no comprende las anotaciones sobre los tokens, en estos sitios encontrará sus significados:
significados de conexiones en oraciones ,
significados de partes del discurso .
Para cada uno de estos parámetros, puede encontrar indicadores adicionales para un ajuste más preciso
aquí en la sección "Anotadores".
Estas construcciones se establecen si desea utilizar los modelos NLP Stanford integrados, pero también puede configurarlos manualmente utilizando el método addAnnotator (Annotator ...) o reponiendo los parámetros antes de crear el objeto StanfordCoreNLP.
Ahora sobre cómo puede extraer entidades con nombre del texto. Para hacer esto, Stanford NLP tiene tres clases integradas basadas en expresiones regulares y una clase para marcar tokens a través del modelo.
Clases de expresión regular:
- TokensRegexAnnotator - anotador que funciona según las reglas - SequenceMatchRules .
Considere un ejemplo de mapeo para él, basado en estas reglas.
ner = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$NamedEntityTagAnnotation" } $EMAIL = "/.*([A-z0-9-]+?)(@)([A-z0-9-]+?).*/" { ruleType: "tokens", pattern: (([]) ($EMAIL)), action: (Annotate($0, ner, "MAIL")), priority:0 }
La primera línea indica qué tipo de etiquetas rellenaremos en esta plantilla.
En el segundo, creamos una variable, que de acuerdo con las reglas debe comenzar con el carácter "$" y estar al comienzo de la línea.
Después de eso, cree un bloque en el que establezcamos el tipo de reglas. Luego, una plantilla para la comparación (en nuestro caso, decimos que necesitamos "[]" - cualquier token después del cual viene nuestra variable $ EMAIL. Después de eso establecemos la acción, en nuestro caso queremos anotar el token.
Tenga en cuenta que en el ejemplo, "[]" y "$ EMAIL" están entre paréntesis porque $ 0 indica qué grupo de captura queremos resaltar de la plantilla encontrada, mientras que el grupo de captura significa un grupo entre paréntesis. Si establece 0, en la frase "sobaka@mail.ru mail" todos los tokens se anotarán como "CORREO". Si establece 1 (es decir, el primer grupo de captura), solo se anotará la palabra "correo"; si 2, entonces solo sobaka@mail.ru.
Para situaciones en las que, de acuerdo con dos reglas, el mismo token se puede definir de manera diferente, puede establecer la prioridad de la regla en relación con la otra. Por ejemplo, en el caso de la siguiente frase: “Casa $ 25”, puede haber dos reglas en conflicto, según una de las cuales el número 25 se determinará como el número de la casa y, según la segunda, como su valor. - RegexNERAnnotator : este anotador funciona con el RegexNERSequenceClassifier .
El mapeo para él es el siguiente
regex1 TYPE overwritableType1,Type2... priority
Aquí regex1 es una expresión regular en el formato TokenSequencePattern .
TYPE es el nombre de la entidad nombrada.
overwritableType1, Type2 ... - tipos que podemos reemplazar en casos de una situación contenciosa.
Prioridad: prioridad para las disputas descritas anteriormente.
Tenga en cuenta que en esta asignación todas las columnas deben estar separadas por pestañas. - TokensRegexNERAnnotator
Este anotador difiere del anterior en que usa la biblioteca TokensRegex para expresiones regulares, igual que el primer anotador, que le permite usar reglas más flexibles para la coincidencia; además de poder registrar valores de etiqueta distintos a la etiqueta NER.
El mapeo para él se compila de acuerdo con las reglas de RegexNERAnnotator
Marcar texto a través de un modelo usando NERClassifierCombiner
Para utilizar esta clase, primero debe tener o entrenar su modelo.
Cómo hacer esto se puede encontrar
aquí ;
Después de entrenar el modelo, solo queda crear un NERClassifierCombiner, que indica la ruta al modelo en él, y llamar al método de clasificación.
NERClassifierCombiner classifier = new NERClassifierCombiner(false, false, serialized_model); String text = "Some lucky people working in BaltInfoCom Org."; List<List<CoreLabel>> out = classifier.classify(text);
Puede encontrar una lista completa de anotadores
aquí .
Además de lo anterior, si necesita utilizar Stanford NLP para el idioma ruso, puedo aconsejarle que venga
aquí . Existen modelos para identificar partes del discurso (pos-tagger) y para identificar relaciones en oraciones (analizador de dependencia).
Tipos de etiquetas representadas allí:
russian-ud-pos.tagger es solo un etiquetador,
russian-ud-mfmini.tagger - con la lista principal de características morfológicas,
russian-ud-mf.tagger - con una lista completa de características morfológicas, un ejemplo de mapeo para el cual se puede ver
aquí .