基于空规则的匹配未按预期返回匹配

我正在尝试按日期对日期字符串进行匹配,并且两个部分分别匹配,但组合结果未返回匹配。

rule_patterns = [

    {
        "label": "DATE_COMBINED","pattern": [
            {'TEXT': {"REGEX": "^[0-9](st|nd|rd|th)",'LENGTH': 3}},{'POS': 'PROPN'},{'IS_PUNCT': True,'OP': '?'},{'IS_DIGIT': True}
        ]
    },{
        "label": "DATE_TEXT","pattern": [
            {'POS': 'PROPN'},{
        "label": "DATE_NUM",'LENGTH': 3}}
            ]
    },]

nlp = spacy.load("en_core_web_sm",disable=["ner"]) 
ruler = EntityRuler(nlp)
matcher = Matcher(nlp.vocab)
ruler.add_patterns(rule_patterns)
nlp.add_pipe(ruler)

doc = nlp(text) 
for ent in doc.ents:
  print(ent.text,ent.label_)

要匹配的字符串是

  

2013年1月4日

运行的输出是

4th DATE_NUM
January,2013 DATE_TEXT

我做错了任何事情,都无法在DATE_COMBINED上找到比赛

更新 我注意到当我打印所有令牌时,也将4月和1月之间的空间也视为令牌。

[
            {'TEXT': {"REGEX": "^[0-9]{1,2}(st|nd|rd|th)$",{"IS_SPACE": True},{'IS_DIGIT': True}
        ]

这有效

lienzhangyubo 回答:基于空规则的匹配未按预期返回匹配

4thJanuary之间的空格是不间断的空格\x0A

最简单的解决方案是将这些空间归一化为常规空间:

text = text.replace("\xA0"," ")

否则,您可以在模式规则中添加{'IS_SPACE': True,'OP': '?'}以匹配可选非令牌分割空白:

"label": "DATE_COMBINED","pattern": [
     {'TEXT': {"REGEX": "^[0-9]+(?:st|[nr]d|th)$",'LENGTH': 3}},{'IS_SPACE': True,'OP': '?'},{'POS': 'PROPN'},{'IS_PUNCT': True,{'IS_DIGIT': True}
]

请注意,第一个^[0-9]+(?:st|[nr]d|th)$模式现在在末尾包含$,以便将标记作为完整字符串进行匹配($与字符串的末尾匹配)并表示:

  • ^-令牌的开始
  • [0-9]+-1个或更多数字
  • (?:st|[nr]d|th)-stnr,后跟dth子字符串
  • $-字符串的结尾。
本文链接:https://www.f2er.com/3137878.html

大家都在问