如何匹配相同标记中的数字和文本 - Spacy Matcher?

How to match number and text in same token - Spacy Matcher?

我有以下句子,我想从中提取 '12am'

He is working at 12am

我正在使用 Spacy Matcher(语言模型 en_core_web_lg),它将文本分成以下标记:

[He] [is] [working] [at] [12am]

我试过的模式是:

[{ "LIKE_NUM": true }, {"IS_SPACE": false}, { "LOWER": "am" }],
[{ "LIKE_NUM": true , "LOWER": "am" }],
[{ "SHAPE": 'dd' , "ORTH": "am" }]

到目前为止没有任何效果。基本上因为令牌是 [12am].

我需要帮助来创建匹配模式:

任何建议表示赞赏。谢谢

无需为此使用 spaCy,您可以使用简单的正则表达式。但是,如果您想使用 spaCy,我将在下面介绍如何使用 spaCy 匹配器正则表达式功能。

使用正则表达式

模式:[0-9]+[,.]?[0-9]+[ ]?[A-Za-z]+

解释:您查找任何重复的 1+ 个字符 ([0-9]+)。然后是可选的点、逗号 ([.]?) 和其他字符 ([0-9]+)。然后,有一个可选的白色 space([ ]?) 后跟大写或小写字符 ([A-Za-z]+).

您可以修改它以排除白色 spaces,如果是您的情况。

这是一个活生生的例子:https://regex101.com/r/HmTKD7/1

在python中:

import re
pattern = r'[0-9]+[,.]?[0-9]+[ ]?[A-Za-z]+'
results = re.findall(pattern, text)

使用 spaCy 匹配器:

在 spaCy 中,您可以执行以下匹配器:

pattern = [{"TEXT": {"REGEX": "[0-9]+[,.]?[0-9]+[A-Za-z]+"}}]

请记住,如果数字和度量类型之间有白色space,spacy 将分成两个标记。这就是为什么该模式的正则表达式不涉及白色 space.

目前无法在 https://explosion.ai/demos/matcher 中使用 REGEX 进行现场演示,但 REGEX 自 v2.1 以来就在 spaCy 匹配器中。