【问题标题】:How to match number and text in same token - Spacy Matcher?如何在同一个令牌中匹配数字和文本 - Spacy Matcher?
【发布时间】:2020-04-06 22:45:27
【问题描述】:

我有以下句子,我想从中提取 '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]。

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

任何建议表示赞赏。谢谢

【问题讨论】:

  • 你只需要时间吗?
  • 不,这只是一个例子。我正在寻找的模式是识别一个数字后跟两个不带空格的字符。例如。 12am 或 100CR 或 20cm

标签: python nlp spacy


【解决方案1】:

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

使用正则表达式

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

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

如果是这样,您可以修改它以排除空格。

这是一个活生生的例子: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]+"}}]

请记住,如果数字和度量类型之间有空格,spacy 将分成两个标记。这就是模式的正则表达式不涉及空格的原因。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多