NeuralCoref เป็นส่วนขยายไปป์ไลน์สำหรับ Spacy 2.1+ ซึ่งมีคำอธิบายประกอบและแก้ไขกลุ่ม coreFerence โดยใช้เครือข่ายประสาท NeuralCoref พร้อมให้การผลิตรวมอยู่ในท่อ NLP ของ Spacy และขยายไปยังชุดข้อมูลการฝึกอบรมใหม่
สำหรับการแนะนำสั้น ๆ เกี่ยวกับการแก้ไข coreFerence และ NeuralCoref โปรดดูโพสต์บล็อกของเรา NeuralCoref เขียนขึ้นใน Python/Cython และมาพร้อมกับรูปแบบทางสถิติที่ผ่านการฝึกอบรมมาก่อนสำหรับ ภาษาอังกฤษเท่านั้น
NeuralCoref มาพร้อมกับไคลเอนต์การสร้างภาพข้อมูล NeuralCoref-Viz ซึ่งเป็นเว็บอินเตอร์เฟสที่ขับเคลื่อนโดยเซิร์ฟเวอร์ REST ที่สามารถลองออนไลน์ได้ NeuralCoref ได้รับการปล่อยตัวภายใต้ใบอนุญาต MIT
เวอร์ชัน 4.0 ออกตอนนี้! มีอยู่ใน PIP และเข้ากันได้กับ Spacy 2.1+
นี่เป็นวิธีที่ง่ายที่สุดในการติดตั้ง NeuralCoref
pip install neuralcorefspacy.strings.StringStore size changed ข้อผิดพลาด หากคุณมีข้อผิดพลาดที่กล่าวถึง spacy.strings.StringStore size changed, may indicate binary incompatibility เมื่อโหลด Neuralcoref ด้วย import neuralcoref หมายความว่าคุณจะต้องติดตั้ง Neuralcoref จากแหล่งกระจายสินค้าแทนล้อเพื่อให้ได้ NeuralCoref
ในกรณีนี้เพียงแค่ติดตั้ง NeuralCoref อีกครั้งดังนี้:
pip uninstall neuralcoref
pip install neuralcoref --no-binary neuralcorefเพื่อให้สามารถใช้ NeuralCoref คุณจะต้องมีแบบจำลองภาษาอังกฤษสำหรับ Spacy
คุณสามารถใช้โมเดลภาษาอังกฤษที่ใช้งานได้ดีสำหรับแอปพลิเคชันของคุณ แต่โปรดทราบว่าการแสดงของ NeuralCoref นั้นขึ้นอยู่กับการแสดงของโมเดล Spacy และโดยเฉพาะอย่างยิ่งในการแสดงของ Tagger, Parser และส่วนประกอบ NER รูปแบบภาษาอังกฤษ Spacy ที่มีขนาดใหญ่ขึ้นจะปรับปรุงคุณภาพของการแก้ไข coreference เช่นกัน (ดูรายละเอียดบางอย่างในส่วนภายในและส่วนโมเดลด้านล่าง)
นี่คือตัวอย่างของวิธีที่คุณสามารถติดตั้ง Spacy และรูปแบบภาษาอังกฤษ (เล็ก) สำหรับ Spacy ข้อมูลเพิ่มเติมสามารถพบได้ในเว็บไซต์ของ Spacy:
pip install -U spacy
python -m spacy download enคุณยังสามารถติดตั้ง NeuralCoref จากแหล่งที่มา คุณจะต้องติดตั้งการพึ่งพาก่อนซึ่งรวมถึง cython และ spacy
นี่คือกระบวนการ:
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 ทำจากสองโมดูลย่อย:
ครั้งแรกที่คุณนำเข้า NeuralCoref ใน Python มันจะดาวน์โหลดน้ำหนักของโมเดลเครือข่ายประสาทในโฟลเดอร์แคช
โฟลเดอร์แคชถูกตั้งค่าโดยค่าเริ่มต้นเป็น ~/.neuralcoref_cache (ดู file_utils.py) แต่พฤติกรรมนี้สามารถนำไปใช้ได้โดยการตั้งค่าตัวแปรสภาพแวดล้อม NEURALCOREF_CACHE เพื่อชี้ไปที่ตำแหน่งอื่น
โฟลเดอร์แคชสามารถลบได้อย่างปลอดภัยได้ตลอดเวลาและโมดูลจะดาวน์โหลดอีกครั้งรุ่นต่อไปในครั้งต่อไปที่โหลด
คุณสามารถมีข้อมูลเพิ่มเติมเกี่ยวกับตำแหน่งการดาวน์โหลดและการแคชของโมเดลภายในโดยการเปิดใช้งานโมดูล logging ของ Python ก่อนที่จะโหลด NeuralCoref ดังนี้:
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 นี่คือวิธีที่แนะนำในการสร้างอินสแตนซ์ NeuralCoref และเพิ่มลงใน PIPELINE ของ 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_clustersวิธีที่เทียบเท่าในการเพิ่ม Neuralcoref ลงในท่อโมเดล Spacy คือการสร้างอินสแตนซ์คลาส NeuralCoref ก่อนจากนั้นเพิ่มด้วยตนเองลงในท่อของโมเดลภาษา 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 จะแก้ไข coreFerences และใส่คำอธิบายประกอบเป็นแอตทริบิวต์ส่วนขยายใน Spacy Doc , Span และ Token Objects ภายใต้ ._. พจนานุกรม.
นี่คือรายการของคำอธิบายประกอบ:
| คุณลักษณะ | พิมพ์ | คำอธิบาย |
|---|---|---|
doc._.has_coref | บูลีน | มีการแก้ไข coreference ใด ๆ ในเอกสาร |
doc._.coref_clusters | รายการ Cluster | กลุ่มทั้งหมดของ corefering กล่าวถึงในเอกสาร |
doc._.coref_resolved | ยูนิคอด | การแสดง Unicode ของ DOC ที่การกล่าวถึง corefering แต่ละครั้งจะถูกแทนที่ด้วยการกล่าวถึงหลักในคลัสเตอร์ที่เกี่ยวข้อง |
doc._.coref_scores | dict | คะแนนของการแก้ไข coreference ระหว่างการกล่าวถึง |
span._.is_coref | บูลีน | ไม่ว่าจะมีการกล่าวถึงอย่างน้อยหนึ่งครั้ง |
span._.coref_cluster | Cluster | กลุ่มของการกล่าวถึงว่า corefer กับช่วง |
span._.coref_scores | คำสั่ง | คะแนนของความละเอียด coreference ของ & span กับการกล่าวถึงอื่น ๆ (ถ้ามี) |
token._.in_coref | บูลีน | ไม่ว่าจะเป็นโทเค็นอยู่ภายในอย่างน้อยหนึ่งการกล่าวถึง corefering |
token._.coref_clusters | รายการ Cluster | กลุ่มทั้งหมดของ Corefering กล่าวถึงที่มีโทเค็น |
Cluster เป็นคลัสเตอร์ของ coreferring ที่กล่าวถึงซึ่งมี 3 แอตทริบิวต์และวิธีการสองสามวิธีในการทำให้การนำทางภายในคลัสเตอร์ง่ายขึ้น:
| คุณลักษณะหรือวิธีการ | ประเภท / กลับประเภท | คำอธิบาย |
|---|---|---|
i | int | ดัชนีของคลัสเตอร์ในเอกสาร |
main | Span | ช่วงของการกล่าวถึงตัวแทนมากที่สุดในคลัสเตอร์ |
mentions | รายการ Span | รายการของการกล่าวถึงทั้งหมดในคลัสเตอร์ |
__getitem__ | ส่ง Span | เข้าถึงการกล่าวถึงในคลัสเตอร์ |
__iter__ | Span | ย้ำกว่าการกล่าวถึงในคลัสเตอร์ |
__len__ | กลับ int | จำนวนการกล่าวถึงในคลัสเตอร์ |
นอกจากนี้คุณยังสามารถนำทางโซ่คลัสเตอร์ CoreFerence ได้อย่างง่ายดายและแสดงกลุ่มและการกล่าวถึง
นี่คือตัวอย่างบางส่วนลองใช้พวกเขาเพื่อทดสอบด้วยตัวคุณเอง
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 สำคัญ : NeuralCoref กล่าวถึงวัตถุ Spacy Span ซึ่งหมายความว่าคุณสามารถเข้าถึงแอตทริบิวต์ Span ทั่วไปทั้งหมดเช่น span.start (ดัชนีของโทเค็นแรกของช่วงในเอกสาร), span.end (ดัชนีของโทเค็นแรกหลังจากช่วงในเอกสาร) ฯลฯ ...
ตัวอย่าง: doc._.coref_clusters[1].mentions[-1].start จะให้ดัชนีของโทเค็นแรกของการกล่าวถึงครั้งสุดท้ายของคลัสเตอร์ coreference ที่สองในเอกสาร
คุณสามารถผ่านพารามิเตอร์เพิ่มเติมหลายอย่างไปยัง neuralcoref.add_to_pipe หรือ NeuralCoref() เพื่อควบคุมพฤติกรรมของ NeuralCoref
นี่คือรายการทั้งหมดของพารามิเตอร์เหล่านี้และคำอธิบายของพวกเขา:
| พารามิเตอร์ | พิมพ์ | คำอธิบาย |
|---|---|---|
greedyness | ลอย | ตัวเลขระหว่าง 0 ถึง 1 กำหนดว่าแบบจำลองนี้เกี่ยวกับการตัดสินใจ coreference (โลภมากขึ้นหมายถึงลิงก์ coreference มากขึ้น) ค่าเริ่มต้นคือ 0.5 |
max_dist | int | มีกี่คนที่กล่าวถึงย้อนกลับไปดูเมื่อพิจารณาถึงสิ่งที่เป็นไปได้ของการกล่าวถึงในปัจจุบัน การลดค่าจะทำให้ระบบทำงานได้เร็วขึ้น แต่แม่นยำน้อยลง ค่าเริ่มต้นคือ 50 |
max_dist_match | int | ระบบจะพิจารณาเชื่อมโยงการกล่าวถึงปัจจุบันกับหนึ่งก่อนหน้านี้มากกว่า max_dist ออกไปหากพวกเขาแบ่งปันคำนามหรือคำนามที่เหมาะสม ในกรณีนี้มันจะดู max_dist_match ออกไปแทน ค่าเริ่มต้นคือ 500 |
blacklist | บูลีน | ระบบควรแก้ไข coreFerences สำหรับคำสรรพนามในรายการต่อไปนี้: ["i", "me", "my", "you", "your"] ค่าเริ่มต้นเป็นจริง (แก้ไข coreFerence) |
store_scores | บูลีน | หากระบบเก็บคะแนนสำหรับ coreferences ในคำอธิบายประกอบ ค่าเริ่มต้นเป็นจริง |
conv_dict | dict (str, list (str)) | พจนานุกรมการแปลงที่คุณสามารถใช้เพื่อแทนที่การฝัง คำที่หายาก (ปุ่ม) โดยค่าเฉลี่ยของการฝังของรายการ คำทั่วไป (ค่า) ตัวอย่าง: conv_dict={"Angela": ["woman", "girl"]} จะช่วยแก้ไข coreferences สำหรับ Angela โดยใช้ embeddings สำหรับ woman และ girl ทั่วไปแทนที่จะฝัง Angela ในปัจจุบันนี้ใช้ได้เฉพาะกับคำเดียว (ไม่ใช่สำหรับกลุ่มคำ) |
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' ) นี่คือตัวอย่างเกี่ยวกับวิธีที่เราสามารถใช้พารามิเตอร์ conv_dict เพื่อช่วยแก้ไข coreferences ของคำที่หายากเช่นชื่อ:
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! ตัวอย่างง่ายๆของสคริปต์เซิร์ฟเวอร์สำหรับการรวม NeuralCoref ใน REST API นั้นเป็นตัวอย่างใน examples/server.py
ในการใช้งานคุณต้องติดตั้ง Falcon ก่อน:
pip install falconจากนั้นคุณสามารถเริ่มเซิร์ฟเวอร์ดังนี้:
cd examples
python ./server.pyและสอบถามเซิร์ฟเวอร์เช่นนี้:
curl --data-urlencode " text=My sister has a dog. She loves him. " -G localhost:8000มีวิธีอื่น ๆ อีกมากมายที่คุณสามารถจัดการและปรับใช้ NeuralCoref ตัวอย่างบางส่วนสามารถพบได้ในจักรวาล Spacy
หากคุณต้องการฝึกอบรมแบบจำลองหรือฝึกอบรมเป็นภาษาอื่นดูคำแนะนำการฝึกอบรมของเรารวมถึงโพสต์บล็อกของเรา