Spaczz bietet Fuzzy -Matching und zusätzliche Regex -Matching -Funktionen für Spacy. Die Komponenten von Spaczzz haben ähnliche APIs wie ihre Spacy -Gegenstücke, und Spaczz -Pipeline -Komponenten können sich in Spacy -Pipelines integrieren, in denen sie als Modelle gespeichert/geladen werden können.
Der Fuzzy -Matching wird derzeit mit Matchern des Fuzz -Moduls von Rapidfuzz und Regex -Matching durchgeführt, der derzeit auf der Regex -Bibliothek beruht. Spaczz nimmt sicherlich zusätzlichen Einfluss von anderen Bibliotheken und Ressourcen aus. Weitere Informationen finden Sie im Abschnitt "Referenzen".
Unterstützt Spacy> = 3.0
Spaczz wurde auf Ubuntu, MacOS und Windows Server getestet.
V0.6.0 Versionshinweise:
python<=3.11,>=3.7 , zusammen mit rapidfuzz>=1.0.0 ."spaczz_" vorgepresst optionaler SpaczzRuler -Init -Argumente. Tut mir auch leid, dass dies ohne Abschaltungszyklus getan wird.Matcher.pipe -Methoden, die veraltet waren, werden nun entfernt.spaczz_span , das veraltet war, wird nun entfernt.Weitere Informationen finden Sie im Changelog für frühere Versionshinweise. Dies wird schließlich in die Seite "Lesen" der DOCS -Seite verschoben.
Spaczz kann mit PIP installiert werden.
pip install spaczz Die Hauptmerkmale von Spaczzz sind der FuzzyMatcher , RegexMatcher und "Fuzzy" TokenMatcher , der ähnlich wie bei Spacts Matcher und PhraseMatcher funktioniert, und der SpaczzRuler , der die Spaczzz -Matcher in eine Spacy -Pipeline EntityRuler integriert.
Die grundlegende Verwendung des Fuzzy -Matchs ähnelt dem Pacys PhraseMatcher , außer dass er das Fuzzy -Verhältnis und das Matched -Muster zusammen mit der Match -ID-, Start- und Endinformationen zurückgibt. Stellen Sie daher sicher, dass Variablen für das Verhältnis und das Muster beim Auspacken der Ergebnisse einbezogen werden.
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
Im Gegensatz zu Spacy -Matchern sind Spaczz -Matcher in reinem Python geschrieben. Während sie während der Initialisierung ein Spacy -Vokab der Spacy übergeben haben, dient dies ausschließlich um Konsistenz, da die Spaczzz -Matcher derzeit nicht das Spacy Vocab verwenden. Aus diesem Grund ist der obige match_id einfach eine Zeichenfolge anstelle eines Ganzzahlwerts wie in Spacy -Matchern.
Spaczz-Matcher können auch über Rückruffunktionen vor dem Spielenregeln verwendet werden. Diese Rückrufe vor dem Spiel müssen den Match selbst akzeptieren, den DOC, der der Matching, den Match-Index und die vom Match erzeugten Spiele aufgerufen wurde.
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')
Wie bei Spacys EntityRuler wurde im SpaczzRuler eine sehr ähnliche Aktualisierungslogik der Entität implementiert. Der SpaczzRuler kümmert sich auch um überlappende Übereinstimmungen. Es wird in einem späteren Abschnitt erläutert.
Im Gegensatz zu Spacys Matchern haben Regeln, die zu Spaczz -Matcher hinzugefügt wurden, optionale Keyword -Argumente, die das Übereinstimmungsverhalten ändern können. Nehmen Sie die folgenden Fuzzy -Matching -Beispiele:
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 )Als nächstes ändern wir das Fuzzy -Matching -Verhalten für das Muster in der Regel "Name".
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
Die vollständige Liste der Keyword -Argumente, die für Fuzzy -Matching -Einstellungen verfügbar sind, enthält:
ignore_case (BOOL): Ob Sie vor dem Übereinstimmung Text unterziehen sollen. Standard ist True .min_r (int): Mindestübergreifendes Verhältnis erforderlich.thresh (int): Wenn dieses Verhältnis im anfänglichen Scan überschritten wird und flex > 0 keine Optimierung versucht wird. Wenn flex == 0 , hat thresh keinen Einfluss. Standard ist 100 .fuzzy_func (str): Schlüsselname der zu verwendenden Fuzzy -Matching -Funktion. Alle Rapidfuzz -Matching -Funktionen mit Standardeinstellungen sind verfügbar. Zusätzliche Fuzzy -Matching -Funktionen können von Benutzern registriert werden. Standard ist "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 (erfordert rapidfuzz>=2.0.3 )flex (int | buchstäblich ['Standard', 'min', 'max']): Anzahl der Token, um die Matchgrenzen links und rechts während der Optimierung zu verschieben. Kann ein int mit einem max von len(pattern) und einer min von 0 sein (wird warnen und ändert sich, wenn sie höher oder niedriger). "max" , "min" oder "default" sind ebenfalls gültig. Standard ist "default" : len(pattern) // 2 .min_r1 (int | keine): optionale granulare Steuerung über das für die Auswahl erforderliche minimale Übereinstimmungsverhältnis während des ersten Scans. Wenn flex == 0 , wird min_r1 durch min_r2 überschrieben. Wenn flex > 0 , muss min_r1 im Allgemeinen niedriger als min_r2 und "niedrig" sein, da die Matchgrenzen anfänglich nicht gebeugt werden. Standard ist None , was dazu führt, dass min_r1 auf round(min_r / 1.5) . Die grundlegende Nutzung des Regex -Matchs ist auch dem Pracys PhraseMatcher ziemlich ähnlich. Es akzeptiert Regex -Muster als Saiten, sodass Flaggen inline sein müssen. Regexes werden mit dem Regex -Paket zusammengestellt, sodass ungefähre "Fuzzy" -Matching unterstützt werden. Um den Zugriff auf diese "Fuzzy" -Ag -Ergebnisse zu gewährleisten, gibt der Matcher zusammen mit der Match -ID-, Start- und Endinformationen ein kalkuliertes Fuzzy -Verhältnis und ein übereinstimmendes Muster zurück. Fügen Sie also beim Auspacken von Variablen für das Verhältnis und das Muster hinzu.
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}
Spaczz-Matcher können auch über Rückruffunktionen vor dem Spielenregeln verwendet werden. Diese Rückrufe vor dem Spiel müssen den Match selbst akzeptieren, den DOC, der der Matching, den Match-Index und die vom Match erzeugten Spiele aufgerufen wurde. Weitere Informationen finden Sie unter dem Beispiel für Fuzzy -Matcher -Nutzungsnutzung.
Wie der Fuzzy -Match verfügt der Regex -Matcher über optionale Keyword -Argumente, mit denen das Übereinstimmungsverhalten geändert werden kann. Nehmen Sie das folgende Regex -Matching -Beispiel.
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
Die vollständige Liste der Keyword -Argumente, die für Regex -Matching -Einstellungen verfügbar sind, enthält:
ignore_case (BOOL): Ob Sie vor dem Übereinstimmung Text unterziehen sollen. Standard ist True .min_r (int): Mindestübergreifendes Verhältnis erforderlich.fuzzy_weights (STR): Name der Gewichtungsmethode für Regex -Insertion, Löschung und Substituation. Zusätzliche Gewichtungsmethoden können von Benutzern registriert werden. Standard ist "indel" ."indel" = (1, 1, 2)"lev" = (1, 1, 1)partial : (BOOL): Ob teilweise Übereinstimmungen auf Token oder Span in doc verlängert werden sollten oder nicht. Zum Beispiel entspricht der Regex nur einen Teil eines Token oder Span in doc . Standard ist True .predef (String): Ob die Regex -Zeichenfolge als Schlüssel zu einem vordefinierten Regex -Muster interpretiert werden sollte oder nicht. Zusätzliche vordefinierte Regex -Muster können von Benutzern registriert werden. Standard ist 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" Die grundlegende Nutzung des Ähnlichkeits -Matchs ähnelt dem Pacys PhraseMatcher von SPACY, außer dass es das Vektor -Ähnlichkeitsverhältnis und das Matched -Muster zusammen mit der Übereinstimmungs -ID-, Start- und Endinformationen zurückgibt. Stellen Sie daher sicher, dass Variablen für das Verhältnis und das Muster beim Auspacken der Ergebnisse einbezogen werden.
Um aus dem Ähnlichkeits -Match aussagekräftige Ergebnisse zu erzielen, muss ein Spacy -Modell mit Word -Vektoren (z. B. mittel- oder große englische Modelle) verwendet werden, um den Matcher zu initialisieren, das Zieldokument zu verarbeiten und alle hinzugefügten Muster zu verarbeiten.
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
Bitte beachten Sie, dass dieser Vorgang auch für den meist reinen Python-Spazzz derzeit extrem langsam ist. Das Aktivieren der GPU-Unterstützung in Spacy (siehe hier) sollte die Geschwindigkeit etwas verbessern, aber ich glaube, der Prozess wird im Suchalgorithmus mit reinem Python immer noch Engpässe sein, bis ich einen besseren Suchalgorithmus entwickle und/oder die Suche in den niedrigeren Code (EX C) lasse.
Auch als etwas experimentelles Merkmal ist der Ähnlichkeits -Match derzeit nicht Teil des SpaczzRuler und hat noch einen separaten Herrscher. Wenn Sie den Entitäten eines Doc Ähnlichkeitsübereinstimmungen hinzufügen müssen, müssen Sie vorerst einen Rückruf vor dem Spiel verwenden. In dem Beispiel für Ideen finden Sie im Callback-Beispiel für den Fuzzy-Match. Wenn genügend Interesse an der Integration/Schaffung eines Herrschers für den Ähnlichkeitsübereinstimmung besteht, kann dies getan werden.
Die vollständige Liste der Keyword -Argumente, die für Ähnlichkeitsanpassungseinstellungen verfügbar sind, umfassen:
ignore_case (BOOL): Ob vor Fuzzy-Matching Text unterzogen werden soll. Standard ist True .min_r (int): Mindestübergreifendes Verhältnis erforderlich.thresh (int): Wenn dieses Verhältnis im anfänglichen Scan überschritten wird und flex > 0 keine Optimierung versucht wird. Wenn flex == 0 , hat thresh keinen Einfluss. Standard ist 100 .flex (int | buchstäblich ['Standard', 'min', 'max']): Anzahl der Token, um die Matchgrenzen links und rechts während der Optimierung zu verschieben. Kann ein int mit einem max von len(pattern) und einer min von 0 sein (wird warnen und ändert sich, wenn sie höher oder niedriger). "max" , "min" oder "default" sind ebenfalls gültig. Standard ist "default" : len(pattern) // 2 .min_r1 (int | keine): optionale granulare Steuerung über das für die Auswahl erforderliche minimale Übereinstimmungsverhältnis während des ersten Scans. Wenn flex == 0 , wird min_r1 durch min_r2 überschrieben. Wenn flex > 0 , muss min_r1 im Allgemeinen niedriger als min_r2 und "niedrig" sein, da die Matchgrenzen anfänglich nicht gebeugt werden. Standard ist None , was dazu führt, dass min_r1 auf round(min_r / 1.5) .min_r2 (int | keine): optionale Granularkontrolle über das für die Auswahl während der Match -Optimierung erforderliche minimale Übereinstimmungsverhältnis. Muss höher sein als min_r1 und "hoch" im Allgemeinen, um sicherzustellen, dass nur Qualitätsübereinstimmungen zurückgegeben werden. Standard ist None , was dazu führt, dass min_r2 auf min_r gesetzt wird. HINWEIS: Matcher von Spacy unterstützt jetzt die Fuzzy -Matching. Wenn Sie also keine bestimmte Funktion von Spaczzs TokenMatcher benötigen, wird dringend empfohlen, Spacts viel schnelleres Matcher zu verwenden.
Die grundlegende Nutzung des Token -Matchs ähnelt dem Spacy's Matcher . Es akzeptiert beschriftete Muster in Form von Listen von Wörterbüchern, in denen jede Liste ein individuelles Muster beschreibt, und jedes Wörterbuch beschreibt ein einzelnes Token.
Der Token-Match akzeptiert alle gleichen Token-Attribute und Mustersyntax wie das Gegenstück in Spacy, fügt jedoch fuzzy und fuzzy-regex-Unterstützung hinzu.
"FUZZY" und "FREGEX" sind die zwei zusätzlichen Optionen für Spacy -Token -Muster.
Zum Beispiel:
[
{ "TEXT" : { "FREGEX" : "(database){e<=1}" }},
{ "LOWER" : { "FUZZY" : "access" , "MIN_R" : 85 , "FUZZY_FUNC" : "quick_lev" }},
]Stellen Sie sicher, dass Sie Großbuchstaben in Mustern verwenden.
Die vollständige Liste der Keyword -Argumente, die für Token -Matching -Einstellungen verfügbar sind, enthält:
ignore_case (BOOL): Ob Sie vor dem Übereinstimmung Text unterziehen sollen. Kann nur auf die Musterebene eingestellt werden. Für "Fuzzy" und "Fregex" -Muster. Standard ist True .min_r (int): Mindestübergreifendes Verhältnis erforderlich. Für "Fuzzy" und "Fregex" -Muster.fuzzy_func (str): Schlüsselname der zu verwendenden Fuzzy -Matching -Funktion. Kann nur auf die Musterebene eingestellt werden. Nur für "Fuzzy" -Muster. Alle Rapidfuzz-Übereinstimmungsfunktionen mit Standardeinstellungen sind verfügbar. Alle tokenbasierten Funktionen bieten jedoch keinen Nützlichkeit auf der Ebene der einzelnen Token. Zusätzliche Fuzzy -Matching -Funktionen können von Benutzern registriert werden. Und nützlich sind Funktionen (die Standardeinstellung ist simple ):"simple" = ratio"partial" = partial_ratio"quick" = QRatio"partial_alignment" = partial_ratio_alignment (erfordert rapidfuzz>=2.0.3 )fuzzy_weights (STR): Name der Gewichtungsmethode für Regex -Insertion, Löschung und Substituation. Zusätzliche Gewichtungsmethoden können von Benutzern registriert werden. Standard ist "indel" ."indel" = (1, 1, 2)"lev" = (1, 1, 1)predef : Ob Regex als Schlüssel zu einem vordefinierten Regex -Muster interpretiert werden sollte oder nicht. Kann nur auf die Musterebene eingestellt werden. Nur für "Fregex" -Muster. Standard ist 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"}}]
Auch wenn der Token -Match ein Drop -In -Ersatz für Spacys Matcher sein kann, wird immer noch empfohlen, den Spacy's Matcher zu verwenden, wenn Sie nicht die Fuzzy -Funktionen des Spaczzzzzz -Spielers benötigen - er wird die Verarbeitung unnötig verlangsamen.
Erinnerung: SPACY's Matcher unterstützt jetzt die Fuzzy -Matching. Wenn Sie also keine bestimmte Funktion von Spaczzs TokenMatcher benötigen, wird dringend empfohlen, Spacts viel schnelleres Matcher zu verwenden.
Das Spaczz -Lineal kombiniert die Fuzzy- und Regex -Phrase -Matcher und den "Fuzzy" -Token -Match, in eine Pipeline -Komponente, mit der ein Doc.ents ähnlich wie Spacys EntityRuler aktualisieren kann.
Muster müssen als iterbare Wörterbücher im Format von {Label (STR), Muster (STR oder List), Typ (STR), optionalem KWARGS (DICT) und optionaler ID (STR)} hinzugefügt werden.
Zum Beispiel ein Fuzzy -Phrasenmuster:
{'label': 'ORG', 'pattern': 'Apple' 'kwargs': {'min_r2': 90}, 'type': 'fuzzy'}
Oder ein Token -Muster:
{'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"}}]')
Wir sehen im obigen Beispiel, dass wir auf einige benutzerdefinierte Attribute verweisen, die unten erläutert werden.
Weitere SpaczzRuler -Beispiele finden Sie hier. Insbesondere enthält dies Details zum Sortierungsprozess des Herrschers und zum Fuzzy -Matching -Parametern.
Spaczz initialisiert einige benutzerdefinierte Attribute beim Import. Diese sind unter Spacy's ._. Attribut und werden weiter mit spaczz_ vorbereitet, sodass keine Konflikte mit Ihren eigenen benutzerdefinierten Attributen bestehen sollten. Wenn es Spaczz gibt, schreibt sie sie überschreiben.
Diese benutzerdefinierten Attribute werden nur über das Spaczz -Lineal auf Token -Ebene festgelegt. Spann- und DOC -Versionen dieser Attribute sind Getters, die auf die Attribute auf Tokenebene verweisen.
Die folgenden Token -Attribute sind verfügbar. Alle sind veränderlich:
spaczz_token : default = False . Booleschen, der bezeichnet, ob das Token Teil eines vom Spaczz -Herrschers festgelegten Entität ist.spaczz_type : default = None . Zeichenfolge, die zeigt, welcher Match eine Entität mit dem Token erzeugt hat.spaczz_ratio : default = None . Wenn das Token Teil einer übereinstimmenden Einheit ist, wird das Fuzzy -Verhältnis zurückgegeben.spaczz_pattern : Standard = None . Wenn das Token Teil einer übereinstimmenden Entität ist, gibt es das Muster als Zeichenfolge (JSON-Formatierung für Token-Muster) zurück, die das Match erzeugt haben. Die folgenden Span -Attribute verweisen auf die in der Span enthaltenen Token -Attribute. Alle sind unveränderlich:
spaczz_ent : default = False . Booleschen, der bezeichnet, ob alle Token in der Spanne Teil einer vom Spaczz -Herrscher festgelegten Entität sind.spaczz_type : default = None . Zeichenfolge, die bezeichnet, welcher Match eine Entität mit den enthaltenen Token erstellt hat.spaczz_types : default = set() . Setzen Sie das, was angezeigt wird, welche Übereinstimmungen mit den enthaltenen Token Entitäten produziert haben. Eine Entitätsspanne sollte nur einen Typ haben, dadurch können Sie jedoch die Typen in jeder willkürlichen Spanne sehen.spaczz_ratio : default = None . Wenn alle Token in der Spanne Teil einer übereinstimmenden Einheit sind, wird das Fuzzy -Verhältnis zurückgegeben.spaczz_pattern : Standard = None . Wenn alle Token in einer Spannweite Teil einer übereinstimmenden Entität sind, wird das Muster als Zeichenfolge (JSON-formatiert für Token-Muster) zurückgegeben, die das Match erzeugt haben. Die folgenden Doc -Attribute verweisen auf die im DOC enthaltenen Token -Attribute. Alle sind unveränderlich:
spaczz_doc : default = False . Booleschen, der bezeichnet, ob irgendwelche Token im DOC Teil einer vom Spaczz -Herrscher festgelegten Entität sind.spaczz_types : default = set() . Stellen Sie fest, welche Matchbilder im Dokument hergestellt wurden. Der SpaczzRuler verfügt über eigene Methoden mit Festplatten/Bytes und akzeptiert config , die an spacy.load() übergeben wurden. Es hat auch seinen eigenen Einstiegspunkt für Spacy Factory, also ist sich Spacy des SpaczzRuler bewusst. Im Folgenden finden Sie ein Beispiel für das Speichern und Laden einer Spacton -Pipeline mit dem kleinen englischen Modell, dem EntityRuler und dem 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')
Während Spacy in diesem Beispiel eine anständige Aufgabe ermittelt, dass benannte Unternehmen vorhanden sind, können wir die Übereinstimmungen definitiv verbessern - insbesondere mit den angewandten Etiketten.
Fügen wir ein Entity-Lineal für einige Regeln basierende Übereinstimmungen hinzu.
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')
Wir machen Fortschritte, aber Nashville ist im Text falsch geschrieben, sodass das Entitätsherrscher es nicht findet, und wir haben noch andere Einheiten, die wir beheben/finden können.
Fügen wir einen Raumlehrer hinzu, um diese Pipeline herauszurunden. Wir werden auch das benutzerdefinierte Attribut spaczz_span in die Ergebnisse einbeziehen, um zu bezeichnen, welche Entitäten über Spaczz eingestellt wurden.
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)
Eindrucksvoll! Das kleine englische Modell macht immer noch einen benannten Entitätserkennungsfehler ("5" in "Apt 5" als CARDINAL ), aber wir sind insgesamt zufrieden.
Lassen Sie uns diese Pipeline auf der Festplatte speichern und sicherstellen, dass wir sie korrekt zurückladen können.
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']
Wir können sogar sicherstellen, dass alle Spaczz -Lineal -Muster noch vorhanden sind.
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'}]
Der Hauptgrund für die langsamere Geschwindigkeit von Spaczz ist, dass das C in seinem Namen nicht so aktiviert ist, wie es in Spa C y ist. Spaczz ist in reinem Python geschrieben und seine Matcher verwenden derzeit keine Vokabulare der Spacing -Sprache, was bedeutet, dass die Logik für diejenigen, die mit Python vertraut sind, einfach sein sollte. Dies bedeutet jedoch, dass Spaczz -Komponenten langsamer laufen und wahrscheinlich mehr Speicher verbrauchen als ihre Spacy -Gegenstücke, insbesondere wenn mehr Muster hinzugefügt werden und Dokumente länger werden. Es wird daher empfohlen, Spacy -Komponenten wie den EntitätsRuler für Entitäten mit geringer Unsicherheit wie konsistente Rechtschreibfehler zu verwenden. Verwenden Sie Spaczz -Komponenten, wenn keine praktikablen Alternativen für Spaces vorhanden sind.
Ich arbeite derzeit nicht an Leistungsoptimierungen für Spaczz, aber algorithmische und Optimierungsvorschläge sind willkommen.
Die primären Methoden zur Beschleunigung des FuzzyMatcher und SimilarityMatcher sind die Verringerung des flex -Parameters in Richtung 0 oder wenn flex > 0 erhöht wird, wodurch der Parameter min_r1 in Richtung des Wertes von min_r2 erhöht wird und/oder der thresh -Parameter in Richtung min_r2 senkt. Beachten Sie, dass all diese "Beschleunigungen" zu den Opportunitätskosten potenziell verbesserter Spiele gelten.
Wie in der Beschreibung SimilarityMatcher erwähnt, kann die Verwendung einer GPU auch dazu beitragen, den Übereinstimmungsprozess zu beschleunigen.
Ich bin immer offen und empfänglich, um Anfragen zu stellen, aber ich bin mir nur bewusst, dass sich die Entwicklung als Solo-Dev mit noch viel zu lernen. Die Entwicklung kann sich ziemlich langsam bewegen. Das Folgende ist meine Roadmap für Spaczzz, sodass Sie sehen können, wo Probleme in meine aktuellen Prioritäten passen.
Hinweis: Während ich spaczz funktional halten möchte, entwickle ich es nicht aktiv. Ich versuche, auf Probleme und Anfragen zu reagieren, aber dieses Projekt ist derzeit kein Schwerpunkt von mir.
Hohe Priorität
Verbesserungen
Anfragen und Mitwirkenden sind willkommen.
Spaczz ist mit Flake8 abgegeben, mit schwarzem, mit MyPy überprüfter Typ (obwohl dies von einer verbesserten Spezifität profitieren könnte), mit PyTest getestet, mit NOx automatisiert und mit Gedichten gebaut/verpackt. In der NoxFile.py sind einige andere Entwicklungswerkzeuge zusammen mit Git Pre-Commit-Haken aufgeführt.
Um zur Entwicklung von Spaczz beizutragen, fork das Repository und installieren Sie Spaczz und seine Develabhängigkeiten mit Poesie. Wenn Sie ein regelmäßiger Mitarbeiter sind, kontaktieren Sie mich direkt.
poetry install # Within spaczz's root directory.Ich halte NOX und Pre-Commit im Rahmen meiner Python Toolchain-Umgebung außerhalb meiner Gedichtumgebung. Bei installiertem Pre-Commit müssen Sie möglicherweise auch die unten stehenden Änderungen ausführen.
pre - commit install Das einzige andere Paket, das nicht über Poesie installiert wird, sondern für Tests und Beispiele für In-Dokumentation verwendet wird, ist das Spacy Medium-englische Modell ( en-core-web-md ). Dies muss separat installiert werden. Der folgende Befehl sollte den Trick machen:
poetry run python - m spacy download "en_core_web_md"