SpaCy 的模式匹配问题
pattern match issue with SpaCy
我有以下脚本使用模式来匹配邮政编码。但是,根据我提供邮政编码字符串的方式,似乎会影响它的匹配方式。
from spacy.pipeline import EntityRuler
import en_core_web_lg
nlp = en_core_web_lg.load()
patterns = [
{
"label": "POST_CODE", "pattern": [
{"TEXT": {"REGEX": r'^[a-zA-Z]{2}\d{1,2}[a-zA-Z]?$'}},
{"TEXT": {"REGEX": r'^\d[a-zA-Z]{2}$'}}
]
}
]
ruler = nlp.add_pipe("entity_ruler", config={"validate": True})
ruler.add_patterns(patterns)
def get_entities(text):
entTypes = []
doc = nlp(text)
for entity in doc.ents:
x = {}
x[entity.label_] = entity.text
entTypes.append(x)
return {"entities": entTypes}
if __name__ == '__main__':
import sys
print(get_entities(sys.argv[1]))
样本:
python test.py "this is a test RH15 9XR"
{'entities': [{'CARDINAL': '9XR'}]}
python test.py "this is a test RH15 9XR, RH4 9GG"
{'entities': [{'CARDINAL': '9XR'}, {'POST_CODE': 'RH4 9GG'}]}
python test.py "this is a test RH15 9XR, RH4 9GG, RH5 0XE"
{'entities': [{'CARDINAL': '9XR'}, {'POST_CODE': 'RH4 9GG'}, {'POST_CODE': 'RH5 0XE'}]}
python test.py "this is a test RH15 9XR, RH4 9GG, RH5 0XE PO01 0IO"
{'entities': [{'CARDINAL': '9XR'}, {'POST_CODE': 'RH4 9GG'}, {'CARDINAL': '0XE'}, {'CARDINAL': '0IO'}]}
由于某种原因,第一个邮政编码似乎从未匹配过。在最后一个示例中,“RH5 0XE”和“PO01 0IO”都应该匹配,正如您可以看到在前面的 运行.
中匹配的“RH5 0XE”
关于如何提高匹配率有什么想法吗?
谢谢
马克
如果你 运行 使用 re 而不是通过 spacy 的正则表达式是否有效?
我认为您没有在您的正则表达式中正确处理空格或字符串结尾/字符串开头的情况——您的测试有效的所有示例附近都有逗号,而失败的示例周围的逗号较少
将 entity_ruler
放在管道中的 ner
之前,这样它的匹配优先于 ner
的 CARDINAL
范围,或者您可以将其设置为覆盖与 overwrite_ents
设置重叠的实体。
我有以下脚本使用模式来匹配邮政编码。但是,根据我提供邮政编码字符串的方式,似乎会影响它的匹配方式。
from spacy.pipeline import EntityRuler
import en_core_web_lg
nlp = en_core_web_lg.load()
patterns = [
{
"label": "POST_CODE", "pattern": [
{"TEXT": {"REGEX": r'^[a-zA-Z]{2}\d{1,2}[a-zA-Z]?$'}},
{"TEXT": {"REGEX": r'^\d[a-zA-Z]{2}$'}}
]
}
]
ruler = nlp.add_pipe("entity_ruler", config={"validate": True})
ruler.add_patterns(patterns)
def get_entities(text):
entTypes = []
doc = nlp(text)
for entity in doc.ents:
x = {}
x[entity.label_] = entity.text
entTypes.append(x)
return {"entities": entTypes}
if __name__ == '__main__':
import sys
print(get_entities(sys.argv[1]))
样本:
python test.py "this is a test RH15 9XR"
{'entities': [{'CARDINAL': '9XR'}]}
python test.py "this is a test RH15 9XR, RH4 9GG"
{'entities': [{'CARDINAL': '9XR'}, {'POST_CODE': 'RH4 9GG'}]}
python test.py "this is a test RH15 9XR, RH4 9GG, RH5 0XE"
{'entities': [{'CARDINAL': '9XR'}, {'POST_CODE': 'RH4 9GG'}, {'POST_CODE': 'RH5 0XE'}]}
python test.py "this is a test RH15 9XR, RH4 9GG, RH5 0XE PO01 0IO"
{'entities': [{'CARDINAL': '9XR'}, {'POST_CODE': 'RH4 9GG'}, {'CARDINAL': '0XE'}, {'CARDINAL': '0IO'}]}
由于某种原因,第一个邮政编码似乎从未匹配过。在最后一个示例中,“RH5 0XE”和“PO01 0IO”都应该匹配,正如您可以看到在前面的 运行.
中匹配的“RH5 0XE”关于如何提高匹配率有什么想法吗?
谢谢
马克
如果你 运行 使用 re 而不是通过 spacy 的正则表达式是否有效?
我认为您没有在您的正则表达式中正确处理空格或字符串结尾/字符串开头的情况——您的测试有效的所有示例附近都有逗号,而失败的示例周围的逗号较少
将 entity_ruler
放在管道中的 ner
之前,这样它的匹配优先于 ner
的 CARDINAL
范围,或者您可以将其设置为覆盖与 overwrite_ents
设置重叠的实体。