Spaczz menyediakan pencocokan fuzzy dan fungsi pencocokan regex tambahan untuk spacy. Komponen Spaczz memiliki API yang sama dengan rekan spacy dan komponen pipa spaczz dapat berintegrasi ke dalam pipa spacy di mana mereka dapat disimpan/dimuat sebagai model.
Pencocokan fuzzy saat ini dilakukan dengan pencocokan dari modul fuzz Rapidfuzz dan pencocokan regex saat ini bergantung pada perpustakaan Regex. Spaczz tentu saja mengambil pengaruh tambahan dari perpustakaan dan sumber daya lain. Untuk detail tambahan, lihat bagian Referensi.
Mendukung Spacy> = 3.0
Spaczz telah diuji di Ubuntu, MacOS, dan Windows Server.
V0.6.0 Catatan Rilis:
python<=3.11,>=3.7 , bersama dengan rapidfuzz>=1.0.0 .SpaczzRuler "spaczz_" praprended. Juga, maaf melakukan ini tanpa siklus penghentian.Matcher.pipe , yang sudah usang, sekarang dihapus.spaczz_span , yang sudah usang, sekarang dihapus.Silakan lihat changelog untuk catatan rilis sebelumnya. Ini pada akhirnya akan dipindahkan ke halaman baca dokumen.
Spaczz dapat diinstal menggunakan PIP.
pip install spaczz Fitur utama Spaczz adalah FuzzyMatcher , RegexMatcher , dan TokenMatcher "fuzzy" yang berfungsi mirip dengan Matcher dan PhraseMatcher Spacy, dan SpaczzRuler yang mengintegrasikan pencocokan spaczz ke dalam komponen pipa spacy yang mirip dengan EntityRuler spacy.
Penggunaan dasar pencocokan fuzzy mirip dengan PhraseMatcher Spacy kecuali mengembalikan rasio fuzzy dan pola yang cocok, bersama dengan informasi ID, start dan akhir, jadi pastikan untuk memasukkan variabel untuk rasio dan pola saat membongkar hasil.
import spacy
from spaczz . matcher import FuzzyMatcher
nlp = spacy . blank ( "en" )
text = """Grint M Anderson created spaczz in his home at 555 Fake St,
Apt 5 in Nashv1le, TN 55555-1234 in the US.""" # Spelling errors intentional.
doc = nlp ( text )
matcher = FuzzyMatcher ( nlp . vocab )
matcher . add ( "NAME" , [ nlp ( "Grant Andersen" )])
matcher . add ( "GPE" , [ nlp ( "Nashville" )])
matches = matcher ( doc )
for match_id , start , end , ratio , pattern in matches :
print ( match_id , doc [ start : end ], ratio , pattern ) NAME Grint M Anderson 80 Grant Andersen
GPE Nashv1le 82 Nashville
Tidak seperti pencocokan spacy, pencocokan spaczz ditulis dalam ular python murni. Meskipun mereka diharuskan memiliki vocab spacy yang diteruskan kepada mereka selama inisialisasi, ini murni untuk konsistensi karena pencocokan spaczz tidak menggunakan saat ini menggunakan spacy vocab. Inilah sebabnya mengapa match_id di atas hanyalah string, bukan nilai integer seperti dalam pencocokan spacy.
Pencocokan spaczz juga dapat menggunakan aturan on-match melalui fungsi panggilan balik. Panggilan balik di pertandingan ini perlu menerima pencocokan itu sendiri, dokumen yang dipanggil oleh The Matcher, indeks pertandingan dan pertandingan yang diproduksi oleh pencocokan.
import spacy
from spacy . tokens import Span
from spaczz . matcher import FuzzyMatcher
nlp = spacy . blank ( "en" )
text = """Grint M Anderson created spaczz in his home at 555 Fake St,
Apt 5 in Nashv1le, TN 55555-1234 in the US.""" # Spelling errors intentional.
doc = nlp ( text )
def add_name_ent ( matcher , doc , i , matches ):
"""Callback on match function. Adds "NAME" entities to doc."""
# Get the current match and create tuple of entity label, start and end.
# Append entity to the doc's entity. (Don't overwrite doc.ents!)
_match_id , start , end , _ratio , _pattern = matches [ i ]
entity = Span ( doc , start , end , label = "NAME" )
doc . ents += ( entity ,)
matcher = FuzzyMatcher ( nlp . vocab )
matcher . add ( "NAME" , [ nlp ( "Grant Andersen" )], on_match = add_name_ent )
matches = matcher ( doc )
for ent in doc . ents :
print (( ent . text , ent . start , ent . end , ent . label_ )) ('Grint M Anderson', 0, 3, 'NAME')
Seperti EntityRuler Spacy, logika pembaruan entitas yang sangat mirip telah diimplementasikan di SpaczzRuler . SpaczzRuler juga menangani penanganan yang tumpang tindih. Itu dibahas di bagian selanjutnya.
Tidak seperti pencocokan Spacy, aturan yang ditambahkan ke pencocokan spaczz memiliki argumen kata kunci opsional yang dapat memodifikasi perilaku pencocokan. Ambil contoh pencocokan fuzzy di bawah ini:
import spacy
from spaczz . matcher import FuzzyMatcher
nlp = spacy . blank ( "en" )
# Let's modify the order of the name in the text.
text = """Anderson, Grint created spaczz in his home at 555 Fake St,
Apt 5 in Nashv1le, TN 55555-1234 in the US.""" # Spelling errors intentional.
doc = nlp ( text )
matcher = FuzzyMatcher ( nlp . vocab )
matcher . add ( "NAME" , [ nlp ( "Grant Andersen" )])
matches = matcher ( doc )
# The default fuzzy matching settings will not find a match.
for match_id , start , end , ratio , pattern in matches :
print ( match_id , doc [ start : end ], ratio , pattern )Selanjutnya kita mengubah perilaku pencocokan fuzzy untuk pola dalam aturan "nama".
import spacy
from spaczz . matcher import FuzzyMatcher
nlp = spacy . blank ( "en" )
# Let's modify the order of the name in the text.
text = """Anderson, Grint created spaczz in his home at 555 Fake St,
Apt 5 in Nashv1le, TN 55555-1234 in the US.""" # Spelling errors intentional.
doc = nlp ( text )
matcher = FuzzyMatcher ( nlp . vocab )
matcher . add ( "NAME" , [ nlp ( "Grant Andersen" )], kwargs = [{ "fuzzy_func" : "token_sort" }])
matches = matcher ( doc )
# The default fuzzy matching settings will not find a match.
for match_id , start , end , ratio , pattern in matches :
print ( match_id , doc [ start : end ], ratio , pattern ) NAME Anderson, Grint 83 Grant Andersen
Daftar lengkap argumen kata kunci yang tersedia untuk pengaturan pencocokan fuzzy termasuk:
ignore_case (BOOL): Apakah akan teks berkasitas rendah sebelum dicocokkan. Default itu True .min_r (int): Rasio kecocokan minimum diperlukan.thresh (int): Jika rasio ini terlampaui dalam pemindaian awal, dan flex > 0 , tidak ada optimasi yang akan dicoba. Jika flex == 0 , thresh tidak berpengaruh. Default adalah 100 .fuzzy_func (str): Nama kunci fungsi pencocokan fuzzy untuk digunakan. Semua fungsi pencocokan RapidFuzz dengan pengaturan default tersedia. Fungsi pencocokan fuzzy tambahan dapat didaftarkan oleh pengguna. Default adalah "simple" :"simple" = ratio"partial" = partial_ratio"token" = token_ratio"token_set" = token_set_ratio"token_sort" = token_sort_ratio"partial_token" = partial_token_ratio"partial_token_set" = partial_token_set_ratio"partial_token_sort" = partial_token_sort_ratio"weighted" = WRatio"quick" = QRatio"partial_alignment" = partial_ratio_alignment (membutuhkan rapidfuzz>=2.0.3 )flex (int | literal ['default', 'min', 'max']): Jumlah token untuk memindahkan batas pertandingan kiri dan kanan selama optimasi. Dapat berupa int dengan max len(pattern) dan min 0 , (akan memperingatkan dan berubah jika lebih tinggi atau lebih rendah). "max" , "min" , atau "default" juga valid. Default adalah "default" : len(pattern) // 2 .min_r1 (int | tidak ada): Kontrol granular opsional atas rasio pertandingan minimum yang diperlukan untuk seleksi selama pemindaian awal. Jika flex == 0 , min_r1 akan ditimpa oleh min_r2 . Jika flex > 0 , min_r1 harus lebih rendah dari min_r2 dan "rendah" secara umum karena batas kecocokan pada awalnya tidak tertekuk. Default None , yang akan mengakibatkan min_r1 diatur ke round(min_r / 1.5) . Penggunaan dasar pencocokan Regex juga cukup mirip dengan PhraseMatcher Spacy. Ia menerima pola regex sebagai string sehingga bendera harus sejalan. Regex disusun dengan paket regex sehingga perkiraan pencocokan "fuzzy" didukung. Untuk memberikan akses ke hasil kecocokan "fuzzy" ini, pencocokan mengembalikan rasio fuzzy yang dihitung dan pola yang cocok, bersama dengan ID Match, informasi mulai dan akhir, jadi pastikan untuk memasukkan variabel untuk rasio dan pola saat membongkar hasil.
import spacy
from spaczz . matcher import RegexMatcher
nlp = spacy . blank ( "en" )
text = """Anderson, Grint created spaczz in his home at 555 Fake St,
Apt 5 in Nashv1le, TN 55555-1234 in the US.""" # Spelling errors intentional.
doc = nlp ( text )
matcher = RegexMatcher ( nlp . vocab )
# Use inline flags for regex strings as needed
matcher . add (
"ZIP" ,
[ r"bd{5}(?:[-s]d{4})?b" ],
)
matcher . add ( "GPE" , [ r"(usa){d<=1}" ]) # Fuzzy regex.
matches = matcher ( doc )
for match_id , start , end , ratio , pattern in matches :
print ( match_id , doc [ start : end ], ratio , pattern ) ZIP 55555-1234 100 bd{5}(?:[-s]d{4})?b
GPE US 80 (usa){d<=1}
Pencocokan spaczz juga dapat menggunakan aturan on-match melalui fungsi panggilan balik. Panggilan balik di pertandingan ini perlu menerima pencocokan itu sendiri, dokumen yang dipanggil oleh The Matcher, indeks pertandingan dan pertandingan yang diproduksi oleh pencocokan. Lihat contoh penggunaan pencocokan fuzzy di atas untuk detailnya.
Seperti pencocokan fuzzy, pencocokan regex memiliki argumen kata kunci opsional yang dapat memodifikasi perilaku pencocokan. Ambil contoh pencocokan regex di bawah ini.
import spacy
from spaczz . matcher import RegexMatcher
nlp = spacy . blank ( "en" )
text = """Anderson, Grint created spaczz in his home at 555 Fake St,
Apt 5 in Nashv1le, TN 55555-1234 in the USA.""" # Spelling errors intentional. Notice 'USA' here.
doc = nlp ( text )
matcher = RegexMatcher ( nlp . vocab )
# Use inline flags for regex strings as needed
matcher . add (
"STREET" , [ "street_addresses" ], kwargs = [{ "predef" : True }]
) # Use predefined regex by key name.
# Below will not expand partial matches to span boundaries.
matcher . add ( "GPE" , [ r"(?i)[U](nited|.?) ?[S](tates|.?)" ], kwargs = [{ "partial" : False }])
matches = matcher ( doc )
for match_id , start , end , ratio , pattern in matches :
print (
match_id , doc [ start : end ], ratio , pattern
) # comma in result isn't ideal - see "Roadmap" STREET 555 Fake St, 100 street_addresses
Daftar lengkap argumen kata kunci yang tersedia untuk pengaturan pencocokan regex termasuk:
ignore_case (BOOL): Apakah akan teks berkasitas rendah sebelum dicocokkan. Default itu True .min_r (int): Rasio kecocokan minimum diperlukan.fuzzy_weights (str): Nama metode pembobotan untuk penyisipan regex, penghapusan, dan jumlah pengganti. Metode pembobotan tambahan dapat didaftarkan oleh pengguna. Default adalah "indel" ."indel" = (1, 1, 2)"lev" = (1, 1, 1)partial : (bool): Apakah kecocokan parsial harus diperluas ke Token atau batas Span di doc atau tidak. Misalnya, regex hanya cocok dengan bagian dari Token atau Span di doc . Default itu True .predef (string): Apakah string regex harus ditafsirkan sebagai kunci untuk pola regex yang telah ditentukan atau tidak. Pola Regex tambahan yang telah ditentukan dapat didaftarkan oleh pengguna. Default False."dates""times""phones""phones_with_exts""links""emails""ips""ipv6s""prices""hex_colors""credit_cards""btc_addresses""street_addresses""zip_codes""po_boxes""ssn_numbers" Penggunaan dasar pencocokan kesamaan mirip dengan PhraseMatcher Spacy kecuali mengembalikan rasio kesamaan vektor dan pola yang cocok, bersama dengan ID Match, informasi mulai dan akhir, jadi pastikan untuk memasukkan variabel untuk rasio dan pola saat membongkar hasil.
Untuk menghasilkan hasil yang bermakna dari pencocokan kesamaan, model spacy dengan vektor kata (model bahasa Inggris medium atau besar) harus digunakan untuk menginisialisasi pencocokan, memproses dokumen target, dan memproses pola apa pun yang ditambahkan.
import spacy
from spaczz . matcher import SimilarityMatcher
nlp = spacy . load ( "en_core_web_md" )
text = "I like apples, grapes and bananas."
doc = nlp ( text )
# lowering min_r2 from default of 75 to produce matches in this example
matcher = SimilarityMatcher ( nlp . vocab , min_r2 = 65 )
matcher . add ( "FRUIT" , [ nlp ( "fruit" )])
matches = matcher ( doc )
for match_id , start , end , ratio , pattern in matches :
print ( match_id , doc [ start : end ], ratio , pattern ) FRUIT apples 70 fruit
FRUIT grapes 73 fruit
FRUIT bananas 70 fruit
Harap dicatat bahwa bahkan untuk spaczz yang sebagian besar murni-python, proses ini saat ini sangat lambat jadi waspada terhadap ruang lingkup di mana ia diterapkan. Mengaktifkan dukungan GPU dalam Spacy (lihat di sini) harus meningkatkan kecepatan, tetapi saya percaya prosesnya masih akan dikeluarkan dalam algoritma pencarian murni-python sampai saya mengembangkan algoritma pencarian yang lebih baik dan/atau menjatuhkan pencarian ke kode tingkat bawah (EX C).
Juga sebagai fitur yang agak eksperimental, pencocokan kesamaan saat ini tidak menjadi bagian dari SpaczzRuler juga tidak memiliki penguasa yang terpisah. Jika Anda perlu menambahkan kecocokan kesamaan ke entitas Doc , Anda perlu menggunakan panggilan balik di pertandingan untuk saat ini. Silakan lihat contoh callback callback pencocokan fuzzy di atas untuk ide. Jika ada cukup minat dalam mengintegrasikan/menciptakan penggaris untuk pencocokan kesamaan ini dapat dilakukan.
Daftar lengkap argumen kata kunci yang tersedia untuk pengaturan pencocokan kesamaan meliputi:
ignore_case (BOOL): Apakah akan teks kasus rendah sebelum pencocokan fuzzy. Default itu True .min_r (int): Rasio kecocokan minimum diperlukan.thresh (int): Jika rasio ini terlampaui dalam pemindaian awal, dan flex > 0 , tidak ada optimasi yang akan dicoba. Jika flex == 0 , thresh tidak berpengaruh. Default adalah 100 .flex (int | literal ['default', 'min', 'max']): Jumlah token untuk memindahkan batas pertandingan kiri dan kanan selama optimasi. Dapat berupa int dengan max len(pattern) dan min 0 , (akan memperingatkan dan berubah jika lebih tinggi atau lebih rendah). "max" , "min" , atau "default" juga valid. Default adalah "default" : len(pattern) // 2 .min_r1 (int | tidak ada): Kontrol granular opsional atas rasio pertandingan minimum yang diperlukan untuk seleksi selama pemindaian awal. Jika flex == 0 , min_r1 akan ditimpa oleh min_r2 . Jika flex > 0 , min_r1 harus lebih rendah dari min_r2 dan "rendah" secara umum karena batas kecocokan pada awalnya tidak tertekuk. Default None , yang akan mengakibatkan min_r1 diatur ke round(min_r / 1.5) .min_r2 (int | tidak ada): Kontrol granular opsional atas rasio pertandingan minimum yang diperlukan untuk seleksi selama optimasi pertandingan. Perlu lebih tinggi dari min_r1 dan "tinggi" secara umum untuk memastikan hanya kecocokan kualitas yang dikembalikan. Default None , yang akan mengakibatkan min_r2 diatur ke min_r . Catatan: Matcher Spacy sekarang mendukung pencocokan fuzzy, jadi kecuali Anda memerlukan fitur tertentu dari TokenMatcher Spaczz, sangat disarankan untuk menggunakan Matcher Spacy yang jauh lebih cepat.
Penggunaan dasar pencocokan token mirip dengan Matcher Spacy. Ia menerima pola berlabel dalam bentuk daftar kamus di mana setiap daftar menjelaskan pola individual dan setiap kamus menggambarkan token individu.
Pencocokan token menerima semua atribut token yang sama dan sintaks pola seperti rekan spacy tetapi menambahkan dukungan fuzzy dan fuzzy-regex.
"FUZZY" dan "FREGEX" adalah dua opsi pola token spacy tambahan.
Misalnya:
[
{ "TEXT" : { "FREGEX" : "(database){e<=1}" }},
{ "LOWER" : { "FUZZY" : "access" , "MIN_R" : 85 , "FUZZY_FUNC" : "quick_lev" }},
]Pastikan untuk menggunakan kunci kamus huruf besar dalam pola.
Daftar lengkap argumen kata kunci yang tersedia untuk pengaturan pencocokan token meliputi:
ignore_case (BOOL): Apakah akan teks berkasitas rendah sebelum dicocokkan. Hanya dapat diatur pada tingkat pola. Untuk pola "fuzzy" dan "Fregex". Default itu True .min_r (int): Rasio kecocokan minimum diperlukan. Untuk pola "fuzzy" dan "Fregex".fuzzy_func (str): Nama kunci fungsi pencocokan fuzzy untuk digunakan. Hanya dapat diatur pada tingkat pola. Hanya untuk pola "fuzzy". Semua fungsi pencocokan RapidFuzz dengan pengaturan default tersedia, namun setiap fungsi berbasis token tidak memberikan utilitas di tingkat token individu. Fungsi pencocokan fuzzy tambahan dapat didaftarkan oleh pengguna. Termasuk, dan berguna, fungsi (defaultnya simple ):"simple" = ratio"partial" = partial_ratio"quick" = QRatio"partial_alignment" = partial_ratio_alignment (membutuhkan rapidfuzz>=2.0.3 )fuzzy_weights (str): Nama metode pembobotan untuk penyisipan regex, penghapusan, dan jumlah pengganti. Metode pembobotan tambahan dapat didaftarkan oleh pengguna. Default adalah "indel" ."indel" = (1, 1, 2)"lev" = (1, 1, 1)predef : Apakah Regex harus ditafsirkan sebagai kunci untuk pola regex yang telah ditentukan atau tidak. Hanya dapat diatur pada tingkat pola. Hanya untuk pola "Fregex". Default False . import spacy
from spaczz . matcher import TokenMatcher
# Using model results like POS tagging in token patterns requires model that provides these.
nlp = spacy . load ( "en_core_web_md" )
text = """The manager gave me SQL databesE acess so now I can acces the Sequal DB.
My manager's name is Grfield"""
doc = nlp ( text )
matcher = TokenMatcher ( vocab = nlp . vocab )
matcher . add (
"DATA" ,
[
[
{ "TEXT" : "SQL" },
{ "LOWER" : { "FREGEX" : "(database){s<=1}" }},
{ "LOWER" : { "FUZZY" : "access" }},
],
[{ "TEXT" : { "FUZZY" : "Sequel" }, "POS" : "PROPN" }, { "LOWER" : "db" }],
],
)
matcher . add ( "NAME" , [[{ "TEXT" : { "FUZZY" : "Garfield" }}]])
matches = matcher ( doc )
for match_id , start , end , ratio , pattern in matches :
print ( match_id , doc [ start : end ], ratio , pattern ) DATA SQL databesE acess 91 [{"TEXT":"SQL"},{"LOWER":{"FREGEX":"(database){s<=1}"}},{"LOWER":{"FUZZY":"access"}}]
DATA Sequal DB 87 [{"TEXT":{"FUZZY":"Sequel"},"POS":"PROPN"},{"LOWER":"db"}]
NAME Grfield 93 [{"TEXT":{"FUZZY":"Garfield"}}]
Meskipun pencocokan token dapat menjadi pengganti drop -in untuk Matcher Spacy, masih disarankan untuk menggunakan Matcher Spacy jika Anda tidak memerlukan kemampuan fuzzy matcher token spaczz - itu akan memperlambat pengolahan yang tidak perlu.
Pengingat: Matcher Spacy sekarang mendukung pencocokan fuzzy, jadi kecuali Anda memerlukan fitur tertentu dari TokenMatcher Spaczz, sangat disarankan untuk menggunakan Matcher Spacy yang jauh lebih cepat.
Penguasa Spaczz menggabungkan pencocokan frase fuzzy dan regex, dan pencocokan token "fuzzy", menjadi satu komponen pipa yang dapat memperbarui Doc.ents yang mirip dengan EntityRuler Spacy.
Pola harus ditambahkan sebagai iterable dari kamus dalam format {label (str), pola (str atau daftar), type (str), opsional kwargs (dikt), dan id opsional (str)} .
Misalnya, pola frasa fuzzy:
{'label': 'ORG', 'pattern': 'Apple' 'kwargs': {'min_r2': 90}, 'type': 'fuzzy'}
Atau, pola token:
{'label': 'ORG', 'pattern': [{'TEXT': {'FUZZY': 'Apple'}}], 'type': 'token'}
import spacy
from spaczz . pipeline import SpaczzRuler
nlp = spacy . blank ( "en" )
text = """Anderson, Grint created spaczz in his home at 555 Fake St,
Apt 5 in Nashv1le, TN 55555-1234 in the USA.
Some of his favorite bands are Converg and Protet the Zero.""" # Spelling errors intentional.
doc = nlp ( text )
patterns = [
{
"label" : "NAME" ,
"pattern" : "Grant Andersen" ,
"type" : "fuzzy" ,
"kwargs" : { "fuzzy_func" : "token_sort" },
},
{
"label" : "STREET" ,
"pattern" : "street_addresses" ,
"type" : "regex" ,
"kwargs" : { "predef" : True },
},
{ "label" : "GPE" , "pattern" : "Nashville" , "type" : "fuzzy" },
{
"label" : "ZIP" ,
"pattern" : r"b(?:55554){s<=1}(?:(?:[-s])?d{4}b)" ,
"type" : "regex" ,
}, # fuzzy regex
{ "label" : "GPE" , "pattern" : "(?i)[U](nited|.?) ?[S](tates|.?)" , "type" : "regex" },
{
"label" : "BAND" ,
"pattern" : [{ "LOWER" : { "FREGEX" : "(converge){e<=1}" }}],
"type" : "token" ,
},
{
"label" : "BAND" ,
"pattern" : [
{ "TEXT" : { "FUZZY" : "Protest" }},
{ "IS_STOP" : True },
{ "TEXT" : { "FUZZY" : "Hero" }},
],
"type" : "token" ,
},
]
ruler = SpaczzRuler ( nlp )
ruler . add_patterns ( patterns )
doc = ruler ( doc )
for ent in doc . ents :
print (
(
ent . text ,
ent . start ,
ent . end ,
ent . label_ ,
ent . _ . spaczz_ratio ,
ent . _ . spaczz_type ,
ent . _ . spaczz_pattern ,
)
) ('Anderson, Grint', 0, 3, 'NAME', 83, 'fuzzy', 'Grant Andersen')
('555 Fake St,', 9, 13, 'STREET', 100, 'regex', 'street_addresses')
('Nashv1le', 17, 18, 'GPE', 82, 'fuzzy', 'Nashville')
('55555-1234', 20, 23, 'ZIP', 90, 'regex', '\b(?:55554){s<=1}(?:(?:[-\s])?\d{4}\b)')
('USA', 25, 26, 'GPE', 100, 'regex', '(?i)[U](nited|\.?) ?[S](tates|\.?)')
('Converg', 34, 35, 'BAND', 93, 'token', '[{"LOWER":{"FREGEX":"(converge){e<=1}"}}]')
('Protet the Zero', 36, 39, 'BAND', 89, 'token', '[{"TEXT":{"FUZZY":"Protest"}},{"IS_STOP":true},{"TEXT":{"FUZZY":"Hero"}}]')
Kami melihat dalam contoh di atas bahwa kami merujuk beberapa atribut khusus, yang dijelaskan di bawah ini.
Untuk lebih banyak contoh SpaczzRuler , lihat di sini. Secara khusus ini memberikan perincian tentang proses penyortiran penguasa dan parameter pencocokan fuzzy.
Spaczz menginisialisasi beberapa atribut khusus setelah diimpor. Ini di bawah Spacy's ._. atribut dan lebih lanjut disiapkan dengan spaczz_ sehingga tidak ada konflik dengan atribut khusus Anda sendiri. Jika ada ruang angkasa akan memaksa menimpa mereka.
Atribut khusus ini hanya diatur melalui penguasa Spaczz di tingkat token. Versi rentang dan dokumen dari atribut -atribut ini adalah pengambil yang merujuk atribut tingkat token.
Atribut Token berikut tersedia. Semua bisa berubah:
spaczz_token : default = False . Boolean yang menunjukkan jika token adalah bagian dari entitas yang ditetapkan oleh penguasa Spaczz.spaczz_type : default = None . String yang menunjukkan pencocokan mana yang menghasilkan entitas menggunakan token.spaczz_ratio : default = None . Jika token adalah bagian dari entitas yang cocok, ia akan mengembalikan rasio fuzzy.spaczz_pattern : default = None . Jika token adalah bagian dari entitas yang cocok, ia akan mengembalikan pola sebagai string (yang diformat untuk pola token) yang menghasilkan kecocokan. Atribut Span berikut merujuk atribut token yang termasuk dalam rentang. Semua tidak berubah:
spaczz_ent : default = False . Boolean yang menunjukkan jika semua token dalam rentang itu adalah bagian dari entitas yang ditetapkan oleh penguasa spaczz.spaczz_type : default = None . String yang menunjukkan pencocokan mana yang menghasilkan entitas menggunakan token yang disertakan.spaczz_types : default = set() . Set yang menunjukkan pencocokan mana yang menghasilkan entitas menggunakan token yang disertakan. Rentang entitas seharusnya hanya memiliki satu jenis, tetapi ini memungkinkan Anda untuk melihat jenis yang termasuk dalam rentang sewenang -wenang.spaczz_ratio : default = None . Jika semua token dalam rentang adalah bagian dari entitas yang cocok, itu akan mengembalikan rasio fuzzy.spaczz_pattern : default = None . Jika semua token dalam rentang adalah bagian dari entitas yang cocok, itu akan mengembalikan pola sebagai string (yang diformat JSON untuk pola token) yang menghasilkan kecocokan. Atribut Doc berikut merujuk atribut token yang termasuk dalam DOC. Semua tidak berubah:
spaczz_doc : default = False . Boolean yang menunjukkan jika ada token di DOC adalah bagian dari entitas yang ditetapkan oleh penguasa Spaczz.spaczz_types : default = set() . Set yang menunjukkan pencocokan mana yang menghasilkan entitas di DOC. SpaczzRuler memiliki metode ini sendiri ke/dari disk/bytes dan akan menerima parameter config yang diteruskan ke spacy.load() . Ini juga memiliki titik masuk pabrik spacy sendiri sehingga Spacy menyadari SpaczzRuler . Di bawah ini adalah contoh menyimpan dan memuat pipa spacy dengan model bahasa Inggris kecil, EntityRuler , dan SpaczzRuler .
import spacy
from spaczz . pipeline import SpaczzRuler
nlp = spacy . load ( "en_core_web_md" )
text = """Anderson, Grint created spaczz in his home at 555 Fake St,
Apt 5 in Nashv1le, TN 55555-1234 in the USA.
Some of his favorite bands are Converg and Protet the Zero.""" # Spelling errors intentional.
doc = nlp ( text )
for ent in doc . ents :
print (( ent . text , ent . start , ent . end , ent . label_ )) ('Anderson, Grint', 0, 3, 'ORG')
('555', 9, 10, 'CARDINAL')
('Apt 5', 14, 16, 'PRODUCT')
('Nashv1le', 17, 18, 'GPE')
('TN 55555-1234', 19, 23, 'ORG')
('USA', 25, 26, 'GPE')
('Converg', 34, 35, 'PERSON')
('Zero', 38, 39, 'CARDINAL')
Sementara Spacy melakukan pekerjaan yang layak untuk mengidentifikasi bahwa entitas bernama hadir dalam contoh ini, kami pasti dapat meningkatkan kecocokan - terutama dengan jenis label yang diterapkan.
Mari kita tambahkan penguasa entitas untuk beberapa pertandingan berbasis aturan.
from spacy . pipeline import EntityRuler
entity_ruler = nlp . add_pipe ( "entity_ruler" , before = "ner" ) #spaCy v3 syntax
entity_ruler . add_patterns (
[{ "label" : "GPE" , "pattern" : "Nashville" }, { "label" : "GPE" , "pattern" : "TN" }]
)
doc = nlp ( text )
for ent in doc . ents :
print (( ent . text , ent . start , ent . end , ent . label_ )) ('Anderson, Grint', 0, 3, 'ORG')
('555', 9, 10, 'CARDINAL')
('Apt 5', 14, 16, 'PRODUCT')
('Nashv1le', 17, 18, 'GPE')
('TN', 19, 20, 'GPE')
('USA', 25, 26, 'GPE')
('Converg', 34, 35, 'PERSON')
('Zero', 38, 39, 'CARDINAL')
Kami membuat kemajuan, tetapi Nashville dieja salah dalam teks sehingga penguasa entitas tidak menemukannya, dan kami masih memiliki entitas lain untuk memperbaiki/menemukan.
Mari kita tambahkan penguasa spaczz untuk mengelilingi pipa ini. Kami juga akan menyertakan atribut khusus spaczz_span dalam hasil untuk menunjukkan entitas mana yang ditetapkan melalui spaczz.
spaczz_ruler = nlp . add_pipe ( "spaczz_ruler" , before = "ner" ) #spaCy v3 syntax
spaczz_ruler . add_patterns (
[
{
"label" : "NAME" ,
"pattern" : "Grant Andersen" ,
"type" : "fuzzy" ,
"kwargs" : { "fuzzy_func" : "token_sort" },
},
{
"label" : "STREET" ,
"pattern" : "street_addresses" ,
"type" : "regex" ,
"kwargs" : { "predef" : True },
},
{ "label" : "GPE" , "pattern" : "Nashville" , "type" : "fuzzy" },
{
"label" : "ZIP" ,
"pattern" : r"b(?:55554){s<=1}(?:[-s]d{4})?b" ,
"type" : "regex" ,
}, # fuzzy regex
{
"label" : "BAND" ,
"pattern" : [{ "LOWER" : { "FREGEX" : "(converge){e<=1}" }}],
"type" : "token" ,
},
{
"label" : "BAND" ,
"pattern" : [
{ "TEXT" : { "FUZZY" : "Protest" }},
{ "IS_STOP" : True },
{ "TEXT" : { "FUZZY" : "Hero" }},
],
"type" : "token" ,
},
]
)
doc = nlp ( text )
for ent in doc . ents :
print (( ent . text , ent . start , ent . end , ent . label_ , ent . _ . spaczz_ent )) ('Anderson, Grint', 0, 3, 'NAME', True)
('555 Fake St,', 9, 13, 'STREET', True)
('Apt 5', 14, 16, 'PRODUCT', False)
('Nashv1le', 17, 18, 'GPE', True)
('TN', 19, 20, 'GPE', False)
('55555-1234', 20, 23, 'ZIP', True)
('USA', 25, 26, 'GPE', False)
('Converg', 34, 35, 'BAND', True)
('Protet the Zero', 36, 39, 'BAND', True)
Luar biasa! Model bahasa Inggris kecil masih membuat kesalahan pengenalan entitas bernama ("5" dalam "APT 5" sebagai CARDINAL ), tetapi kami puas secara keseluruhan.
Mari kita simpan pipa ini ke disk dan pastikan kita dapat memuatnya kembali dengan benar.
import tempfile
with tempfile . TemporaryDirectory () as tmp_dir :
nlp . to_disk ( f" { tmp_dir } /example_pipeline" )
nlp = spacy . load ( f" { tmp_dir } /example_pipeline" )
nlp . pipe_names ['tok2vec',
'tagger',
'parser',
'attribute_ruler',
'lemmatizer',
'entity_ruler',
'spaczz_ruler',
'ner']
Kami bahkan dapat memastikan semua pola penguasa spaczz masih ada.
spaczz_ruler = nlp . get_pipe ( "spaczz_ruler" )
spaczz_ruler . patterns [{'label': 'NAME',
'pattern': 'Grant Andersen',
'type': 'fuzzy',
'kwargs': {'fuzzy_func': 'token_sort'}},
{'label': 'GPE', 'pattern': 'Nashville', 'type': 'fuzzy'},
{'label': 'STREET',
'pattern': 'street_addresses',
'type': 'regex',
'kwargs': {'predef': True}},
{'label': 'ZIP',
'pattern': '\b(?:55554){s<=1}(?:[-\s]\d{4})?\b',
'type': 'regex'},
{'label': 'BAND',
'pattern': [{'LOWER': {'FREGEX': '(converge){e<=1}'}}],
'type': 'token'},
{'label': 'BAND',
'pattern': [{'TEXT': {'FUZZY': 'Protest'}},
{'IS_STOP': True},
{'TEXT': {'FUZZY': 'Hero'}}],
'type': 'token'}]
Alasan utama untuk kecepatan spaczz yang lebih lambat adalah bahwa C dalam namanya tidak dikapitalisasi seperti di spa c y. Spaczz ditulis dalam Python murni dan pencocokannya saat ini tidak menggunakan kosakata bahasa spacy, yang berarti mengikuti logikanya harus mudah bagi mereka yang akrab dengan Python. Namun ini berarti komponen spaczz akan berjalan lebih lambat dan kemungkinan mengkonsumsi lebih banyak memori daripada rekan spacy mereka, terutama karena lebih banyak pola ditambahkan dan dokumen semakin lama. Oleh karena itu disarankan untuk menggunakan komponen spacy seperti entitas untuk entitas dengan sedikit ketidakpastian, seperti kesalahan ejaan yang konsisten. Gunakan komponen spaczz ketika tidak ada alternatif spacy yang layak.
Saat ini saya tidak mengerjakan optimisasi kinerja ke spaczz, tetapi saran algoritmik dan optimasi dipersilakan.
Metode utama untuk mempercepat FuzzyMatcher dan SimilarityMatcher adalah dengan mengurangi parameter flex menuju 0 , atau jika flex > 0 , meningkatkan parameter min_r1 menuju nilai min_r2 dan/atau menurunkan parameter thresh ke min_r2 . Ketahuilah bahwa semua "percepatan" ini datang pada biaya peluang yang berpotensi meningkatkan pertandingan.
Seperti yang disebutkan dalam deskripsi SimilarityMatcher , memanfaatkan GPU juga dapat membantu mempercepat proses pencocokannya.
Saya selalu terbuka dan menerima permintaan fitur tetapi hanya menyadari, sebagai dev-solo dengan banyak yang tersisa untuk dipelajari, pengembangan dapat bergerak sangat lambat. Berikut ini adalah peta jalan saya untuk ruang angkasa sehingga Anda dapat melihat di mana masalah yang diangkat mungkin sesuai dengan prioritas saya saat ini.
Catatan: Meskipun saya ingin tetap fungsional spaczz , saya tidak secara aktif mengembangkannya. Saya mencoba untuk responsif terhadap masalah dan permintaan tetapi proyek ini saat ini tidak menjadi fokus saya.
Prioritas tinggi
Peningkatan
Permintaan tarik dan kontributor dipersilakan.
Spaczz dilarutkan dengan Flake8, diformat dengan hitam, tipe diperiksa dengan mypy (meskipun ini bisa mendapat manfaat dari peningkatan spesifisitas), diuji dengan pytest, otomatis dengan NOX, dan dibangun/dikemas dengan puisi. Ada beberapa alat pengembangan lain yang dirinci dalam noxfile.py, bersama dengan kait pra-komit git.
Untuk berkontribusi pada pengembangan Spaczz, garpu repositori kemudian instal spaczz dan ketergantungan dev dengan puisi. Jika Anda tertarik menjadi kontributor tetap, silakan hubungi saya secara langsung.
poetry install # Within spaczz's root directory.Saya menjaga NOx dan pra-berkomitmen di luar lingkungan puisi saya sebagai bagian dari lingkungan python toolchain saya. Dengan pra-komit terpasang, Anda mungkin juga perlu menjalankan di bawah ini untuk melakukan perubahan.
pre - commit install Satu-satunya paket lain yang tidak akan diinstal melalui puisi tetapi digunakan untuk menguji dan contoh dalam dokumentasi adalah model bahasa Inggris Spacy Medium ( en-core-web-md ). Ini perlu diinstal secara terpisah. Perintah di bawah ini harus melakukan trik:
poetry run python - m spacy download "en_core_web_md"