Fragmentación y extracción de información
¿Qué es Chunking?
La fragmentación, uno de los procesos importantes en el procesamiento del lenguaje natural, se utiliza para identificar partes del habla (POS) y frases cortas. En otras palabras simples, con fragmentación, podemos obtener la estructura de la oración. También es llamadopartial parsing.
Patrones de trozos y grietas
Chunk patternsson los patrones de las etiquetas de parte del discurso (POS) que definen qué tipo de palabras componen un fragmento. Podemos definir patrones de fragmentos con la ayuda de expresiones regulares modificadas.
Además, también podemos definir patrones para qué tipo de palabras no deben estar en un fragmento y estas palabras sin fragmentar se conocen como chinks.
Ejemplo de implementación
En el siguiente ejemplo, junto con el resultado de analizar la oración “the book has many chapters”, hay una gramática para las frases nominales que combina un patrón de fragmentos y grietas:
import nltk
sentence = [
("the", "DT"),
("book", "NN"),
("has","VBZ"),
("many","JJ"),
("chapters","NNS")
]
chunker = nltk.RegexpParser(
r'''
NP:{<DT><NN.*><.*>*<NN.*>}
}<VB.*>{
'''
)
chunker.parse(sentence)
Output = chunker.parse(sentence)
Output.draw()
Salida
Como se vio anteriormente, el patrón para especificar un fragmento es usar llaves de la siguiente manera:
{<DT><NN>}
Y para especificar una grieta, podemos voltear las llaves de la siguiente manera:
}<VB>{.
Ahora, para un tipo de frase en particular, estas reglas se pueden combinar en una gramática.
Extracción de información
Hemos pasado por etiquetadores y analizadores que se pueden utilizar para construir un motor de extracción de información. Veamos una canalización de extracción de información básica:
La extracción de información tiene muchas aplicaciones que incluyen:
- Inteligencia de negocios
- Reanudar la cosecha
- Análisis de medios
- Detección de sentimiento
- Búsqueda de patentes
- Escaneo de correo electrónico
Reconocimiento de entidad designada (NER)
El reconocimiento de entidades con nombre (NER) es en realidad una forma de extraer algunas de las entidades más comunes, como nombres, organizaciones, ubicación, etc. Veamos un ejemplo que tomó todos los pasos de preprocesamiento, como la tokenización de oraciones, etiquetado POS, fragmentación, NER, y sigue la tubería provista en la figura anterior.
Ejemplo
Import nltk
file = open (
# provide here the absolute path for the file of text for which we want NER
)
data_text = file.read()
sentences = nltk.sent_tokenize(data_text)
tokenized_sentences = [nltk.word_tokenize(sentence) for sentence in sentences]
tagged_sentences = [nltk.pos_tag(sentence) for sentence in tokenized_sentences]
for sent in tagged_sentences:
print nltk.ne_chunk(sent)
Algunos de los reconocimientos de entidades nombradas (NER) modificados también se pueden utilizar para extraer entidades como nombres de productos, entidades biomédicas, marcas y mucho más.
Extracción de relaciones
La extracción de relaciones, otra operación de extracción de información comúnmente utilizada, es el proceso de extraer las diferentes relaciones entre varias entidades. Pueden existir diferentes relaciones como herencia, sinónimos, análogos, etc., cuya definición depende de la necesidad de información. Por ejemplo, supongamos que si queremos buscar la escritura de un libro, la autoría sería una relación entre el nombre del autor y el nombre del libro.
Ejemplo
En el siguiente ejemplo, usamos la misma canalización de IE, como se muestra en el diagrama anterior, que usamos hasta la relación de entidad con nombre (NER) y la ampliamos con un patrón de relación basado en las etiquetas NER.
import nltk
import re
IN = re.compile(r'.*\bin\b(?!\b.+ing)')
for doc in nltk.corpus.ieer.parsed_docs('NYT_19980315'):
for rel in nltk.sem.extract_rels('ORG', 'LOC', doc, corpus = 'ieer',
pattern = IN):
print(nltk.sem.rtuple(rel))
Salida
[ORG: 'WHYY'] 'in' [LOC: 'Philadelphia']
[ORG: 'McGlashan & Sarrail'] 'firm in' [LOC: 'San Mateo']
[ORG: 'Freedom Forum'] 'in' [LOC: 'Arlington']
[ORG: 'Brookings Institution'] ', the research group in' [LOC: 'Washington']
[ORG: 'Idealab'] ', a self-described business incubator based in' [LOC: 'Los Angeles']
[ORG: 'Open Text'] ', based in' [LOC: 'Waterloo']
[ORG: 'WGBH'] 'in' [LOC: 'Boston']
[ORG: 'Bastille Opera'] 'in' [LOC: 'Paris']
[ORG: 'Omnicom'] 'in' [LOC: 'New York']
[ORG: 'DDB Needham'] 'in' [LOC: 'New York']
[ORG: 'Kaplan Thaler Group'] 'in' [LOC: 'New York']
[ORG: 'BBDO South'] 'in' [LOC: 'Atlanta']
[ORG: 'Georgia-Pacific'] 'in' [LOC: 'Atlanta']
En el código anterior, hemos utilizado un corpus incorporado llamado ieer. En este corpus, las oraciones se etiquetan hasta Relación entidad con nombre (NER). Aquí solo necesitamos especificar el patrón de relación que queremos y el tipo de NER que queremos que defina la relación. En nuestro ejemplo, definimos la relación entre una organización y una ubicación. Extrajimos todas las combinaciones de estos patrones.