Conseguir que Stanford NLP reconozca entidades nombradas con varias palabras

En primer lugar, permítanme decir que soy un novato completo con PNL. Aunque, como sigue leyendo, eso probablemente se volverá sorprendentemente evidente.

Estoy analizando las páginas de Wikipedia para encontrar todas las menciones del título de la página. Hago esto yendo a través de CorefChainAnnotations para encontrar menciones "correctas". Supongo que las más comunes están hablando del título de la página. Lo hago ejecutando esto:

    Properties props = new Properties();
    props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,parse,coref");
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
    String content = "Abraham Lincoln was an American politician and lawyer who served as the 16th President of the United States from March 1861 until his assassination in April 1865. Lincoln led the United States through its Civil War—its bloodiest war and perhaps its greatest moral, constitutional, and political crisis.";
    Annotation document = new Annotation(content);
    pipeline.annotate(document);
    for (CorefChain cc : document.get(CorefCoreAnnotations.CorefChainAnnotation.class).values()) {
        List<CorefChain.CorefMention> corefMentions = cc.getMentionsInTextualOrder();
        for (CorefChain.CorefMention cm : corefMentions) {
            if (cm.mentionType == Dictionaries.MentionType.PROPER) {
                log("Proper ref using " + cm.mentionSpan + ", " + cm.mentionType);
            }
        }
    }

Esto devuelve:

Proper ref using the United States
Proper ref using the United States
Proper ref using Abraham Lincoln
Proper ref using Lincoln

Ya sé que "Abraham Lincoln" es definitivamente lo que estoy buscando y puedo suponer que porque "Lincoln" también aparece mucho, entonces esa debe ser otra forma de hablar sobre el tema principal. (Ahora me doy cuenta de que la entidad nombrada más común es "Estados Unidos", pero una vez que la he alimentado toda la página funciona bien).

Esto funciona muy bien hasta que tenga una página como "Lo que el viento se llevó". Si cambio mi código para usar eso:

String content = "Gone with the Wind has been criticized as historical revisionism glorifying slavery, but nevertheless, it has been credited for triggering changes to the way African-Americans are depicted cinematically.";

entonces no recibo ninguna mención adecuada. Sospecho que esto se debe a que ninguna de las palabras en el título se reconoce como entidades con nombre.

¿Hay alguna manera de lograr que la PNL de Stanford reconozca "Lo que el viento se llevó" como una entidad nombrada ya conocida? Al mirar en Internet parece implicar la capacitación de un modelo, pero quiero que esta sea una titularidad conocida solo para esta única carrera y no quiero que el modelo recuerde esta capacitación más adelante.

Me imagino a los expertos de PNL poniendo los ojos en blanco ante lo horrible de este enfoque, ¡pero mejora! Se me ocurrió la gran idea de cambiar cualquier aparición del título de la página a "Thingamijig" antes de pasar el texto a Stanford PNL, que funciona muy bien para "Lo que el viento se llevó", pero luego falla para "Abraham Lincoln" porque (creo) el NER ya asocia "Lincoln" con "Thingamijig" en corefMentions.

En el mundo de mis sueños, haría algo como:

    pipeline.addKnownNamedEntity("Gone with the Wind");

Pero eso no parece ser algo que pueda hacer y no estoy exactamente seguro de cómo hacerlo.

Respuesta 1

Estoy escribiendo mi primera aplicación de Google App Engine, principalmente como una experiencia de aprendizaje, es una especie de Pastebin muy simple ... No quiero lidiar con el spam, así que pensé que exigir a los usuarios iniciar sesión ...

Estoy tratando de usar la codificación externa de archivos .dll en c #, en mi aplicación Java, lo que sé sobre el dll que contiene interfaces con funciones que podemos usar, puedo cargar el dll en mi aplicación java, ...

Me preguntaba cómo contar diferentes campos de un objeto usando una sola secuencia. Sé que puedo contar fácilmente una sola propiedad de un objeto usando streams (countedWithStream) o incluso usando un para ...

Dado que tengo una tabla en la que cierto campo tiene un tipo de datos de texto, digamos que FieldValue podría dar texto como tipo de datos. Estoy guardando un objeto de fecha de Java usando el formato completo y guardando esto en el ...