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 之前,这样它的匹配优先于 nerCARDINAL 范围,或者您可以将其设置为覆盖与 overwrite_ents 设置重叠的实体。