nlp - gramas - n grams linguistics
Entrenamiento n-gram NER con Stanford NLP (3)
Enfrenté el mismo desafío de etiquetar frases ngram para el dominio automático. Estaba buscando un mapeo de palabras clave eficiente que pueda usarse para crear archivos de capacitación en una etapa posterior. Terminé usando regexNER en el canal de NLP, proporcionando un archivo de mapeo con las expresiones regulares (términos de componente ngram) y su etiqueta correspondiente. Tenga en cuenta que no hay aprendizaje automático NER logrado en este caso. Espero que esta información ayude a alguien!
Recientemente he estado tratando de entrenar entidades de n-gramas con Stanford Core NLP. He seguido los siguientes tutoriales: http://nlp.stanford.edu/software/crf-faq.shtml#b
Con esto, puedo especificar solo tokens de unigram y la clase a la que pertenece. ¿Puede alguien guiarme para que pueda extenderlo a n-grams? Estoy tratando de extraer entidades conocidas como nombres de películas del conjunto de datos de chat.
Guíeme por favor en caso de que haya malinterpretado los tutoriales de Stanford y se pueda utilizar el mismo para el entrenamiento de n-gramas.
Lo que estoy atascado es la siguiente propiedad
#structure of your training file; this tells the classifier
#that the word is in column 0 and the correct answer is in
#column 1
map = word=0,answer=1
Aquí la primera columna es la palabra (unigram) y la segunda columna es la entidad, por ejemplo
CHAPTER O
I O
Emma PERS
Woodhouse PERS
Ahora que necesito entrenar a entidades conocidas (por ejemplo, nombres de películas) como Hulk , Titanic , etc. como películas, sería fácil con este enfoque. Pero en caso de que necesite entrenar , sé lo que hiciste el verano pasado o el día del bebé , ¿cuál es el mejor enfoque?
Había sido una larga espera aquí por una respuesta. No he podido descubrir la manera de hacerlo usando Stanford Core. Sin embargo la misión cumplida. He usado las bibliotecas LingPipe NLP para el mismo. Solo citando la respuesta aquí porque, creo que alguien más podría beneficiarse de ella.
Consulte la licencia de Lingpipe antes de sumergirse en una implementación en caso de que sea un desarrollador o investigador o lo que sea.
Lingpipe proporciona varios métodos NER.
1) Diccionario basado en NER
2) NER estadística (basada en HMM)
3) NER basada en reglas, etc.
He utilizado el Diccionario, así como los enfoques estadísticos.
La primera es una metodología de búsqueda directa y la segunda es una capacitación basada.
Un ejemplo para el NER basado en diccionario se puede encontrar here
El enfoque estadístico requiere un archivo de entrenamiento. He usado el archivo con el siguiente formato:
<root>
<s> data line with the <ENAMEX TYPE="myentity">entity1</ENAMEX> to be trained</s>
...
<s> with the <ENAMEX TYPE="myentity">entity2</ENAMEX> annotated </s>
</root>
Luego utilicé el siguiente código para entrenar a las entidades.
import java.io.File;
import java.io.IOException;
import com.aliasi.chunk.CharLmHmmChunker;
import com.aliasi.corpus.parsers.Muc6ChunkParser;
import com.aliasi.hmm.HmmCharLmEstimator;
import com.aliasi.tokenizer.IndoEuropeanTokenizerFactory;
import com.aliasi.tokenizer.TokenizerFactory;
import com.aliasi.util.AbstractExternalizable;
@SuppressWarnings("deprecation")
public class TrainEntities {
static final int MAX_N_GRAM = 50;
static final int NUM_CHARS = 300;
static final double LM_INTERPOLATION = MAX_N_GRAM; // default behavior
public static void main(String[] args) throws IOException {
File corpusFile = new File("inputfile.txt");// my annotated file
File modelFile = new File("outputmodelfile.model");
System.out.println("Setting up Chunker Estimator");
TokenizerFactory factory
= IndoEuropeanTokenizerFactory.INSTANCE;
HmmCharLmEstimator hmmEstimator
= new HmmCharLmEstimator(MAX_N_GRAM,NUM_CHARS,LM_INTERPOLATION);
CharLmHmmChunker chunkerEstimator
= new CharLmHmmChunker(factory,hmmEstimator);
System.out.println("Setting up Data Parser");
Muc6ChunkParser parser = new Muc6ChunkParser();
parser.setHandler( chunkerEstimator);
System.out.println("Training with Data from File=" + corpusFile);
parser.parse(corpusFile);
System.out.println("Compiling and Writing Model to File=" + modelFile);
AbstractExternalizable.compileTo(chunkerEstimator,modelFile);
}
}
Y para probar el NER utilicé la siguiente clase.
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Set;
import com.aliasi.chunk.Chunk;
import com.aliasi.chunk.Chunker;
import com.aliasi.chunk.Chunking;
import com.aliasi.util.AbstractExternalizable;
public class Recognition {
public static void main(String[] args) throws Exception {
File modelFile = new File("outputmodelfile.model");
Chunker chunker = (Chunker) AbstractExternalizable
.readObject(modelFile);
String testString="my test string";
Chunking chunking = chunker.chunk(testString);
Set<Chunk> test = chunking.chunkSet();
for (Chunk c : test) {
System.out.println(testString + " : "
+ testString.substring(c.start(), c.end()) + " >> "
+ c.type());
}
}
}
Código de cortesía: Google :)
La respuesta se da básicamente en su ejemplo citado, donde "Emma Woodhouse" es un nombre único. Los modelos predeterminados que suministramos utilizan codificación IO, y suponemos que los tokens adyacentes de la misma clase son parte de la misma entidad. En muchas circunstancias, esto es casi siempre cierto y mantiene los modelos más simples. Sin embargo, si no quieres hacer eso, puedes entrenar modelos NER con otras codificaciones de etiquetas, como la codificación IOB comúnmente utilizada, donde en su lugar etiquetarías cosas:
Emma B-PERSON
Woodhouse I-PERSON
Luego, se pueden representar las fichas adyacentes de la misma categoría pero no la misma entidad.