NeuralCoref adalah ekstensi pipa untuk Spacy 2.1+ yang membuat anotasi dan menyelesaikan kelompok coreference menggunakan jaringan saraf. NeuralCoref siap-produksi, terintegrasi dalam pipa NLP Spacy dan dapat diperluas ke set data pelatihan baru.
Untuk pengantar singkat tentang Resolusi Coreference dan NeuralCoref, silakan merujuk ke posting blog kami. NeuralCoref ditulis dalam Python/Cython dan dilengkapi dengan model statistik pra-terlatih untuk bahasa Inggris saja .
NeuralCoref disertai dengan klien visualisasi NeuralCoref-Viz, antarmuka web yang ditenagai oleh server REST yang dapat dicoba secara online. NeuralCoref dirilis di bawah lisensi MIT.
Versi 4.0 keluar sekarang! Tersedia di PIP dan kompatibel dengan Spacy 2.1+.
Ini adalah cara termudah untuk menginstal NeuralCoref.
pip install neuralcorefspacy.strings.StringStore size changed kesalahan Jika Anda memiliki kesalahan yang menyebutkan spacy.strings.StringStore size changed, may indicate binary incompatibility saat memuat NeuralCoref dengan import neuralcoref , itu berarti Anda harus menginstal NeuralCoref dari sumber distribusi alih -alih roda untuk mendapatkan NeuralCoref untuk dibangun dengan versi spacy versi terbaru untuk sistem Anda.
Dalam hal ini, cukup instal ulang NeuralCoref sebagai berikut:
pip uninstall neuralcoref
pip install neuralcoref --no-binary neuralcorefUntuk dapat menggunakan NeuralCoref, Anda juga perlu memiliki model bahasa Inggris untuk Spacy.
Anda dapat menggunakan model bahasa Inggris apa pun yang berfungsi dengan baik untuk aplikasi Anda, tetapi perhatikan bahwa kinerja NeuralCoref sangat tergantung pada kinerja model Spacy dan khususnya pada kinerja komponen tagger, parser, dan ner model Spacy Model. Model bahasa Inggris spacy yang lebih besar juga akan meningkatkan kualitas resolusi coreference (lihat beberapa detail di bagian internal dan model di bawah).
Berikut adalah contoh bagaimana Anda dapat menginstal Spacy dan model bahasa Inggris (kecil) untuk Spacy, informasi lebih lanjut dapat ditemukan di situs web Spacy:
pip install -U spacy
python -m spacy download enAnda juga dapat menginstal NeuralCoref dari sumber. Anda perlu menginstal dependensi terlebih dahulu yang mencakup Cython dan Spacy.
Inilah prosesnya:
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 terbuat dari dua sub-modul:
Pertama kali Anda mengimpor NeuralCoref di Python, itu akan mengunduh bobot model jaringan saraf di folder cache.
Folder cache diatur secara default ke ~/.neuralcoref_cache (lihat file_utils.py) tetapi perilaku ini dapat diatasi dengan mengatur variabel lingkungan NEURALCOREF_CACHE untuk menunjuk ke lokasi lain.
Folder cache dapat dihapus dengan aman kapan saja dan modul akan mengunduh lagi model saat berikutnya dimuat.
Anda dapat memiliki informasi lebih lanjut tentang lokasi, pengunduhan dan proses caching dari model internal dengan mengaktifkan modul logging Python sebelum memuat NeuralCoref sebagai berikut:
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 Berikut adalah cara yang disarankan untuk membuat instantiate NeuralCoref dan menambahkannya ke pipa anotasi 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_clustersCara yang setara untuk menambahkan NeuralCoref ke pipa model spacy adalah dengan instantiate kelas NeuralCoref terlebih dahulu dan kemudian menambahkannya secara manual ke pipa model bahasa Spacy.
# 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 akan menyelesaikan coreferences dan memberi anotasi sebagai atribut ekstensi dalam Doc spacy, Span dan objek Token di bawah ._. kamus.
Berikut adalah daftar anotasi:
| Atribut | Jenis | Keterangan |
|---|---|---|
doc._.has_coref | Boolean | Apakah ada coreference telah diselesaikan di DOC |
doc._.coref_clusters | Daftar Cluster | Semua kelompok corefering menyebutkan dalam dokumen |
doc._.coref_resolved | Unicode | Representasi unicode dari DOC di mana setiap penyebutan corefering digantikan oleh penyebutan utama dalam cluster terkait. |
doc._.coref_scores | Dikt Dikt | Skor resolusi coreference antara menyebutkan. |
span._.is_coref | Boolean | Apakah rentang itu memiliki setidaknya satu penyebutan corefering |
span._.coref_cluster | Cluster | Kelompok menyebutkan bahwa corefer dengan rentang |
span._.coref_scores | Dikt | Skor resolusi coreference & span dengan menyebutkan lain (jika berlaku). |
token._.in_coref | Boolean | Apakah token berada di dalam setidaknya satu menyebutkan |
token._.coref_clusters | Daftar Cluster | Semua kelompok Corefering menyebutkan yang berisi token |
Cluster adalah gugus yang disebutkan Coreferring yang memiliki 3 atribut dan beberapa metode untuk menyederhanakan navigasi di dalam sebuah cluster:
| Atribut atau metode | Jenis / Jenis Pengembalian | Keterangan |
|---|---|---|
i | int | Indeks cluster di dokumen |
main | Span | Rentang penyebutan yang paling representatif di cluster |
mentions | daftar Span | Daftar semua sebutan di cluster |
__getitem__ | Span pengembalian | Mengakses penyebutan di cluster |
__iter__ | menghasilkan Span | Iterasi lebih dari itu |
__len__ | return int | Jumlah sebutan di cluster |
Anda juga dapat dengan mudah menavigasi rantai cluster coreference dan menampilkan kelompok dan menyebutkan.
Berikut adalah beberapa contoh, cobalah untuk mengujinya sendiri.
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 Penting : NeuralCoref menyebutkan adalah objek spacy spacy yang berarti Anda dapat mengakses semua atribut rentang biasa seperti span.start (indeks token pertama rentang dalam dokumen), span.end (indeks token pertama setelah rentang dalam dokumen), dll ...
Mis: doc._.coref_clusters[1].mentions[-1].start akan memberi Anda indeks token pertama dari penyebutan terakhir dari cluster coreference kedua dalam dokumen.
Anda dapat meneruskan beberapa parameter tambahan ke neuralcoref.add_to_pipe atau NeuralCoref() untuk mengontrol perilaku NeuralCoref.
Berikut adalah daftar lengkap parameter ini dan deskripsi mereka:
| Parameter | Jenis | Keterangan |
|---|---|---|
greedyness | mengambang | Angka antara 0 dan 1 menentukan seberapa serakah model tentang membuat keputusan coreference (lebih serakah berarti lebih banyak tautan coreference). Nilai defaultnya adalah 0,5. |
max_dist | int | Berapa banyak yang menyebutkan kembali untuk melihat ketika mempertimbangkan kemungkinan anteseden dari penyebutan saat ini. Mengurangi nilainya akan menyebabkan sistem berjalan lebih cepat tetapi kurang akurat. Nilai defaultnya adalah 50. |
max_dist_match | int | Sistem akan mempertimbangkan untuk menghubungkan penyebutan saat ini ke yang sebelumnya lebih jauh dari max_dist jika mereka berbagi kata benda atau kata benda yang tepat. Dalam hal ini, itu terlihat max_dist_match pergi sebagai gantinya. Nilai default adalah 500. |
blacklist | Boolean | Jika sistem menyelesaikan coreferences untuk kata ganti dalam daftar berikut: ["i", "me", "my", "you", "your"] . Nilai default benar (Coreference diselesaikan). |
store_scores | Boolean | Jika sistem menyimpan skor untuk coreferences dalam anotasi. Nilai standarnya benar. |
conv_dict | Dict (str, list (str)) | Kamus konversi yang dapat Anda gunakan untuk mengganti embeddings dari kata -kata langka (kunci) dengan rata -rata embeddings dari daftar kata -kata umum (nilai). Ex: conv_dict={"Angela": ["woman", "girl"]} akan membantu menyelesaikan coreferences untuk Angela dengan menggunakan embeddings untuk woman dan girl yang lebih umum alih -alih menanamkan Angela . Ini saat ini hanya berfungsi untuk kata tunggal (bukan untuk kelompok kata). |
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' ) Berikut adalah contoh tentang bagaimana kita dapat menggunakan parameter conv_dict untuk membantu menyelesaikan coreferences dari kata langka seperti nama:
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! Contoh sederhana skrip server untuk mengintegrasikan NeuralCoref dalam API REST disediakan sebagai contoh dalam examples/server.py .
Untuk menggunakannya, Anda perlu menginstal Falcon terlebih dahulu:
pip install falconAnda kemudian dapat memulai server sebagai berikut:
cd examples
python ./server.pyDan meminta server seperti ini:
curl --data-urlencode " text=My sister has a dog. She loves him. " -G localhost:8000Ada banyak cara lain yang dapat Anda kelola dan menggunakan NeuralCoref. Beberapa contoh dapat ditemukan di Semesta Spacy.
Jika Anda ingin melatih kembali model atau melatihnya pada bahasa lain, lihat instruksi pelatihan kami serta posting blog kami