与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 0无力偿贷;应该匹配,正如您所看到的"RH5 0XE">

对于如何提高匹配率有什么想法吗?

感谢

标记

entity_ruler放在管道中的ner之前,以便其匹配优先于nerCARDINAL跨度,或者您可以将其设置为覆盖与overwrite_ents设置重叠的实体。

如果你用re而不是通过空格运行正则表达式,它工作吗?

我认为你没有处理空格或字符串结束/字符串开始的情况在你的正则表达式正确-所有的例子,你的测试工作有逗号附近,而失败的例子有较少的逗号周围

最新更新