NeuralCoref es una extensión de tuberías para Spacy 2.1+ que anota y resuelve los grupos de coreferencia utilizando una red neuronal. NeuralCoref está listo para la producción, integrado en la tubería NLP de Spacy y extensible para nuevos conjuntos de datos de capacitación.
Para obtener una breve introducción a la resolución de coreferencia y neuralcoref, consulte nuestra publicación de blog. NeuralCoref está escrito en Python/Cython y viene con un modelo estadístico previamente capacitado solo para inglés .
NeuralCoref se acompaña de un cliente de visualización NeuralCoref-Viz, una interfaz web alimentada por un servidor REST que puede probarse en línea. NeuralCoref se publica bajo la licencia MIT.
¡Versión 4.0 ahora! Disponible en PIP y compatible con Spacy 2.1+.
Esta es la forma más fácil de instalar NeuralCoref.
pip install neuralcorefspacy.strings.StringStore size changed de error Si tiene un error que menciona spacy.strings.StringStore size changed, may indicate binary incompatibility al cargar NeuralCoref con import neuralcoref , significa que tendrá que instalar NeuralCoref de las fuentes de la distribución en lugar de las ruedas para que NeuralCoref se construya con la versión más reciente de la espacio de su sistema.
En este caso, simplemente vuelva a instalar NeuralCoref de la siguiente manera:
pip uninstall neuralcoref
pip install neuralcoref --no-binary neuralcorefPara poder usar NeuralCoref, también necesitará tener un modelo en inglés para Spacy.
Puede usar cualquier modelo de inglés que funcione bien para su aplicación, pero tenga en cuenta que las actuaciones de NeuralCoref dependen en gran medida de las actuaciones del modelo de Spacy y, en particular, de los componentes del etiquetador, analizador y ner del modelo de Spacy Model. Un modelo de inglés espacial más grande también mejorará la calidad de la resolución de coreferencia (consulte algunos detalles en la sección de partes internas y modelo a continuación).
Aquí hay un ejemplo de cómo puede instalar Spacy y un modelo inglés (pequeño) para Spacy, se puede encontrar más información en el sitio web de Spacy:
pip install -U spacy
python -m spacy download enTambién puede instalar NeuralCoref de fuentes. Primero deberá instalar las dependencias que incluyen Cython y Spacy.
Aquí está el proceso:
venv .env
source .env/bin/activate
git clone https://github.com/huggingface/neuralcoref.git
cd neuralcoref
pip install -r requirements.txt
pip install -e . NeuralCoref está hecho de dos submódulos:
La primera vez que importe NeuralCoref en Python, descargará los pesos del modelo de red neuronal en una carpeta de caché.
La carpeta de caché se establece de forma predeterminada en ~/.neuralcoref_cache (ver file_utils.py) Pero este comportamiento puede sobrepasar configurando la variable de entorno NEURALCOREF_CACHE para señalar otra ubicación.
La carpeta de caché se puede eliminar de forma segura en cualquier momento y el módulo se descargará nuevamente el modelo la próxima vez que se cargue.
Puede tener más información sobre la ubicación, el proceso de descarga y almacenamiento en caché del modelo interno activando el módulo logging de Python antes de cargar NeuralCoref de la siguiente manera:
import logging ;
logging . basicConfig ( level = logging . INFO )
import neuralcoref
> >> INFO : neuralcoref : Getting model from https : // s3 . amazonaws . com / models . huggingface . co / neuralcoref / neuralcoref . tar . gz or cache
> >> INFO : neuralcoref . file_utils : https : // s3 . amazonaws . com / models . huggingface . co / neuralcoref / neuralcoref . tar . gz not found in cache , downloading to / var / folders / yx / cw8n_njx3js5jksyw_qlp8p00000gn / T / tmp_8y5_52m
100 % | █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 40155833 / 40155833 [ 00 : 06 < 00 : 00 , 6679263.76 B / s ]
> >> INFO : neuralcoref . file_utils : copying / var / folders / yx / cw8n_njx3js5jksyw_qlp8p00000gn / T / tmp_8y5_52m to cache at / Users / thomaswolf / . neuralcoref_cache / f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14 . 7 d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633
> >> INFO : neuralcoref . file_utils : creating metadata file for / Users / thomaswolf / . neuralcoref_cache / f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14 . 7 d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633
>> > INFO : neuralcoref . file_utils : removing temp file / var / folders / yx / cw8n_njx3js5jksyw_qlp8p00000gn / T / tmp_8y5_52m
>> > INFO : neuralcoref : extracting archive file / Users / thomaswolf / . neuralcoref_cache / f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14 . 7 d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633 to dir / Users / thomaswolf / . neuralcoref_cache / neuralcoref Aquí está la forma recomendada de instanciar NeuralCoref y agregarla a la tubería de anotaciones de Spacy:
# Load your usual SpaCy model (one of SpaCy English models)
import spacy
nlp = spacy . load ( 'en' )
# Add neural coref to SpaCy's pipe
import neuralcoref
neuralcoref . add_to_pipe ( nlp )
# You're done. You can now use NeuralCoref as you usually manipulate a SpaCy document annotations.
doc = nlp ( u'My sister has a dog. She loves him.' )
doc . _ . has_coref
doc . _ . coref_clustersUna forma equivalente de agregar NeuralCoref a una tubería de modelo Spacy es instanciar primero la clase NeuralCoref y luego agregarla manualmente a la tubería del modelo de lenguaje espacial.
# Load your usual SpaCy model (one of SpaCy English models)
import spacy
nlp = spacy . load ( 'en' )
# load NeuralCoref and add it to the pipe of SpaCy's model
import neuralcoref
coref = neuralcoref . NeuralCoref ( nlp . vocab )
nlp . add_pipe ( coref , name = 'neuralcoref' )
# You're done. You can now use NeuralCoref the same way you usually manipulate a SpaCy document and it's annotations.
doc = nlp ( u'My sister has a dog. She loves him.' )
doc . _ . has_coref
doc . _ . coref_clusters NeuralCoref resolverá las coreferencias y las anotará como atributos de extensión en los objetos Spacy Doc , Span y Token bajo el ._. diccionario.
Aquí está la lista de las anotaciones:
| Atributo | Tipo | Descripción |
|---|---|---|
doc._.has_coref | booleano | ¿Se ha resuelto alguna coreferencia en el DOC? |
doc._.coref_clusters | lista de Cluster | Todos los grupos de menciones de núcleo en el documento |
doc._.coref_resolved | unicode | Representación de unicode del DOC, donde cada mención de núcleo se reemplaza por la mención principal en el clúster asociado. |
doc._.coref_scores | Dict de dict | Puntajes de la resolución de coreferencia entre menciones. |
span._.is_coref | booleano | Si el tramo tiene al menos una mención de fingiendo |
span._.coref_cluster | Cluster | Clúster de menciones que corre con el tramo |
span._.coref_scores | Dictarse | Puntajes de la resolución de coreferencia de & span con otras menciones (si corresponde). |
token._.in_coref | booleano | Si el token está dentro al menos una mención de fingiendo |
token._.coref_clusters | lista de Cluster | Todos los grupos de menciones de núcleo que contiene el token |
Un Cluster es un clúster de menciones de núcleo que tiene 3 atributos y algunos métodos para simplificar la navegación dentro de un clúster:
| Atributo o método | Tipo de tipo / retorno | Descripción |
|---|---|---|
i | intencionalmente | Índice del clúster en el doctor |
main | Span | El lapso de la mención más representativa en el clúster |
mentions | Lista de Span | Lista de todas las menciones en el clúster |
__getitem__ | Span de retorno | Acceder a una mención en el clúster |
__iter__ | rendimientos Span los rendimientos | Iterar sobre las menciones en el clúster |
__len__ | regresar int | Número de menciones en el clúster |
También puede navegar fácilmente por las cadenas de clúster de Coreference y mostrar grupos y menciones.
Aquí hay algunos ejemplos, pruébalos para probarlo por ti mismo.
import spacy
import neuralcoref
nlp = spacy . load ( 'en' )
neuralcoref . add_to_pipe ( nlp )
doc = nlp ( u'My sister has a dog. She loves him' )
doc . _ . coref_clusters
doc . _ . coref_clusters [ 1 ]. mentions
doc . _ . coref_clusters [ 1 ]. mentions [ - 1 ]
doc . _ . coref_clusters [ 1 ]. mentions [ - 1 ]. _ . coref_cluster . main
token = doc [ - 1 ]
token . _ . in_coref
token . _ . coref_clusters
span = doc [ - 1 :]
span . _ . is_coref
span . _ . coref_cluster . main
span . _ . coref_cluster . main . _ . coref_cluster IMPORTANTE : NeuralCoref Mencions son objetos Spacy -Span, lo que significa que puede acceder a todos los atributos del tramo habituales span.end span.start .
Ej: doc._.coref_clusters[1].mentions[-1].start le dará el índice del primer token de la última mención del clúster de la segunda coreferencia en el documento.
Puede pasar varios parámetros adicionales a neuralcoref.add_to_pipe o NeuralCoref() para controlar el comportamiento de NeuralCoref.
Aquí está la lista completa de estos parámetros y sus descripciones:
| Parámetro | Tipo | Descripción |
|---|---|---|
greedyness | flotar | Un número entre 0 y 1 determinando cuán codicioso se trata del modelo sobre tomar decisiones de coreferencia (más codicioso significa más enlaces de coreferencia). El valor predeterminado es 0.5. |
max_dist | intencionalmente | Cuántas menciones vuelven a mirar al considerar posibles antecedentes de la mención actual. Disminuir el valor hará que el sistema se ejecute más rápido pero con menos precisión. El valor predeterminado es 50. |
max_dist_match | intencionalmente | El sistema considerará vincular la mención actual con una anterior más allá de max_dist si comparten un sustantivo o un sustantivo propio. En este caso, se ve max_dist_match en su lugar. El valor predeterminado es 500. |
blacklist | booleano | En caso de que el sistema resuelva las orientaciones de los pronombres en la siguiente lista: ["i", "me", "my", "you", "your"] . El valor predeterminado es verdadero (coreferencia resuelta). |
store_scores | booleano | Si el sistema almacena los puntajes para las anotaciones de las anotaciones. El valor predeterminado es verdadero. |
conv_dict | dict (str, list (str)) | Un diccionario de conversión que puede usar para reemplazar los incrustaciones de palabras raras (claves) por un promedio de los incrustaciones de una lista de palabras (valores) comunes . Ej: conv_dict={"Angela": ["woman", "girl"]} ayudará a resolver las núcleos para Angela utilizando los incrustaciones para la woman y girl más comunes en lugar de la incrustación de Angela . Actualmente, esto solo funciona para palabras individuales (no para grupos de palabras). |
import spacy
import neuralcoref
# Let's load a SpaCy model
nlp = spacy . load ( 'en' )
# First way we can control a parameter
neuralcoref . add_to_pipe ( nlp , greedyness = 0.75 )
# Another way we can control a parameter
nlp . remove_pipe ( "neuralcoref" ) # This remove the current neuralcoref instance from SpaCy pipe
coref = neuralcoref . NeuralCoref ( nlp . vocab , greedyness = 0.75 )
nlp . add_pipe ( coref , name = 'neuralcoref' ) Aquí hay un ejemplo sobre cómo podemos usar el parámetro conv_dict para ayudar a resolver las núcleos de una palabra rara como un nombre:
import spacy
import neuralcoref
nlp = spacy . load ( 'en' )
# Let's try before using the conversion dictionary:
neuralcoref . add_to_pipe ( nlp )
doc = nlp ( u'Deepika has a dog. She loves him. The movie star has always been fond of animals' )
doc . _ . coref_clusters
doc . _ . coref_resolved
# >>> [Deepika: [Deepika, She, him, The movie star]]
# >>> 'Deepika has a dog. Deepika loves Deepika. Deepika has always been fond of animals'
# >>> Not very good...
# Here are three ways we can add the conversion dictionary
nlp . remove_pipe ( "neuralcoref" )
neuralcoref . add_to_pipe ( nlp , conv_dict = { 'Deepika' : [ 'woman' , 'actress' ]})
# or
nlp . remove_pipe ( "neuralcoref" )
coref = neuralcoref . NeuralCoref ( nlp . vocab , conv_dict = { 'Deepika' : [ 'woman' , 'actress' ]})
nlp . add_pipe ( coref , name = 'neuralcoref' )
# or after NeuralCoref is already in SpaCy's pipe, by modifying NeuralCoref in the pipeline
nlp . get_pipe ( 'neuralcoref' ). set_conv_dict ({ 'Deepika' : [ 'woman' , 'actress' ]})
# Let's try agin with the conversion dictionary:
doc = nlp ( u'Deepika has a dog. She loves him. The movie star has always been fond of animals' )
doc . _ . coref_clusters
# >>> [Deepika: [Deepika, She, The movie star], a dog: [a dog, him]]
# >>> 'Deepika has a dog. Deepika loves a dog. Deepika has always been fond of animals'
# >>> A lot better! Un ejemplo simple de script de servidor para integrar NeuralCoref en una API REST se proporciona como ejemplo en examples/server.py .
Para usarlo, primero debe instalar Falcon:
pip install falconLuego puede iniciar el servidor de la siguiente manera:
cd examples
python ./server.pyY consulte el servidor así:
curl --data-urlencode " text=My sister has a dog. She loves him. " -G localhost:8000Hay muchas otras formas en que puede administrar e implementar NeuralCoref. Algunos ejemplos se pueden encontrar en Spacy Universe.
Si desea volver a entrenar el modelo o entrenarlo en otro idioma, consulte nuestras instrucciones de capacitación y nuestra publicación de blog