NeuralCoref ist eine Pipeline -Erweiterung für Spacy 2.1+, die Coreference -Cluster mithilfe eines neuronalen Netzwerks kommentiert und auflöst. NeuralCoref ist produktionsbereit, in die NLP-Pipeline von Spact integriert und für neue Trainingsdatensätze erweiterbar.
Eine kurze Einführung in die Coreference -Lösung und die Neuralcoref finden Sie in unserem Blog -Beitrag. NeuralCoref ist in Python/Cython geschrieben und verfügt über ein vorgebildetes statistisches Modell nur für Englisch .
NeuralCoref wird von einem Visualisierungs-Client NeuralCoref-Viz begleitet, einer Weboberfläche, die von einem REST-Server betrieben wird, der online ausprobiert werden kann. NeuralCoref wird unter der MIT -Lizenz veröffentlicht.
Version 4.0 jetzt! Erhältlich auf PIP und kompatibel mit Spacy 2.1+.
Dies ist der einfachste Weg, NeuralCoref zu installieren.
pip install neuralcorefspacy.strings.StringStore size changed Fehler Wenn Sie einen Fehler haben, der über spacy.strings.StringStore size changed, may indicate binary incompatibility beim Laden von Neuralcoref mit import neuralcoref angeben. Dies bedeutet, dass Sie NeuralCoref aus der Quellen der Verteilung anstelle der Räder installieren müssen, um Neuralcoref gegen die jüngste Version von Spacy für Ihr System zu bauen.
In diesem Fall können Neuralcoref einfach wie folgt neu installieren:
pip uninstall neuralcoref
pip install neuralcoref --no-binary neuralcorefUm NeuralCoref verwenden zu können, benötigen Sie auch ein englisches Modell für Spacy.
Sie können das englische Modell für Ihre Anwendung verwenden, jedoch beachten Sie, dass die Leistungen von NeuralCoref stark von den Leistungen des Spacy -Modells und insbesondere von den Aufführungen des Tagger-, Parser- und NER -Komponenten des Spact -Modells abhängen. Ein größeres englisches Spact -Modell wird somit auch die Qualität der Koreferenzauflösung verbessern (siehe einige Details im Abschnitt Interna und Modells unten).
Hier ist ein Beispiel dafür, wie Sie Spacy und ein (kleines) englisches Modell für Spacy installieren können. Weitere Informationen finden Sie auf der Website von Spacy:
pip install -U spacy
python -m spacy download enSie können NeuralCoref auch aus Quellen installieren. Sie müssen zuerst die Abhängigkeiten installieren, einschließlich Cython und Spacy.
Hier ist der Prozess:
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 besteht aus zwei Submodulen:
Wenn Sie NeuralCoref in Python zum ersten Mal importieren, wird das Gewicht des neuronalen Netzwerkmodells in einem Cache -Ordner heruntergeladen.
Der Cache -Ordner wird standardmäßig auf ~/.neuralcoref_cache (siehe File_utils.py) eingestellt. Dieses Verhalten kann jedoch übergeführt werden, indem die Umgebungsvariable NEURALCOREF_CACHE so eingestellt wird, dass sie auf einen anderen Ort verweist.
Der Cache -Ordner kann jederzeit sicher gelöscht werden und das Modul wird das Modell beim nächsten Laden erneut herunterladen.
Sie können weitere Informationen zum Standort, zum Herunterladen und zum Ausbruch des internen Modells erhalten, indem Sie das logging von Python wie folgt aktivieren:
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 Hier finden Sie die empfohlene Möglichkeit, Neuralcoref zu instanziieren und zu Spacys Pipeline der Anmerkungen hinzuzufügen:
# 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_clustersEine äquivalente Methode zum Hinzufügen von Neuralcoref zu einem Spacy -Modellrohr besteht darin, zuerst die Neuralcoref -Klasse zu instanziieren und sie dann manuell in die Pfeife des Spacy -Sprachmodells hinzuzufügen.
# 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 löst die Kernberichte und kommentiert sie als Erweiterungsattribute im Doc , Span und Token -Objekten unter der ._. Wörterbuch.
Hier ist die Liste der Anmerkungen:
| Attribut | Typ | Beschreibung |
|---|---|---|
doc._.has_coref | boolean | Hat im Dokument eine Korreferenzaufnahme gelöst |
doc._.coref_clusters | Liste der Cluster | Alle Cluster von Corefering -Erwähnungen im Dokument |
doc._.coref_resolved | Unicode | Unicode -Darstellung des DOC, bei dem jede Kernvertsuchung durch die Hauptversuche im zugehörigen Cluster ersetzt wird. |
doc._.coref_scores | DICT OF DICT | Punktzahlen der Koreferenzauflösung zwischen Erwähnungen. |
span._.is_coref | boolean | Ob die Spannweite mindestens eine Kernaussage hat |
span._.coref_cluster | Cluster | Cluster von Erwähnungen, die mit der Spannweite kernt |
span._.coref_scores | DICT | Bewertungen der Kerneferenzauflösung von & Span mit anderen Erwähnungen (falls zutreffend). |
token._.in_coref | boolean | Ob das Token im Inneren ist |
token._.coref_clusters | Liste der Cluster | Alle Cluster von Corefering -Erwähnungen, die das Token enthalten |
Ein Cluster ist ein Cluster von CoreFerring -Erwähnungen, die 3 Attribute und einige Methoden zur Vereinfachung der Navigation in einem Cluster haben:
| Attribut oder Methode | Typ / Rückgabeart | Beschreibung |
|---|---|---|
i | int | Index des Clusters im DOC |
main | Span | Spanne der repräsentativsten Erwähnung im Cluster |
mentions | Liste der Span | Liste aller Erwähnungen im Cluster |
__getitem__ | Span | Zugriff auf eine Erwähnung im Cluster |
__iter__ | ergibt Span | Über Erwähnungen im Cluster wiederholen |
__len__ | return int | Anzahl der Erwähnungen im Cluster |
Sie können auch einfach durch die Coreference -Clusterketten navigieren und Cluster und Erwähnungen anzeigen.
Hier sind einige Beispiele, probieren Sie sie aus, um es selbst zu testen.
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 WICHTIG : NeuralCoref -Erwähnungen sind Spacy Spaces -Objekte, was bedeutet, dass Sie auf alle üblichen Span -Attribute wie span.start (Index des ersten Tokens der Span im Dokument) zugreifen können, span.end (Index des ersten Tokens nach der Span im Dokument) usw.
Bsp. doc._.coref_clusters[1].mentions[-1].start gibt Ihnen den Index des ersten Tokens der letzten Erwähnung des zweiten Coreference-Cluster im Dokument.
Sie können mehrere zusätzliche Parameter an neuralcoref.add_to_pipe oder NeuralCoref() übergeben, um das Verhalten von NeuralCoref zu kontrollieren.
Hier ist die vollständige Liste dieser Parameter und ihrer Beschreibungen:
| Parameter | Typ | Beschreibung |
|---|---|---|
greedyness | schweben | Eine Zahl zwischen 0 und 1, die feststellt, wie gierig das Modell darum geht, Kernentscheidungen zu treffen (mehr gierige bedeutet mehr Coreference -Verbindungen). Der Standardwert beträgt 0,5. |
max_dist | int | Wie viele Erwähnungen sind wieder aussehen, wenn es darum geht, mögliche Voraussetzungen der aktuellen Erwähnung zu betrachten? Durch die Verringerung des Wertes läuft das System schneller, aber weniger genau. Der Standardwert beträgt 50. |
max_dist_match | int | Das System wird erwägen, die aktuelle Erwähnung mit einem vorangegangenen zu max_dist , wenn es ein Substantiv oder ein ordnungsgemäßes Substantiv teilt. In diesem Fall sieht es stattdessen max_dist_match weg. Der Standardwert beträgt 500. |
blacklist | boolean | Sollten das System Coreferences für Pronomen in der folgenden Liste auflösen: ["i", "me", "my", "you", "your"] . Der Standardwert ist wahr (Coreference behoben). |
store_scores | boolean | Sollte das System die Ergebnisse für die Kernberichte in Anmerkungen speichern. Der Standardwert ist wahr. |
conv_dict | dict (str, list (str)) | Ein Konvertierungswörterbuch, mit dem Sie die Einbettungen seltener Wörter (Schlüssel) durch einen Durchschnitt der Einbettungen einer Liste gemeinsamer Wörter (Werte) ersetzen können. Ex: conv_dict={"Angela": ["woman", "girl"]} hilft bei der Lösung von Kernversorgungen für Angela , indem sie die Einbettungen für die allgemeine woman und girl anstelle der Einbettung von Angela verwenden. Dies funktioniert derzeit nur für einzelne Wörter (nicht für Wordsgruppen). |
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' ) Hier ist ein Beispiel dafür, wie wir das Parameter conv_dict verwenden können, um die Lösung von Kernbereichen eines seltenen Wortes wie ein Name zu beheben:
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! Ein einfaches Beispiel für das Server -Skript zur Integration von NeuralCoref in eine REST -API wird in examples/server.py als Beispiel bereitgestellt.
Um es zu verwenden, müssen Sie zuerst Falcon installieren:
pip install falconSie können dann den Server wie folgt starten:
cd examples
python ./server.pyUnd fragen Sie den Server wie diesen ab:
curl --data-urlencode " text=My sister has a dog. She loves him. " -G localhost:8000Es gibt viele andere Möglichkeiten, wie Sie NeuralCoref verwalten und bereitstellen können. Einige Beispiele finden Sie im Spacy -Universum.
Wenn Sie das Modell abrufen oder in einer anderen Sprache trainieren möchten, finden Sie in unseren Trainingsanweisungen sowie in unserem Blog -Beitrag