Spaczzは、スパシーのファジーマッチングと追加の正規性マッチング機能を提供します。 Spaczzのコンポーネントは、SPACYのカウンターパートと同様のAPIを備えており、Spaczz Pipelineコンポーネントはスペイシーパイプラインに統合され、モデルとして保存/ロードできます。
Fuzzy Matchingは現在、RapidFuzzのファズモジュールのマッチャーで実行され、Regex Matchingは現在Regexライブラリに依存しています。 Spaczzは確かに他の図書館やリソースから追加の影響を受けています。詳細については、参照セクションを参照してください。
スペイシー> = 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カスタム属性が削除されました。以前のリリースノートについては、Changelogをご覧ください。これは最終的に読み取りドキュメントページに移動されます。
SpaczzはPIPを使用してインストールできます。
pip install spaczz Spaczzの主な特徴は、SpacyのMatcherおよびPhraseMatcherと同様に機能するFuzzyMatcher 、 RegexMatcher 、および「Fuzzy」 TokenMatcher 、およびSpaczz MatchersをSpacyのEntityRulerと同様のスペイシーパイプラインコンポーネントに統合するSpaczzRulerです。
ファジーマッチャーの基本的な使用法は、ファジー比とマッチングパターンを返すことを除いて、スパシーのPhraseMatcherに似ています。一致ID、開始および終了情報を使用するため、結果を解くときは比率とパターンの変数を必ず含めてください。
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とは異なり、Spaczs MatchersはPure Pythonで書かれています。初期化中にスペイシーのボキャブを渡す必要がありますが、これは純粋に一貫性のためです。SpaczsMatchersは現在Spacy Vocabを使用していないためです。これが、上記のmatch_id Spacy Matchersのような整数値ではなく、単に文字列である理由です。
Spaczz Matchersは、コールバック関数を介してマッチ上のルールを使用することもできます。これらの試合中のコールバックは、マッチャー自体、マッチャーが呼び出されたドキュメント、マッチインデックス、およびマッチャーが作成したマッチを受け入れる必要があります。
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 Matchersに追加されたルールには、マッチング動作を変更できるオプションのキーワード引数があります。以下のファジーマッチングの例を取ります:
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 |なし):最初のスキャン中に選択に必要な最小一致比をオプションの粒状制御。 flex == 0の場合、 min_r1 min_r2によって上書きされます。 flex > 0の場合、 min_r1 min_r2よりも低く、一般的に「低」でなければなりません。これは、一致境界が最初に曲がっていないためです。デフォルトではNone 。これにより、 min_r1がround(min_r / 1.5) 。 Regex Matcherの基本的な使用法も、SpacyのPhraseMatcherとかなり似ています。それは弦楽器の逆のパターンを文字列として受け入れるので、フラグはインラインでなければなりません。正規表現は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は、コールバック関数を介してマッチ上のルールを使用することもできます。これらの試合中のコールバックは、マッチャー自体、マッチャーが呼び出されたドキュメント、マッチインデックス、およびマッチャーが作成したマッチを受け入れる必要があります。詳細については、上記のファジーマッチャーの使用例を参照してください。
ファジーマッチャーと同様に、Regex Matcherには、マッチング動作を変更できるオプションのキーワード引数があります。以下の正規表現の一致例を取ります。
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に拡張するか、 docの境界にSpanかどうか。たとえば、Regexは、 docのTokenまたはSpanの一部のみと一致します。デフォルトはTrueです。predef (String):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に似ています。
類似性マッチャーから意味のある結果を生成するには、ワードベクトル(例または大規模な英語モデル)を備えたスペイシーモデルを使用して、マッチャーを初期化し、ターゲットドキュメントを処理し、追加されたパターンを処理する必要があります。
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
ほとんど純粋なパイソンスペックツ人であっても、このプロセスは現在非常に遅いため、適用される範囲に注意してください。スペイシーでのGPUサポートを有効にする(こちらを参照)は速度をいくらか改善するはずですが、より良い検索アルゴリズムを開発したり、検索を下位レベルのコード(EX C)にドロップするまで、プロセスは純粋な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 |なし):最初のスキャン中に選択に必要な最小一致比をオプションの粒状制御。 flex == 0の場合、 min_r1 min_r2によって上書きされます。 flex > 0の場合、 min_r1 min_r2よりも低く、一般的に「低」でなければなりません。これは、一致境界が最初に曲がっていないためです。デフォルトではNone 。これにより、 min_r1がround(min_r / 1.5) 。min_r2 (int |なし):一致最適化中に選択に必要な最小一致比をオプションの粒状制御。質の高い一致のみが返されるようにするには、一般的にはmin_r1よりも高く、「高」である必要があります。デフォルトではNone 。これにより、 min_r2がmin_rに設定されます。注:Spacy's Matcherファジーマッチングをサポートするようになりました。そのため、SpaczzのTokenMatcherの特定の機能が必要な場合を除き、Spacyのはるかに高速なMatcherを使用することを強くお勧めします。
トークンマッチャーの基本的な使用法は、SpacyのMatcherに似ています。各リストが個々のパターンを記述し、各辞書が個々のトークンを説明する辞書のリストの形式でラベル付けされたパターンを受け入れます。
トークンマッチャーは、スペイシーの対応物であるため、同じトークン属性とパターンの構文をすべて受け入れますが、ファジーとファジーレゲックスのサポートを追加します。
"FUZZY"と"FREGEX"は、2つの追加のスペイシートークンパターンオプションです。
例えば:
[
{ "TEXT" : { "FREGEX" : "(database){e<=1}" }},
{ "LOWER" : { "FUZZY" : "access" , "MIN_R" : 85 , "FUZZY_FUNC" : "quick_lev" }},
]パターンで大文字の辞書キーを必ず使用してください。
トークンマッチング設定で利用可能なキーワード引数の完全なリストには、以下が含まれます。
ignore_case (bool):一致する前にテキストを低くするかどうか。パターンレベルでのみ設定できます。 「ファジー」および「フリーゲックス」パターンの場合。デフォルトはTrueです。min_r (int):最小一致比が必要です。 「ファジー」および「フリーゲックス」パターンの場合。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"}}]
トークンマッチャーはSpacy's Matcherのドロップイン交換になる可能性がありますが、Spaczz Token Matcherのファジー機能が必要ない場合は、SpacyのMatcherを使用することをお勧めします。
リマインダー:Spacy's Matcherファジーマッチングをサポートするようになりました。そのため、SpaczzのTokenMatcherの特定の機能が必要な場合を除き、Spacyのはるかに高速なMatcherを使用することを強くお勧めします。
Spaczz Rulerは、ファジーと逆性のフレーズマッチャーと「ファジー」トークンマッチャーを、SpacyのEntityRulerと同様のDoc.entsを更新できる1つのパイプラインコンポーネントに組み合わせています。
パターンは、{label(str)、パターン(strまたはリスト)、タイプ(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は、インポート時にいくつかのカスタム属性を初期化します。これらはスペイシーの._.属性とさらにspaczz_で準備されているため、独自のカスタム属性と矛盾するべきではありません。 Spaczzがある場合、それらを上書きします。
これらのカスタム属性は、トークンレベルのSpaczzルーラーを介してのみ設定されます。これらの属性のスパンおよびドキュメントバージョンは、トークンレベルの属性を参照するゲッターです。
次のToken属性が利用可能です。すべてが可変です:
spaczz_token :default = False 。トークンがSpaczz Rulerによって設定されたエンティティの一部であるかどうかを示すブール値。spaczz_type :default = None 。トークンを使用してエンティティを生成したマッチャーを示す文字列。spaczz_ratio :default = None 。トークンが一致したエンティティの一部である場合、ファジー比を返します。spaczz_pattern :default = None 。トークンが一致したエンティティの一部である場合、マッチを生成した文字列(jsonフォーマットされたトークンパターン用)としてパターンを返します。次のSpan属性は、スパンに含まれるトークン属性を参照します。すべてが不変です:
spaczz_ent :default = False 。スパンのすべてのトークンがSpaczz Rulerによって設定されたエンティティの一部であるかどうかを示すブール値。spaczz_type :default = None 。含まれているトークンを使用してエンティティを生成したマッチャーを示す文字列。spaczz_types :default = set() 。含まれているトークンを使用して、どのマッチャーが生産したエンティティを生産したかを示すセット。エンティティスパンには1つのタイプのみが必要ですが、これにより、任意のスパンに含まれるタイプを確認できます。spaczz_ratio :default = None 。スパンのすべてのトークンが一致したエンティティの一部である場合、ファジー比を返します。spaczz_pattern :default = None 。スパンのすべてのトークンが一致したエンティティの一部である場合、試合を生成した文字列(jsonフォーマットされたトークンパターン用)としてパターンを返します。次のDoc属性は、ドキュメントに含まれるトークン属性を参照します。すべてが不変です:
spaczz_doc :default = False 。ドキュメントのトークンがSpaczz Rulerによって設定されたエンティティの一部であるかどうかを示すブール値。spaczz_types :default = set() 。どのマッチャーがドキュメントで生産したかを示すセットを設定します。SpaczzRulerには、Disk/Bytesメソッドに独自のものがあり、 spacy.load()に渡されたconfigパラメーターを受け入れます。また、それは独自のスペイシー工場のエントリポイントを持っているので、スペイシーは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 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)
素晴らしい!小規模な英語モデルは、依然として名前付きのエンティティ認識間違い(「APT 5」の「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がSpa c yのように大文字になっていないことです。 Spaczzは純粋なPythonで記述されており、マッチャーは現在、Spacy Language語彙を利用していません。つまり、Pythonに精通している人にとってはロジックに従うことは簡単なはずです。ただし、これは、特にパターンが追加され、ドキュメントが長くなるにつれて、Spaczzコンポーネントがより遅くなり、スペイシーのカウンターパートよりも多くのメモリを消費する可能性が高いことを意味します。したがって、一貫したスペルエラーなど、不確実性がほとんどないエンティティにエンティティルーラーのようなスペイシーコンポーネントを使用することをお勧めします。実行可能なスペイシーの代替品がない場合は、Spaczzコンポーネントを使用します。
私は現在、Spaczzのパフォーマンスの最適化に取り組んでいませんが、アルゴリズムと最適化の提案は大歓迎です。
FuzzyMatcherとSimilarityMatcherをスピードアップするための主要な方法は、 flexパラメーターを0に減らすか、 flex > 0に減少させ、 min_r1パラメーターをmin_r2の値に向けて増やし、 threshパラメーターをmin_r2に向けます。これらの「スピードアップ」はすべて、潜在的に改善された試合の機会コストに伴うことに注意してください。
SimilarityMatcher説明で述べたように、GPUを使用すると、一致するプロセスをスピードアップすることもできます。
私は常にオープンで、リクエストを機能させることを受け入れていますが、学習するために多くの残りのソロデフとして、開発はかなり遅くなる可能性があります。以下はSpaczzのロードマップであるため、提起された問題が現在の優先事項にどこに当てはまるかを確認できます。
注: spaczzを機能させたいのですが、積極的に開発していません。私は問題やリクエストに対応しようとしていますが、このプロジェクトは現在私の焦点ではありません。
優先度が高い
強化
リクエストと貢献者をプルすることを歓迎します。
Spaczzはflake8で約線され、黒でフォーマットされ、Mypyでタイプチェックされています(これは特異性の改善から利益を得ることができます)、pytestでテストされ、NOxで自動化され、詩で構築/パッケージ化されます。 noxfile.pyには、Git Pre-Commitフックとともに、他にもいくつかの開発ツールが詳述されています。
Spaczzの開発に貢献するために、リポジトリをフォークしてからSpaczzをインストールし、詩との開発です。定期的な貢献者であることに興味がある場合は、直接私に連絡してください。
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"