Spaczz는 퍼지 매칭 및 추가 정규식 일치 기능을 제공합니다. Spaczz의 구성 요소는 스파크 대응 제품과 유사한 API를 가지고 있으며 Spaczz 파이프 라인 구성 요소는 스파크 파이프 라인에 통합하여 모델로 저장/로드 할 수 있습니다.
퍼지 매칭은 현재 RapidFuzz의 Fuzz Module의 매칭업자와 함께 수행되며 Regex Matching은 현재 Regex 라이브러리에 의존하고 있습니다. Spaczz는 확실히 다른 라이브러리와 리소스에 추가적인 영향을 미칩니다. 자세한 내용은 참조 섹션을 참조하십시오.
Spacy> = 3.0을 지원합니다
Spaczz는 Ubuntu, MacOS 및 Windows Server에서 테스트되었습니다.
v0.6.0 릴리스 노트 :
rapidfuzz>=1.0.0 과 함께 python<=3.11,>=3.7 에 대한 지원."spaczz_" 선전 옵션 SpaczzRuler Init 인수의 지원을 제거했습니다. 또한 감가 상각주기 없이이 작업을 수행하게되어 죄송합니다.Matcher.pipe 메서드가 이제 제거되었습니다.spaczz_span 사용자 정의 속성이 제거되었습니다.이전 릴리스 노트는 ChangElog를 참조하십시오. 이것은 결국 문서 읽기 페이지로 이동됩니다.
Spaczz는 PIP를 사용하여 설치할 수 있습니다.
pip install spaczz Spaczz의 주요 기능은 Spacy의 Matcher 및 PhraseMatcher 와 유사하게 작동하는 FuzzyMatcher , RegexMatcher 및 "퍼지" TokenMatcher 및 스파이즈 매칭자를 스파이의 EntityRuler 와 유사한 스파이 파이프 라인 컴포넌트에 통합하는 SpaczzRuler 입니다.
퍼지 매칭 자의 기본 사용량은 퍼지 비율과 일치 패턴을 반환하고 매치 ID, 시작 및 종료 정보를 반환하는 것을 제외하고는 Spacy의 PhraseMatcher 와 유사하므로 결과를 풀 때 비율 및 패턴에 대한 변수를 포함시켜야합니다.
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 Matchers와 달리 Spaczz Matchers는 Pure Python으로 작성됩니다. 초기화 중에 스파크 어휘를 전달해야하지만 Spaczz 매칭이 현재 스파크 어휘를 사용하지 않기 때문에 순전히 일관성을위한 것입니다. 이것이 위의 match_id 가 Spacy 매칭과 같은 정수 값 대신 문자열 인 이유입니다.
Spaczz Matchers는 콜백 기능을 통해 일치 규칙을 사용할 수도 있습니다. 이 일치 콜백은 매치 자 자체, Doc The Matcher가 호출 된 Doc, Match Index 및 매치자가 생성 된 일치를 허용해야합니다.
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')
Spacy의 EntityRuler 와 마찬가지로 SpaczzRuler 에서 매우 유사한 엔티티 업데이트 로직이 구현되었습니다. SpaczzRuler 는 또한 겹치는 경기를 처리합니다. 이후 섹션에서 논의됩니다.
Spacy의 매칭 자와 달리 Spaczz 마칭에 추가 된 규칙에는 일치하는 동작을 수정할 수있는 선택적 키워드 인수가 있습니다. 아래 퍼지 매칭 예를 들어보십시오.
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']) : 최적화 중에 일치 경계를 왼쪽과 오른쪽으로 이동할 토큰 수. 최대 len(pattern) 과 최소 0 의 int 될 수 있습니다. "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) . REGEX 매칭의 기본 사용은 Spacy의 PhraseMatcher 와 상당히 유사합니다. 깃발이 문자열로 Regex 패턴을 받아 들여 플래그가 인라인이어야합니다. Regexes는 REGEX 패키지로 컴파일되므로 대략적인 "퍼지"매칭이 지원됩니다. 이러한 "퍼지"매치 결과에 대한 액세스를 제공하려면 매치자는 매치 ID, 시작 및 종료 정보와 함께 계산 된 퍼지 비율과 일치 패턴을 반환하므로 결과를 풀 때 비율과 패턴에 대한 변수를 포함해야합니다.
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 Matchers는 콜백 기능을 통해 일치 규칙을 사용할 수도 있습니다. 이 일치 콜백은 매치 자 자체, Doc The Matcher가 호출 된 Doc, Match Index 및 매치자가 생성 된 일치를 허용해야합니다. 자세한 내용은 위의 퍼지 매칭 자 사용 예제를 참조하십시오.
퍼지 매칭 자와 마찬가지로 Regex 매칭은 일치 동작을 수정할 수있는 선택적 키워드 인수가 있습니다. 아래 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 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
REGEX 매칭 설정에 사용할 수있는 키워드 인수의 전체 목록에는 다음이 포함됩니다.
ignore_case (BOOL) : 일치하기 전에 소문자 텍스트 여부. 기본값은 True 입니다.min_r (int) : 최소 일치 비율이 필요합니다.fuzzy_weights (str) : 정규식 삽입, 삭제 및 대체 수를위한 가중치 방법. 추가 가중치 방법을 사용자가 등록 할 수 있습니다. 기본값은 "indel" 입니다."indel" = (1, 1, 2)"lev" = (1, 1, 1)partial : (bool) : 부분 일치가 doc 의 Token 또는 Span 경계까지 확장되어야하는지 여부. 예를 들어, REGEX는 Token 의 일부 또는 doc 의 Span 일치합니다. 기본값은 True 입니다.predef (string) : REGEX 문자열이 사전 정의 된 Regex 패턴의 키로 해석되어야하는지 여부. 추가 사전 정의 된 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" 유사성 매칭 자의 기본 사용법은 Spacy의 PhraseMatcher 와 유사하며, 벡터 유사성 비율과 일치 패턴을 일치 ID, 시작 및 종료 정보와 함께 반환하는 것을 제외하고는 결과를 풀 때 비율 및 패턴에 대한 변수를 포함시켜야합니다.
유사성 매칭 자로부터 의미있는 결과를 얻으려면 Word Vectors (Ex. Medium 또는 Large English Models)가있는 스파크 모델을 사용하여 매칭을 초기화하고 대상 문서를 처리하며 추가 된 패턴을 처리해야합니다.
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
대부분의 순수한 파이썬 스파 즈의 경우 에도이 프로세스는 현재 매우 느리기 때문에 적용되는 범위를 염두에 두십시오. Spacy에서 GPU 지원을 활성화하면 (여기 참조) 속도가 다소 향상되어야하지만, 더 나은 검색 알고리즘을 개발하고/또는 검색을 하위 레벨 코드 (ex C)로 삭제할 때까지 Pure-Python 검색 알고리즘에서 프로세스가 여전히 병목 현상이 될 것이라고 생각합니다.
또한 다소 실험적인 특징으로서, 유사성 매칭자는 현재 SpaczzRuler 의 일부가 아니며 별도의 통치자도 없다. Doc 의 엔티티에 유사성 일치를 추가 해야하는 경우 당분간 콜백을 사용해야합니다. 아이디어에 대해서는 퍼지 매칭 자의 매칭 콜백 예제를 참조하십시오. 유사성 매칭자를 위해 통치자 통합/생성에 충분한 관심이 있다면이를 수행 할 수 있습니다.
유사성 일치 설정에 사용할 수있는 키워드 인수의 전체 목록에는 다음이 포함됩니다.
ignore_case (BOOL) : 퍼지 일치하기 전에 소문자 텍스트 여부. 기본값은 True 입니다.min_r (int) : 최소 일치 비율이 필요합니다.thresh (int) :이 비율이 초기 스캔에서 초과되고 flex > 0 이면 최적화를 시도하지 않습니다. flex == 0 이면 thresh 영향을 미치지 않습니다. 기본값은 100 입니다.flex (int | literal [ 'default', 'min', 'max']) : 최적화 중에 일치 경계를 왼쪽과 오른쪽으로 이동할 토큰 수. 최대 len(pattern) 과 최소 0 의 int 될 수 있습니다. "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 과 "High"보다 높아야합니다. 기본값은 None min_r2 가 min_r 로 설정됩니다. 참고 : Spacy의 Matcher 이제 퍼지 매칭을 지원하므로 Spaczz의 TokenMatcher 의 특정 기능이 필요하지 않으면 Spacy의 훨씬 빠른 Matcher 사용하는 것이 좋습니다.
Token Matcher의 기본 사용량은 Spacy의 Matcher 과 유사합니다. 각 목록이 개별 패턴을 설명하고 각 사전은 개별 토큰을 설명하는 사전 목록의 형태로 레이블이 붙은 패턴을 수락합니다.
Token Matcher는 Spacy 대응 장치와 동일한 토큰 속성 및 패턴 구문을 모두 받아들이지 만 퍼지 및 퍼지 반복적 인 지원을 추가합니다.
"FUZZY" 와 "FREGEX" 는 두 개의 추가 스파이 토큰 패턴 옵션입니다.
예를 들어:
[
{ "TEXT" : { "FREGEX" : "(database){e<=1}" }},
{ "LOWER" : { "FUZZY" : "access" , "MIN_R" : 85 , "FUZZY_FUNC" : "quick_lev" }},
]대문자 사전 키를 패턴으로 사용하십시오.
토큰 일치 설정에 사용할 수있는 키워드 인수의 전체 목록에는 다음이 포함됩니다.
ignore_case (BOOL) : 일치하기 전에 소문자 텍스트 여부. 패턴 레벨에서만 설정할 수 있습니다. "퍼지"및 "fregex"패턴의 경우. 기본값은 True 입니다.min_r (int) : 최소 일치 비율이 필요합니다. "퍼지"및 "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 : Regex가 사전 정의 된 Regex 패턴의 열쇠로 해석되어야하는지 여부. 패턴 레벨에서만 설정할 수 있습니다. "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"}}]
Token Matcher가 Spacy의 Matcher 를 드롭 인 교체 할 수 있지만 Spaczz Token Matcher의 퍼지 기능이 필요하지 않은 경우 Spacy의 Matcher 사용하는 것이 좋습니다. 불필요하게 처리 속도가 느려집니다.
알림 : Spacy의 Matcher 이제 퍼지 매칭을 지원하므로 Spaczz의 TokenMatcher 의 특정 기능이 필요하지 않으면 Spacy의 훨씬 빠른 Matcher 사용하는 것이 좋습니다.
Spaczz inuler는 퍼지 및 Regex Phrase Matcher와 "Fuzzy"Token 매칭을 결합하여 Spacy의 EntityRuler 와 유사한 Doc.ents 업데이트 할 수있는 하나의 파이프 라인 구성 요소로 결합합니다.
패턴은 {label (str), pattern (str 또는 list), 유형 (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의 ._. 속성과 spaczz_ 로 더욱 배정되므로 자신의 사용자 정의 속성과 충돌하지 않아야합니다. Spaczz가 있으면 강제로 작성됩니다.
이 사용자 정의 속성은 토큰 레벨에서 Spaczz 통치자를 통해서만 설정됩니다. 이러한 속성의 스팬 및 문서 버전은 토큰 레벨 속성을 참조하는 getter입니다.
다음 Token 속성을 사용할 수 있습니다. 모두가 변하지 않습니다 :
spaczz_token : default = False . 토큰이 Spaczz 통치자가 설정 한 엔티티의 일부인지를 나타내는 부울.spaczz_type : default = None . 어떤 대사가 토큰을 사용하여 엔터티를 생성했는지를 보여주는 문자열.spaczz_ratio : default = None . 토큰이 일치하는 엔티티의 일부인 경우 퍼지 비율을 반환합니다.spaczz_pattern : default = None . 토큰이 일치하는 엔티티의 일부인 경우, 패턴을 매치를 생성하는 문자열 (JSON- 토큰 패턴에 대해 형식화)으로 반환합니다. 다음 Span 속성은 스팬에 포함 된 토큰 속성을 참조합니다. 모두 불변입니다.
spaczz_ent : default = False . 스팬의 모든 토큰이 Spaczz 통치자가 설정 한 엔티티의 일부인지를 나타내는 부울.spaczz_type : default = None . 포함 된 토큰을 사용하여 엔티티를 생성 한 어떤 대응자를 나타내는 문자열.spaczz_types : default = set() . 포함 된 토큰을 사용하여 어떤 대사가 생성 된 엔티티를 보여주는 세트. 엔티티 스팬에는 하나의 유형 만 있어야하지만 임의의 범위에 포함 된 유형을 볼 수 있습니다.spaczz_ratio : default = None . 스팬의 모든 토큰이 일치하는 엔티티의 일부인 경우 퍼지 비율을 반환합니다.spaczz_pattern : default = None . 스팬의 모든 토큰이 일치하는 엔티티의 일부인 경우, 패턴을 매치를 생성하는 문자열 (JSON- 토큰 패턴에 대해 형식)으로 반환합니다. 다음 Doc 속성은 문서에 포함 된 토큰 속성을 참조합니다. 모두 불변입니다.
spaczz_doc : default = False . DOC의 토큰이 Spaczz 통치자가 설정 한 엔티티의 일부인지를 나타내는 부울.spaczz_types : default = set() . DOC에서 어떤 대사가 생성 된 엔티티를 보여주는 세트. SpaczzRuler 에는 디스크/바이트 메소드의 자체 자체가 있으며 spacy.load() 로 전달되는 config 매개 변수를 허용합니다. 또한 자체 스파이 공장 진입 지점이 있으므로 Spacy는 SpaczzRuler 를 알고 있습니다. 아래는 작은 영어 모델, 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 통치자를 추가합시다. 또한 Spaczz를 통해 설정된 엔티티를 표시하기 위해 결과에 spaczz_span 사용자 정의 속성을 포함시킬 것입니다.
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 통치자 패턴이 여전히 존재하도록 할 수 있습니다.
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가 spa c y처럼 대문자가 아니기 때문입니다. Spaczz는 순수한 Python으로 작성되었으며 경기자는 현재 Spacy Langu 그러나 이는 Spaczz 구성 요소가 느리게 실행되며 스파크에 비해 더 많은 메모리를 소비 할 수 있습니다. 특히 더 많은 패턴이 추가되고 문서가 더 길어질 수 있습니다. 따라서 일관된 철자 오류와 같은 불확실성이 거의없는 엔터티의 EntityRuler와 같은 스파크 구성 요소를 사용하는 것이 좋습니다. 실행 가능한 스페이시 대안이없는 경우 Spaczz 구성 요소를 사용하십시오.
현재 Spaczz에 대한 성능 최적화 작업을 수행 하지는 않지만 알고리즘 및 최적화 제안을 환영합니다.
FuzzyMatcher SimilarityMatcher 속도를 높이기위한 주요 방법은 flex 매개 변수를 0 으로 줄이거 나 flex > 0 이면 min_r1 매개 변수를 min_r2 값으로 향상 시키거나 min_r2 로 향하는 thresh 매개 변수를 낮추는 것입니다. 이러한 "속도 업"은 모두 잠재적으로 개선 된 경기의 기회 비용에옵니다.
SimilarityMatcher 설명에서 언급했듯이 GPU를 사용하면 속도를 높이는 데 도움이 될 수 있습니다.
나는 항상 개방적이고 수용 적 요청을 받아들이고 있지만, 배우기가 많이 남은 솔로 데브로서, 개발은 꽤 느리게 움직일 수 있습니다. 다음은 Spaczz의 로드맵이므로 제기 된 문제가 현재 우선 순위에 적합한 위치를 확인할 수 있습니다.
참고 : spaczz 기능을 유지하고 싶지만 적극적으로 개발하지는 않습니다 . 나는 문제와 요청에 반응하려고 노력하지만이 프로젝트는 현재 내 초점이 아닙니다.
우선 순위가 높습니다
향상
풀 요청과 기여자를 환영합니다.
Spaczz는 Flake8로 보풀로 채워져 있으며, 검은 색으로 형식으로, MyPy로 유형을 확인하고 (이것은 특이성이 향상 될 수 있지만) Pytest로 테스트하고 NOX로 자동화하고시를 구축/포장합니다. noxfile.py에는 git pre-commit 후크와 함께 자세한 몇 가지 다른 개발 도구가 있습니다.
Spaczz의 개발에 기여하려면 저장소를 포크 한 다음 Spaczz를 설치하고시의 DEV 종속성입니다. 정기적 인 기고자가되고 싶다면 저에게 직접 연락하십시오.
poetry install # Within spaczz's root directory.나는 Python 도구 체인 환경의 일부로시 환경 밖에서 NOX와 사전 커밋을 유지합니다. 사전 커밋이 설치된 경우 변경 사항을 커밋하려면 아래를 실행해야 할 수도 있습니다.
pre - commit install 시를 통해 설치되지 않지만 테스트 및 문서화 예제에 사용되는 유일한 다른 패키지는 Spacy Medium English Model ( en-core-web-md )입니다. 별도로 설치해야합니다. 아래 명령은 트릭을 수행해야합니다.
poetry run python - m spacy download "en_core_web_md"