NeuralCoref est une extension de pipeline pour Spacy 2.1+ qui annote et résout les grappes de coreférence à l'aide d'un réseau neuronal. NeuralCoref est prêt pour la production, intégré dans le pipeline NLP de Spacy et extensible aux nouveaux ensembles de données de formation.
Pour une brève introduction à la résolution de coreférence et à NeuralCoref, veuillez vous référer à notre article de blog. NeuralCoref est écrit en Python / Cython et est livré avec un modèle statistique pré-formé pour l'anglais uniquement .
NeuralCoref est accompagné d'un client de visualisation NeuralCoref-viz, une interface Web alimentée par un serveur de repos qui peut être essayé en ligne. NeuralCoref est libéré sous la licence du MIT.
Version 4.0 OUT MAINTENANT! Disponible sur PIP et compatible avec Spacy 2.1+.
C'est le moyen le plus simple d'installer NeuralCoref.
pip install neuralcorefspacy.strings.StringStore size changed d'erreur Si vous avez une erreur en mentionnant spacy.strings.StringStore size changed, may indicate binary incompatibility lors du chargement de NeuralCoref avec import neuralcoref , cela signifie que vous devrez installer NeuralCoref à partir des sources de la distribution au lieu des roues pour que NeuralCoref s'appuie contre la version la plus récente de Spacy pour votre système.
Dans ce cas, réinstallez simplement NeuralCoref comme suit:
pip uninstall neuralcoref
pip install neuralcoref --no-binary neuralcorefPour pouvoir utiliser NeuralCoref, vous devrez également avoir un modèle anglais pour Spacy.
Vous pouvez utiliser tout le modèle anglais fonctionne bien pour votre application, mais notez que les performances de NeuralCoref dépendent fortement des performances du modèle Spacy et en particulier des performances des composants Tagger, Parser et NER de Spacy Model. Un modèle d'anglais Spacy plus grand améliorera ainsi la qualité de la résolution de coréférence également (voir certains détails dans la section internes et modèle ci-dessous).
Voici un exemple de la façon dont vous pouvez installer Spacy et un (petit) modèle anglais pour Spacy, plus d'informations peuvent être trouvées sur le site Web de Spacy:
pip install -U spacy
python -m spacy download enVous pouvez également installer NeuralCoref à partir de sources. Vous devrez d'abord installer les dépendances qui comprennent le cython et le spacy.
Voici le processus:
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 composé de deux sous-modules:
La première fois que vous importez NeuralCoref dans Python, il téléchargera les poids du modèle de réseau neuronal dans un dossier de cache.
Le dossier de cache est défini par défaut à ~/.neuralcoref_cache (voir file_utils.py), mais ce comportement peut être exagéré en définissant la variable d'environnement NEURALCOREF_CACHE pour pointer vers un autre emplacement.
Le dossier de cache peut être supprimé en toute sécurité à tout moment et le module téléchargera à nouveau le modèle la prochaine fois qu'il sera chargé.
Vous pouvez avoir plus d'informations sur l'emplacement, le téléchargement et le processus de mise en cache du modèle interne en activant le module logging de Python avant de charger NeuralCoref comme suit:
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 Voici le moyen recommandé d'instancier NeuralCoref et de l'ajouter au pipeline d'annotations 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_clustersUne manière équivalente d'ajouter NeuralCoref à un tuyau de modèle spacy est d'instancier d'abord la classe NEURALCOREF, puis de l'ajouter manuellement au tuyau du modèle de langue spactive.
# 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 résoudra les Coreferences et les annotera sous forme d'attributs d'extension dans les objets Doc , Span et Token Spacy Doc sous le ._. dictionnaire.
Voici la liste des annotations:
| Attribut | Taper | Description |
|---|---|---|
doc._.has_coref | booléen | Une coreférence a-t-elle été résolue dans le doc |
doc._.coref_clusters | Cluster | Tous les grappes de mentions de coreforting dans le doc |
doc._.coref_resolved | unicode | Représentation Unicode du DOC où chaque mention de coreforting est remplacée par la mention principale dans le cluster associé. |
doc._.coref_scores | Dict | Scores de la résolution de coréférence entre les mentions. |
span._.is_coref | booléen | Si la durée a au moins une mention de coreforting |
span._.coref_cluster | Cluster | Groupe de mentions ce corefer avec la durée |
span._.coref_scores | Diction | Scores de la résolution et de l'étendue de la coreférence avec d'autres mentions (le cas échéant). |
token._.in_coref | booléen | Si le jeton est à l'intérieur d'au moins une mention de coreforting |
token._.coref_clusters | Cluster | Tous les grappes de mentions de coreforting qui contient le jeton |
Un Cluster est un groupe de mentions CoreForring qui a 3 attributs et quelques méthodes pour simplifier la navigation à l'intérieur d'un cluster:
| Attribut ou méthode | Type / type de retour | Description |
|---|---|---|
i | int | Index du cluster dans le doc |
main | Span | Span de la mention la plus représentative du cluster |
mentions | Liste de Span | Liste de toutes les mentions du cluster |
__getitem__ | Span de retour | Accéder à une mention dans le cluster |
__iter__ | Créent Span | Itérer sur les mentions dans le cluster |
__len__ | Retour int | Nombre de mentions dans le cluster |
Vous pouvez également naviguer facilement dans les chaînes de cluster de Coreference et afficher des grappes et des mentions.
Voici quelques exemples, essayez-les pour le tester par vous-même.
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 IMPORTANT : NeuralCoref Mentions sont des objets Spacy Span, ce qui signifie que vous pouvez accéder à tous les attributs de Span habituels comme span.start (index du premier jeton de la portée du document), span.end (index du premier jeton après la durée du document), etc.
EX: doc._.coref_clusters[1].mentions[-1].start vous donnera l'index du premier jeton de la dernière mention du deuxième cluster de coreférence dans le document.
Vous pouvez transmettre plusieurs paramètres supplémentaires à neuralcoref.add_to_pipe ou NeuralCoref() pour contrôler le comportement de NeuralCoref.
Voici la liste complète de ces paramètres et leurs descriptions:
| Paramètre | Taper | Description |
|---|---|---|
greedyness | flotter | Un nombre entre 0 et 1 déterminant à quel point le modèle est gourmand de prendre des décisions de coreférence (plus de gourmandes signifie plus de liens de coreférence). La valeur par défaut est de 0,5. |
max_dist | int | Combien de mentions de retour à regarder lorsque l'on considère les éventuels antécédents de la mention actuelle. La diminution de la valeur entraînera une exécution plus rapide du système mais moins précisément. La valeur par défaut est 50. |
max_dist_match | int | Le système envisagera de lier la mention actuelle à un précédent plus loin que max_dist s'il partage un nom ou un nom approprié. Dans ce cas, il semble max_dist_match à la place. La valeur par défaut est de 500. |
blacklist | booléen | Si le système résoudre les coreférences pour les pronoms dans la liste suivante: ["i", "me", "my", "you", "your"] . La valeur par défaut est vraie (CoreFerence résolue). |
store_scores | booléen | Si le système stockait les scores des coreférences en annotations. La valeur par défaut est vraie. |
conv_dict | dict (str, liste (str)) | Un dictionnaire de conversion que vous pouvez utiliser pour remplacer les intérêts de mots rares (clés) par une moyenne des intérêts d'une liste de mots communs (valeurs). Ex: conv_dict={"Angela": ["woman", "girl"]} aidera à résoudre les coreférences pour Angela en utilisant les intérêts pour la woman et girl plus communes au lieu de l'incorporation d' Angela . Cela ne fonctionne actuellement que pour les mots uniques (pas pour les groupes de mots). |
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' ) Voici un exemple sur la façon dont nous pouvons utiliser le paramètre conv_dict pour aider à résoudre les coreFérences d'un rare comme un nom:
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 exemple simple de script de serveur pour intégrer NeuralCoref dans une API REST est fourni comme exemple dans examples/server.py .
Pour l'utiliser, vous devez d'abord installer Falcon:
pip install falconVous pouvez ensuite démarrer le serveur comme suit:
cd examples
python ./server.pyEt interrogez le serveur comme ceci:
curl --data-urlencode " text=My sister has a dog. She loves him. " -G localhost:8000Il existe de nombreuses autres façons de gérer et de déployer NeuralCoref. Certains exemples peuvent être trouvés dans l'univers Spacy.
Si vous souhaitez recycler le modèle ou le former sur une autre langue, consultez nos instructions de formation ainsi que notre article de blog