Spaczz为Spacy提供了模糊的匹配和其他正则匹配功能。 SPACZZ的组件具有与Spacy对应物相似的API,而Spaczz Pipeline组件可以集成到Spacy管道中,可以将它们作为型号保存/加载。
当前,Fuzzy Matching与RapidFuzz的Fuzz模块和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 init参数。另外,很抱歉在没有弃用周期的情况下执行此操作。Matcher.pipe方法。spaczz_span自定义属性现在已删除。请参阅ChangElog以获取以前的发行说明。最终将移至读取文档页面。
可以使用PIP安装空格。
pip install spaczz SPACZZ的主要功能是FuzzyMatcher , RegexMatcher和“模糊” TokenMatcher ,其功能与Spacy的Matcher和PhraseMatcher类似,以及将SpaczzRuler集成到Spaczz匹配器中,将Spaczz Matchers整合到Spacy Pipcacy Piquine Compention与Spacy的EntityRuler类似。
模糊匹配器的基本用法类似于Spacy的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不同,Spaczz Matchers用Pure Python编写。虽然他们必须在初始化过程中传递尖顶词汇,但这纯粹是为了一致性,因为Spaczz Matchers不使用当前使用Spacy Vocab。这就是为什么上面的match_id只是字符串而不是像Spacy Matcher中的整数值。
Spaczz Matchers还可以通过回调函数利用匹配规则。这些匹配的回调需要接受匹配器本身,匹配器的DOC,比赛索引和匹配器产生的比赛。
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 Matcher的规则具有可选的关键字参数,可以修改匹配行为。以下面的模糊匹配示例:
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 |文字['默认值','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) 。正则匹配器的基本用法也与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还可以通过回调函数利用匹配规则。这些匹配的回调需要接受匹配器本身,匹配器的DOC,比赛索引和匹配器产生的比赛。有关详细信息,请参见上面的模糊匹配器用法示例。
像模糊匹配器一样,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或Span doc的边界。例如,正则态度仅匹配doc中的Token或Span的一部分。默认是True 。predef (字符串):是否应将正则弦字符串解释为预定义的正则态度模式的钥匙。用户可以注册其他预定义的正则态度模式。默认值为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,启动和最终信息,因此请确保在解开结果时将比率和模式包含变量。
为了从相似性匹配器中产生有意义的结果,必须使用带有单词向量的Spacy模型(Ex。Mediad或大型英语模型)来初始化匹配器,处理目标文档并处理添加的任何模式。
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
请注意,即使对于大多数纯净的python spaczz,此过程目前都非常慢,因此请注意应用程序的范围。在SPACY中启用GPU支持(请参见此处)应该有所提高速度,但我相信该过程仍将在纯Python搜索算法中瓶颈瓶颈,直到我开发出更好的搜索算法和/或将搜索删除到低级代码(EX C)。
同样,作为一个有点实验性的功能,相似性匹配器当前并不是SpaczzRuler的一部分,也没有单独的标尺。如果您需要在Doc的实体中添加相似性匹配,则需要暂时使用匹配回调。请参阅上面的“模糊匹配器”匹配器示例以获取想法。如果有足够的兴趣集成/创建与相似性匹配器的统治者,则可以做到。
可用于相似性匹配设置的关键字参数的完整列表包括:
ignore_case (bool):是否在模糊匹配之前要较低文本。默认是True 。min_r (INT):最小匹配比。thresh (INT):如果在初始扫描中超过此比率,并且flex > 0 ,则不会尝试优化。如果flex == 0 , thresh无效。默认值为100 。flex (int |文字['默认值','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和“高”,以确保仅返回质量匹配。默认值None ,这将导致min_r2设置为min_r 。注意:Spacy的Matcher现在支持模糊匹配,因此,除非您需要Spaczz的TokenMatcher中的特定功能,否则强烈建议使用Spacy更快的Matcher 。
令牌匹配器的基本用法类似于Spacy的Matcher 。它接受词典列表的形式的标记模式,其中每个列表都描述了一个单个模式,每个词典都描述了单个令牌。
令牌匹配器接受与Spacy对应物相同的所有令牌属性和模式语法,但添加了模糊和模糊的regex支持。
"FUZZY"和"FREGEX"是另外两个Spacy代币模式选项。
例如:
[
{ "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 :是否应将其解释为预定义的正则态度模式的关键。只能设置为模式级别。仅适用于“ 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的Matcher的替换,但如果您不需要Spaczz代币匹配器的模糊功能,仍然建议使用Spacy的Matcher - 它会不必要地降低处理。
提醒:Spacy的Matcher现在支持模糊匹配,因此,除非您需要Spaczz的TokenMatcher中的特定功能,否则强烈建议使用Spacy的更快的Matcher 。
Spaczz Ruler将模糊和Regex短语匹配器以及“模糊”令牌匹配器结合到一个可以更新Doc.ents管道组件中。类似于Spacy的EntityRuler 。
必须以{label(str),模式(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的._.属性并用spaczz_进一步填充,因此与您自己的自定义属性不应发生冲突。如果有空位,将迫使它们覆盖它们。
这些自定义属性仅通过令牌级别的Spaczz标尺设置。这些属性的跨度和DOC版本是引用令牌级属性的Getters。
可用以下Token属性。所有人都是可变的:
spaczz_token :默认值= False 。布尔值表示令牌是否是Spaczz Rouler设定的实体的一部分。spaczz_type :default = None 。字符串显示了哪个匹配器使用令牌产生实体。spaczz_ratio :default = None 。如果令牌是匹配实体的一部分,它将返回模糊比率。spaczz_pattern :default = None 。如果令牌是匹配实体的一部分,则它将以产生匹配的字符串(用于令牌模式的JSON-Formatts)返回图案。以下Span属性引用跨度中包含的令牌属性。所有人都是不变的:
spaczz_ent :default = False 。布尔值表示跨度中的所有令牌是否是Spaczz Rouler设定的实体的一部分。spaczz_type :default = None 。字符串表示使用包含令牌的哪些匹配器产生实体。spaczz_types :default = set() 。设置显示哪些匹配器使用随附的令牌生产实体。实体跨度应只有一种类型,但这允许您查看任何任意跨度中包含的类型。spaczz_ratio :default = None 。如果跨度中的所有令牌都是匹配实体的一部分,则它将返回模糊比率。spaczz_pattern :default = None 。如果跨度中的所有令牌都是匹配实体的一部分,则它将以产生匹配的字符串(用于令牌模式的JSON-Formatting)返回该模式。以下Doc属性参考文档中包含的令牌属性。所有人都是不变的:
spaczz_doc :default = False 。布尔值表示文档中是否有任何代币是Spaczz Rouler设定的实体的一部分。spaczz_types :default = set() 。设置显示哪些匹配者在文档中产生了实体。SpaczzRuler具有自己的dout/trom vrom disk/bytes方法,并且将接受传递给spacy.load()的config参数。它还具有自己的Spacy工厂入口点,因此Spacy知道SpaczzRuler 。以下是用小型英语模型, EntityRuler和SpaczzRuler保存和加载Spacy管道的示例。
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_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 = 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不像SpaC Y中的大写。 Spaczz用Pure Python编写,它的匹配器当前不使用Spacy语言词汇,这意味着遵循逻辑的人对于熟悉Python的人来说应该很容易。但是,这意味着SPACZZ组件的运行速度较慢,并且可能比其Spacy对应物更长的内存,尤其是随着添加更多模式并且文档越来越长的时间。因此,建议将诸如EntityRuler之类的Spacy组件用于几乎不确定性的实体,例如一致的拼写错误。当没有可行的替代方案时,请使用空格组件。
我目前尚未致力于对Spaczz的性能优化,但是欢迎算法和优化建议。
加速FuzzyMatcher和SimilarityMatcher的主要方法是通过将flex参数降低到0 ,或者如果flex > 0 ,将min_r1参数增加到min_r2的值和/或降低thresh参数对min_r2值。请注意,所有这些“加速”都以可能改善比赛的机会成本。
如SimilarityMatcher描述中所述,使用GPU也可能有助于加快其匹配过程。
我总是很开放且能够接受请求,但请注意,因为一个有很多东西可以学习的独奏,开发的发展速度很慢。以下是我的Spaczz路线图,因此您可以看到提出的问题可能适合我当前的优先事项。
注意:虽然我想保持spaczz的功能,但我并没有积极开发它。我试图响应问题和请求,但该项目目前不是我的重点。
优先级
增强
欢迎拉动请求和贡献者。
SPACZZ用薄片覆盖,配以黑色格式,并用Mypy进行了检查(尽管这可以从改进的特异性中受益),并用pytest进行了测试,用NOX自动化,并用诗歌构建/包装。 noxfile.py中还有其他一些开发工具以及GIT预先承诺的挂钩。
为了促进Spaczz的开发,将存储库分配,然后安装Spaczz及其与诗歌的开发依赖关系。如果您有兴趣成为定期贡献者,请直接与我联系。
poetry install # Within spaczz's root directory.作为我的Python工具链环境的一部分,我将NOX和预先投入在诗歌环境之外。在安装预先任务的情况下,您可能还需要运行以下来提交更改。
pre - commit install唯一无法通过诗歌安装的软件包,而是用于测试和文档示例的示例,是Spacy Medium Medium Model( en-core-web-md )。这将需要单独安装。下面的命令应解决问题:
poetry run python - m spacy download "en_core_web_md"