nlp - tengo - ¿Qué hace el modelo NER para encontrar nombres de personas dentro de un currículum/CV?
que datos personales poner en el cv (4)
Acabo de comenzar con Stanford CoreNLP, me gustaría construir un modelo NER personalizado para encontrar personas .
Lamentablemente, no encontré un buen modelo ner para italiano. Necesito encontrar estas entidades dentro de un currículum / documento CV.
El problema aquí es que documentos como esos pueden tener una estructura diferente, por ejemplo, puedo tener:
CASO 1
- Name: John
- Surname: Travolta
- Last name: Travolta
- Full name: John Travolta
(so many labels that can represent the entity of the person i need to extract)
CASO 2
My name is John Travolta and I was born ...
Básicamente, puedo tener datos estructurados (con diferentes etiquetas) o un contexto donde debería encontrar estas entidades.
¿Cuál es el mejor enfoque para este tipo de documentos? ¿Puede funcionar un modelo maxent en este caso?
EDIT @ vihari-piratla
Por el momento, adopto la estrategia para encontrar un patrón que tenga algo a la izquierda y algo a la derecha, siguiendo este método tengo 80/85% para encontrar la entidad.
Ejemplo:
Name: John
Birthdate: 2000-01-01
Significa que tengo "Nombre:" a la izquierda del patrón y un / n a la derecha (hasta que encuentre / n ). Puedo crear una lista muy larga de patrones como esos. Pensé en patrones porque no necesito nombres dentro del contexto "otro".
Por ejemplo, si el usuario escribe otros nombres dentro de una experiencia laboral , no los necesito. Porque estoy buscando el nombre personal, no otros. Con este método puedo reducir los falsos positivos porque miraré patrones específicos, no nombres generales.
Un problema con este método es que tengo una gran lista de patrones (1 patrón = 1 expresión regular), por lo que no se escala tan bien si agrego otros.
Si puedo entrenar un modelo NER con todos esos patrones, será increíble, pero debería usar toneladas de documentos para entrenarlo bien.
El enfoque tradicional (y probablemente el mejor) para el Caso 1 es escribir el código de segmentación del documento, mientras que el Caso 2 es para lo que están diseñados la mayoría de los sistemas. Puede buscar google scholar para "segmentación de documentos" para obtener algunas ideas para el "mejor" enfoque. El más comúnmente implementado (y el más fácil de hacer) es simplemente usar expresiones regulares que pueden ser altamente efectivas si la estructura del documento es consistente. Otros enfoques son más complejos, pero generalmente se necesitan cuando hay más diversidad en la estructura del documento.
Su NER Pipeline como mínimo necesitará:
- Preprocesamiento / tokenización de texto. Comience con solo unas simples reglas de tokenización
- Segmentación de documentos (dos puntos, guiones, encabezados de localización, cualquier forma, etc.). Comenzaría con expresiones regulares para esto.
- Etiquetado POS (preferiblemente usando algo fuera de la plataforma como TreeTagger que ha funcionado con italiano)
- NER, un modelo de MaxEnt funcionará, algunas características importantes para esto serían las mayúsculas, las etiquetas POS y probablemente las características del diccionario (¿directorio telefónico italiano?). Necesitará algunos datos etiquetados.
puede usar Stanford NLP. Por ejemplo, aquí hay un código python que usa nltk y stanford mlp libraries
docText="your input string goes here"
words = re.split("/W+",docText)
stops = set(stopwords.words("english"))
#remove stop words from the list
words = [w for w in words if w not in stops and len(w) > 2]
str = " ".join(words)
print str
stn = StanfordNERTagger(''english.all.3class.distsim.crf.ser.gz'')
stp = StanfordPOSTagger(''english-bidirectional-distsim.tagger'')
stanfordPosTagList=[word for word,pos in stp.tag(str.split()) if pos == ''NNP'']
print "Stanford POS Tagged"
print stanfordPosTagList
tagged = stn.tag(stanfordPosTagList)
print tagged
esto debería darle todos los nombres propios en la cadena de entrada
Si está hablando de documento de CV / CV, la mejor opción es crear un corpus o comenzar con una expectativa de "precisión" reducida y construir el corpus de forma dinámica enseñando el sistema a medida que los usuarios utilizan su sistema. Puede ser OpenNLP o StanfordNLP o cualquier otro. Dentro de las limitaciones de mis "aprendizajes", los NER no están lo suficientemente maduros para los documentos de currículum / CV para el tipo de inglés en sí mismo.
El primer caso podría ser trivial, y estoy de acuerdo con la sugerencia de Ozborn.
Me gustaría hacer algunas sugerencias para el caso-2.
Stanford NLP proporciona un excelente reconocedor de nombres en inglés, pero es posible que no pueda encontrar todos los nombres de las personas. OpenNLP también ofrece un rendimiento decente, pero mucho menos que Stanford. Hay muchos otros reconocedores de entidades disponibles para inglés. Me centraré aquí en StanfordNLP, aquí hay algunas cosas que considerar.
Gacetas. Puede proporcionarle al modelo una lista de nombres y también personalizar el modo en que coinciden las entradas de la Gaceta. Stanford también proporciona una opción de coincidencia descuidada cuando se establece, permitirá coincidencias parciales con las entradas de la Gaceta. Las coincidencias parciales deberían funcionar bien con los nombres de las personas.
Stanford reconoce entidades de forma constructiva. Si en un documento se reconoce un nombre como "John Travolta", también obtendría "Travolta" en el mismo documento, incluso si no tenía una idea previa sobre "Travolta". Por lo tanto, añada tanta información al documento como sea posible. Agregue los nombres reconocidos en el caso-1, en un contexto familiar como "Mi nombre es John Travolta". si "John Travolta" es reconocido por las reglas empleadas en el caso-1. Agregar oraciones ficticias puede mejorar el recuerdo.
Establecer un punto de referencia para la capacitación es un proceso muy costoso y aburrido; debe anotar en el orden de decenas de miles de frases para un rendimiento de prueba decente. Estoy seguro de que incluso si tiene un modelo entrenado en datos de entrenamiento anotados, el rendimiento no será mejor que cuando tiene los dos pasos anteriores implementados.
@editar
Dado que el que hace esta pregunta está interesado en los enfoques basados en patrones no supervisados, estoy expandiendo mi respuesta para discutir estos.
Cuando los datos supervisados no están disponibles, generalmente se usa un método llamado enfoque de aprendizaje de patrones bootstrapped. El algoritmo comienza con un pequeño conjunto de instancias iniciales de interés (como una lista de libros) y genera más instancias del mismo tipo.
Consulte los siguientes recursos para obtener más información
- SPIED es un software que utiliza la técnica descrita anteriormente y está disponible para su descarga y uso.
- Sonal Gupta recibió Ph.D. sobre este tema, su disertación está disponible aquí .
- Para una introducción ligera sobre este tema, vea estas diapositivas .
Gracias