Spaczz обеспечивает нечеткое сопоставление и дополнительную функциональность сопоставления корпорации для Spacy. Компоненты Spaczz имеют аналогичные API с их аналогами Spacy, и компоненты Spaczz Pipeline могут интегрироваться в трубопроводы Spacy, где их можно сохранить/загружать в виде моделей.
В настоящее время нечеткое сопоставление выполняется с маттерами из модуля Fuzz Rapidfuzz, а совпадение REGEX в настоящее время опирается на библиотеку Regex. Spaczz, безусловно, оказывает дополнительное влияние от других библиотек и ресурсов. Для получения дополнительной информации см. Раздел ссылок.
Поддерживает Spacy> = 3.0
Spaczz был протестирован на Ubuntu, MacOS и Windows Server.
v0.6.0 Примечания к выпуску:
python<=3.11,>=3.7 , вместе с rapidfuzz>=1.0.0 ."spaczz_" предварительно подготовленных аргументов SpaczzRuler . Также извините, что делал это без цикла искажения.Matcher.pipe , которые были устарели, теперь удаляются.spaczz_span , который был устарел, теперь удален.Пожалуйста, смотрите The ChangeLog для предыдущих заметок о выпуске. Это в конечном итоге будет перемещено на страницу «Читать The Docs».
Spaczz может быть установлен с помощью PIP.
pip install spaczz Основными функциями Spaczz являются FuzzyMatcher , RegexMatcher и «Fuzzy» TokenMatcher , которые функционируют аналогично Matcher и PhraseMatcher Spacy, а также SpaczzRuler , который объединяет совпадения Spaczz в компонент трубопровода Spacy, аналогичный EntityRuler Spacy.
Основное использование нечеткого совпадения аналогично PhraseMatcher Spacy, за исключением того, что он возвращает нечеткое соотношение и соответствующий шаблон, наряду с идентификатором совпадения, началом и конечной информацией, поэтому обязательно включите переменные для отношения и шаблона при распаковке результатов.
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
В отличие от матков SPACY, Spaczz -матчеры написаны на Pure Python. Несмотря на то, что они обязаны пропустить словарь SPACY во время инициализации, это предназначено исключительно для последовательности, так как совместные соблюдения Spaczz не используют в настоящее время используют Spacy Vocab. Вот почему match_id выше - это просто строка вместо целочисленного значения, как в сочетаниях Spacy.
Сопоставщики Spaczz также могут использовать правила матча с помощью функций обратного вызова. Эти обратные вызовы в матче должны принять сам сочетание, документ, который был вызван совпадением, индекс матча и матчи, произведенные матцером.
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')
Как и EntityRuler Spacy, в SpaczzRuler была реализована очень похожая логика обновления организации. SpaczzRuler также заботится об обращении с перекрывающимися спичками. Это обсуждается в более позднем разделе.
В отличие от совпадений Spacy, правила, добавленные в Spaczz Matchters, имеют дополнительные аргументы ключевых слов, которые могут изменить поведение сопоставления. Возьмите приведенные ниже нечеткие примеры:
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 )Затем мы изменим нечеткое соответствие поведения для шаблона в правиле «Имя».
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
Полный список аргументов ключевых слов, доступных для настройки нечеткого сопоставления, включает в себя:
ignore_case (bool): ли текст с нижним часом перед соответствием. По умолчанию True .min_r (int): требуется минимальное соотношение соответствия.thresh (int): Если это соотношение превышено при начальном сканировании, и flex > 0 , оптимизация не будет предпринята. Если flex == 0 , thresh не имеет эффекта. По умолчанию 100 .fuzzy_func (str): имя ключа нечеткой совпадения функции для использования. Все функции Rapidfuzz сопоставления с настройками по умолчанию доступны. Дополнительные функции нечеткого сопоставления могут быть зарегистрированы пользователями. По умолчанию "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 (требует rapidfuzz>=2.0.3 )flex (int | Literal ['default', 'min', 'max']): количество токенов для перемещения границ соответствия влево и вправо во время оптимизации. Может быть int с максимумом len(pattern) и мин 0 (будет предупреждать и измениться, если выше или ниже). "max" , "min" или "default" также действительны. По умолчанию "default" : len(pattern) // 2 .min_r1 (int | none): необязательный гранулированный контроль над минимальным коэффициентом соответствия, необходимым для выбора во время начального сканирования. Если flex == 0 , min_r1 будет перезаписан min_r2 . Если flex > 0 , min_r1 должен быть ниже, чем min_r2 и «низкий» в целом, потому что матч -границы не сгибаются изначально. По умолчанию None , что приведет к тому, что min_r1 будет установлен в round(min_r / 1.5) . Основное использование сочетания корпорации также довольно похоже на PhraseMatcher Spacy. Он принимает шаблоны режима как строки, поэтому флаги должны быть встроенными. Регулярные индексы составляются с пакетом Regex, поэтому поддерживается приблизительное «нечеткое» сопоставление. Чтобы обеспечить доступ к этим «нечетким» результатам соответствия, сочетание возвращает рассчитанное нечеткое соотношение и соответствующий шаблон, наряду с идентификатором совпадения, начала и конечной информацией, поэтому обязательно включите переменные для отношения и шаблона при распаковке результатов.
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 также могут использовать правила матча с помощью функций обратного вызова. Эти обратные вызовы в матче должны принять сам сочетание, документ, который был вызван совпадением, индекс матча и матчи, произведенные матцером. Смотрите пример использования нечеткого сочетания выше для подробностей.
Как и Fuzzy Matcher, у совместного настройки Degex есть дополнительные аргументы ключевых слов, которые могут изменить поведение сопоставления. Возьмите пример соответствия режима режима.
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
Полный список аргументов ключевых слов, доступных для настройки соответствия корпорации, включает в себя:
ignore_case (bool): ли текст с нижним часом перед соответствием. По умолчанию True .min_r (int): требуется минимальное соотношение соответствия.fuzzy_weights (str): название метода взвешивания для вставки, удаления и подмены. Дополнительные методы взвешивания могут быть зарегистрированы пользователями. По умолчанию "indel" ."indel" = (1, 1, 2)"lev" = (1, 1, 1)partial : (Bool): должны ли частичные совпадения распространяться на Token или Span границы в doc или нет. Например, корпорация соответствует только часть Token или Span в doc . По умолчанию True .predef (String): следует ли интерпретировать строку regex как ключ к предопределенному шаблону резервуара или нет. Дополнительные предопределенные шаблоны регулирования могут быть зарегистрированы пользователями. По умолчанию 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" Основное использование сопоставления сходства аналогично PhraseMatcher Spacy, за исключением того, что он возвращает коэффициент сходства вектора и сопоставленный шаблон, а также идентификатор соответствия, начало и конечную информацию, поэтому обязательно включите переменные для отношения и шаблона при распаковке результатов.
Чтобы получить значимые результаты сопоставления сходства, модель SPACY с векторами Word (Ex. Medium или крупные английские модели) должна использоваться для инициализации сочетания, обработки целевого документа и обработки любых добавленных шаблонов.
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
Обратите внимание, что даже для в основном чистопитонов Spaczz этот процесс в настоящее время является чрезвычайно медленным, поэтому помните о применении, в которой он применяется. Включение поддержки GPU в Spacy (см. Здесь) должно несколько улучшить скорость, но я считаю, что процесс все равно будет узким местом в алгоритме поиска чистопитона, пока я не разработаю лучший алгоритм поиска и/или не остановлюсь в поиске в код более низкого уровня (Ex C).
Кроме того, как несколько экспериментальная особенность, совместный сходство в настоящее время не является частью SpaczzRuler и не имеет отдельного правителя. Если вам нужно добавить совпадения сходства к объектам Doc , вам необходимо будет использовать обратный вызов в соответствии с матчем. Пожалуйста, смотрите пример обратного вызова нечеткого сочетания, приведенный выше для идей. Если достаточно интереса к интеграции/созданию линейки для сопоставления сходства, это может быть сделано.
Полный список аргументов ключевых слов, доступных для настройки соответствия сходства, включает в себя:
ignore_case (bool): ли текст в нижнем случае перед нечетким сопоставлением. По умолчанию True .min_r (int): требуется минимальное соотношение соответствия.thresh (int): Если это соотношение превышено при начальном сканировании, и flex > 0 , оптимизация не будет предпринята. Если flex == 0 , thresh не имеет эффекта. По умолчанию 100 .flex (int | Literal ['default', 'min', 'max']): количество токенов для перемещения границ соответствия влево и вправо во время оптимизации. Может быть int с максимумом len(pattern) и мин 0 (будет предупреждать и измениться, если выше или ниже). "max" , "min" или "default" также действительны. По умолчанию "default" : len(pattern) // 2 .min_r1 (int | none): необязательный гранулированный контроль над минимальным коэффициентом соответствия, необходимым для выбора во время начального сканирования. Если flex == 0 , min_r1 будет перезаписан min_r2 . Если flex > 0 , min_r1 должен быть ниже, чем min_r2 и «низкий» в целом, потому что матч -границы не сгибаются изначально. По умолчанию None , что приведет к тому, что min_r1 будет установлен в round(min_r / 1.5) .min_r2 (int | none): необязательный гранулированный контроль над минимальным коэффициентом соответствия, необходимым для выбора во время оптимизации соответствия. Должен быть выше, чем min_r1 и «высокий» в целом, чтобы гарантировать, что только качественные совпадения возвращаются. По умолчанию None , что приведет к тому, что min_r2 будет установлен на min_r . Примечание. Matcher Spacy теперь поддерживает нечеткое соответствие, поэтому, если вам не нужна конкретная функция от TokenMatcher Spaczz, настоятельно рекомендуется использовать гораздо более быстрый Matcher Spacy.
Основное использование маткера токенов похоже на Matcher Spacy. Он принимает помеченные шаблоны в форме списков словарей, где каждый список описывает отдельный шаблон, и каждый словарь описывает индивидуальный токен.
Совместник токена принимает все одинаковые атрибуты токена и синтаксис шаблонов, как и аналог Spacy, но добавляет нечеткую и нечеткую поддержку.
"FUZZY" и "FREGEX" - это два дополнительных варианта шаблона токена Spacy.
Например:
[
{ "TEXT" : { "FREGEX" : "(database){e<=1}" }},
{ "LOWER" : { "FUZZY" : "access" , "MIN_R" : 85 , "FUZZY_FUNC" : "quick_lev" }},
]Убедитесь, что используйте ключи от заглавного словаря в узорах.
Полный список аргументов ключевых слов, доступных для настройки соответствия токенов, включает в себя:
ignore_case (bool): ли текст с нижним часом перед соответствием. Может быть установлен только на уровне шаблона. Для узоров "Fuzzy" и "Fregex". По умолчанию True .min_r (int): требуется минимальное соотношение соответствия. Для узоров "Fuzzy" и "Fregex".fuzzy_func (str): имя ключа нечеткой совпадения функции для использования. Может быть установлен только на уровне шаблона. Только для «нечетких» узоров. Все функции Rapidfuzz-сопоставления с настройками по умолчанию доступны, однако любые функции на основе токков не обеспечивают полезности на уровне индивидуального токена. Дополнительные функции нечеткого сопоставления могут быть зарегистрированы пользователями. Включены и полезны, функции (по умолчанию simple ):"simple" = ratio"partial" = partial_ratio"quick" = QRatio"partial_alignment" = partial_ratio_alignment (требует rapidfuzz>=2.0.3 )fuzzy_weights (str): название метода взвешивания для вставки, удаления и подмены. Дополнительные методы взвешивания могут быть зарегистрированы пользователями. По умолчанию "indel" ."indel" = (1, 1, 2)"lev" = (1, 1, 1)predef : следует ли интерпретировать резервную экспозицию как ключ к предопределенному шаблону регуляции или нет. Может быть установлен только на уровне шаблона. Только для шаблонов "fregex". По умолчанию 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"}}]
Несмотря на то, что совмещение токенов может быть заменой для Matcher Spacy, он все еще рекомендуется использовать Spacy's Matcher если вам не нужны нечеткие возможности Spaczz Token Satcher - он будет медленной обработкой без необходимости.
Напоминание: Matcher 's Spacy теперь поддерживает нечеткое сочетание, поэтому, если вам не нужна конкретная функция от TokenMatcher Spaczz, настоятельно рекомендуется использовать гораздо более быстрый Matcher Spacy.
Правитель Spaczz сочетает в себе нечеткие и резервные соборы, а также «нечеткий» совмещение токенов, в один компонент трубопровода, который может обновить Doc.ents , похожие на EntityRuler Spacy.
Паттерны должны быть добавлены в качестве итерабильного словарей в формате {label (str), pattern (str или list), type (str), необязательных Kwargs (DICT) и необязательного ID (STR)} .
Например, шаблон нечеткой фразы:
{'label': 'ORG', 'pattern': 'Apple' 'kwargs': {'min_r2': 90}, 'type': 'fuzzy'}
Или, токен -шаблон:
{'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"}}]')
В приведенном выше примере мы ссылаемся на некоторые пользовательские атрибуты, которые объяснены ниже.
Для получения дополнительных примеров SpaczzRuler см. Здесь. В частности, это предоставляет подробную информацию о процессе сортировки линейка и нечетких параметрах сопоставления.
Spaczz инициализирует некоторые пользовательские атрибуты при импорте. Они находятся под Spacy's ._. Атрибут и дополнительно приготовлены с spaczz_ , чтобы не было конфликтов с вашими собственными атрибутами. Если есть Spaczz, заставит их перезаписать.
Эти пользовательские атрибуты устанавливаются только через правитель Spaczz на уровне токена. Версии этих атрибутов SPAN и DOC являются Getters, которые ссылаются на атрибуты уровня токена.
Доступны следующие атрибуты Token . Все изменяются:
spaczz_token : default = False . Логический, который обозначает, является ли токен частью сущности, установленной правителем Spaczz.spaczz_type : по умолчанию = None . Строка, которая показывает, какой матлер создал объект, используя токен.spaczz_ratio : по умолчанию = None . Если токен является частью соответствующей сущности, он вернет нечеткое соотношение.spaczz_pattern : по умолчанию = None . Если токен является частью соответствующей сущности, он вернет шаблон в виде строки (форматированной JSON для шаблонов токенов), который создал матч. Следующие атрибуты Span ссылаются на атрибуты токена, включенные в SPAN. Все неизменны:
spaczz_ent : default = False . Логический, который обозначает, если все токены в промежутке являются частью сущности, установленной правителем Spaczz.spaczz_type : по умолчанию = None . Строка, которая обозначает, какой маттер произвел сущность, используя включенные токены.spaczz_types : default = set() . Установите, что показывает, какие совпадения производили сущности, используя включенные токены. Пролет сущностей должен иметь только один тип, но это позволяет вам видеть типы, включенные в любой произвольный промежуток.spaczz_ratio : по умолчанию = None . Если все токены в пролете являются частью соответствующей сущности, это вернет нечеткое соотношение.spaczz_pattern : по умолчанию = None . Если все токены в пролете являются частью соответствующей сущности, он вернет шаблон как строку (форматированную JSON для шаблонов токенов), которая создала матч. Следующие атрибуты Doc ссылаются на атрибуты токена, включенные в DOC. Все неизменны:
spaczz_doc : default = False . Boolean, которая обозначает, если таковые жетоны в DOC являются частью сущности, установленной Spaczz Ruleder.spaczz_types : default = set() . Установить, что показывает, какие совпадения производили сущности в DOC. SpaczzRuler имеет свои собственные методы для/от диска/байт и примет параметры config , передаваемые spacy.load() . У этого также есть собственная точка входа в Spacy Factory, поэтому Spacy знает о SpaczzRuler . Ниже приведен пример сохранения и загрузки трубопровода SPACY с небольшой английской моделью, EntityRuler и 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')
В то время как Spacy делает достойную работу по определению того, что в этом примере присутствуют названные объекты, мы определенно можем улучшить совпадения, особенно с применением типов этикетков.
Давайте добавим правитель сущности для некоторых матчей на основе правил.
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')
Мы добиваемся прогресса, но в Нэшвилле написано неправильно в тексте, поэтому правитель сущности не находит его, и у нас все еще есть другие сущности, чтобы исправить/найти.
Давайте добавим Spaczz Ruler, чтобы вокруг этого трубопровода. Мы также включим пользовательский атрибут spaczz_span в результаты, чтобы обозначить, какие объекты были установлены через 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)
Потрясающий! Небольшая английская модель по -прежнему совершает именованную ошибку распознавания сущности («5» в «Apt 5» в качестве CARDINAL ), но мы удовлетворены в целом.
Давайте сохраним этот трубопровод на диск и убедимся, что мы можем правильно загрузить его.
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']
Мы можем даже обеспечить все остальные паттерны Spaczz Ruler все еще присутствуют.
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'}]
Основная причина более медленной скорости Spaczz заключается в том, что C в его названии не заглавляется, как в спа -салоне . Spaczz написан в Pure Python, и его матчеры в настоящее время не используют словесные слова Spacy Language, что означает, что следить за его логикой должна быть легко для тех, кто знаком с Python. Однако это означает, что компоненты Spaczz будут работать медленнее и, вероятно, потребляют больше памяти, чем их аналоги Spacy, особенно если добавлять больше шаблонов и документы становятся длиннее. Поэтому рекомендуется использовать компоненты Spacy, такие как Entityruler для сущностей с небольшой неопределенностью, например, последовательными ошибками правописания. Используйте компоненты Spaczz, когда нет жизнеспособных альтернатив Spacy.
В настоящее время я не работаю над оптимизацией производительности в Spaczz, но алгоритмические предложения и оптимизацию приветствуются.
Основными методами ускорения FuzzyMatcher и SimilarityMatcher являются уменьшение параметра flex в направлении 0 или, если flex > 0 , увеличивая параметр min_r1 к значению min_r2 и/или понижения параметра thresh в направлении min_r2 . Имейте в виду, что все эти «ускорения» стоят альтернативной стоимости потенциально улучшенных матчей.
Как упомянуто в описании SimilarityMatcher , использование графического процессора также может помочь ускорить его процесс сопоставления.
Я всегда открыт и восприимчив к запросам, но просто будьте в курсе, как сольный дев с тем, что осталось много, разработка может двигаться довольно медленно. Ниже приведена моя дорожная карта для Spaczz, чтобы вы могли видеть, где поднятые проблемы могут вписаться в мои нынешние приоритеты.
Примечание. Хотя я хочу сохранить функциональный spaczz , я не активно его развиваю. Я стараюсь отвечать на проблемы и запросы, но этот проект в настоящее время не является моим фокусом.
Высокий приоритет
Улучшения
Приглашаются запросы и участники.
Spaczz снимается Flake8, отформатированный черным, проверяемым типом Mypy (хотя это может извлечь выгоду из улучшения специфичности), протестировано с помощью Pytest, автоматизированного с NOx и построено/упакован с поэзией. Есть несколько других инструментов разработки, подробно описанных в noxfile.py, наряду с Git Pre-Commit Hooks.
Чтобы внести свой вклад в разработку Spaczz, разветвляется репозиторий, затем установите Spaczz и зависимости Dev с поэзией. Если вы заинтересованы в том, чтобы быть постоянным участником, пожалуйста, свяжитесь со мной напрямую.
poetry install # Within spaczz's root directory.Я держу NOx и предварительную связь вне своей поэтической среды в рамках моей среды Python Toolchain. При установленном предварительном Commit вам также может потребоваться запустить ниже, чтобы совершить изменения.
pre - commit install Единственный другой пакет, который не будет установлен с помощью поэзии, но используется для тестирования и примеров в области документации,-это модель Spacy Medium English ( en-core-web-md ). Это должно быть установлено отдельно. Команда ниже должна сделать свое дело:
poetry run python - m spacy download "en_core_web_md"