0 / 0
Go back to the English version of the documentation
检测具有正则表达式的实体
Last updated: 2024年7月29日
检测具有正则表达式的实体

与使用字典检测实体类似,您可以使用正则表达式模式匹配来检测实体。

正则表达式未在诸如字典之类的文件中提供,而是在正则表达式配置中提供在内存中。 可以在同一抽取期间使用多个正则表达式配置。

使用 Watson Natural Language Processing 定义的正则表达式可以使用令牌边界。 这样,您可以确保正则表达式在一个或多个标记中匹配。 与更简单的正则表达式引擎相比,这是一个明显的优势,尤其是当您使用不被空格分隔的语言 (如中文) 时。

正则表达式由称为 "基于规则的运行时" (简称 RBR) 的专用组件进行处理。

创建正则表达式配置

首先在 Notebook 中创建模块目录。 这是笔记本文件系统中的一个目录,用于临时存储 RBR 训练所创建的文件。 此模块目录可以是您创建并用于基于字典的实体抽取的同一目录。 可以在同一训练运行中使用字典和正则表达式。

要在 Notebook 中创建模块目录,请在代码单元格中输入以下内容。 请注意,模块目录不能包含短划线 (-)。

import os
import watson_nlp
module_folder = "NLP_RBR_Module_2"
os.makedirs(module_folder, exist_ok=True)

正则表达式配置是具有以下属性的 Python 字典:

正则表达式配置中的可用属性及其值,使用描述和指示 (如果需要或不需要)
属性 描述 必需
name 字符串 正则表达式的名称。 输入文本中正则表达式的匹配项在输出中使用此名称进行标记。
regexes list (基于 perl 的正则表达式模式的字符串) 应该为非空。 可以提供多个正则表达式。
flags 有效标志的定界字符串 标志 (如 UNICODE 或 CASE_INSENSITIVE) 控制匹配。 也可以是标志的组合。 有关受支持的标志,请参阅 Pattern (Java Platform SE 8) 否 (缺省为 DOTALL)
token_boundary.min 整数 token_boundary 指示是否仅根据记号边界匹配正则表达式。 指定为具有 minmax 属性的字典对象。 否 (返回输入文本中每个字符位置的最长非重叠匹配项)
token_boundary.max 整数 maxtoken_boundary 的可选属性,当边界需要扩展某个范围 (介于 minmax 标记之间) 时需要此属性。 token_boundary.max 需要为 >= token_boundary.min 否 (如果指定了 token_boundary ,那么可以单独指定 min 属性)
groups list (匹配组的字符串标签) 列表中的字符串索引对应于模式中的匹配组,从 1 开始,其中 0 索引对应于整个匹配。 例如: regex: (a)(b) on ab with group: ['full', 'first', 'second'] 将生成 full: ab, first: a, second: b 否 (缺省为完全匹配时的标签匹配)

可以使用以下帮助程序方法来装入正则表达式配置:

  • 要装入单个正则表达式配置,请使用 watson_nlp.toolkit.RegexConfig.load(<regex configuration>)
  • 要装入多个正则表达式配置,请使用 watson_nlp.toolkit.RegexConfig.load_all([<regex configuration>)])

代码样本

此样本显示如何装入两个不同的正则表达式配置。 第一个配置会检测人员姓名。 它使用 groups 属性以允许在稍后阶段轻松访问完整的名字,名字和姓氏。

第二个配置将首字母缩略词检测为全大写字符序列。 通过使用token_边界属性,它将阻止包含大写和小写字符的词中的匹配。

from watson_nlp.toolkit.rule_utils import RegexConfig

# Load some regex configs, for instance to match First names or acronyms
regexes = RegexConfig.load_all([
    {
        'name': 'full names',
        'regexes': ['([A-Z][a-z]*) ([A-Z][a-z]*)'],
        'groups': ['full name', 'first name', 'last name']
    },
    {
        'name': 'acronyms',
        'regexes': ['([A-Z]+)'],
        'groups': ['acronym'],
        'token_boundary': {
            'min': 1,
            'max': 1
        }
    }
])

训练包含正则表达式的模型

装入正则表达式配置后,使用 RBR.train() 方法创建 RBR 模型。 在该方法中,指定:

  • 模块目录
  • 文本的语言
  • 要使用的正则表达式配置

这是用于通过基于字典的抽取来训练 RBR 的相同方法。 您可以在同一方法调用中传递字典配置。

代码样本

# Train the RBR model
custom_regex_block = watson_nlp.resources.feature_extractor.RBR.train(module_path=module_folder, language='en', regexes=regexes)

在新数据上应用模型

在训练完字典之后,使用 run() 方法对新数据应用模型,就像在任何现有预训练的块上使用一样。

代码样本

custom_regex_block.run('Bruce Wayne works for NASA')

代码示例的输出:

{(0, 11): ['regex::full names'], (0, 5): ['regex::full names'], (6, 11): ['regex::full names'], (22, 26): ['regex::acronyms']}

显示匹配子组或匹配文本:

import json
# Get the raw response including matching groups
full_regex_result = custom_regex_block.executor.get_raw_response('Bruce Wayne works for NASA‘, language='en')
print(json.dumps(full_regex_result, indent=2))

代码示例的输出:

{
  "annotations": {
    "View_full names": [
      {
        "label": "regex::full names",
        "fullname": {
          "location": {
            "begin": 0,
            "end": 11
          },
          "text": "Bruce Wayne"
        },
        "firstname": {
          "location": {
            "begin": 0,
            "end": 5
          },
          "text": "Bruce"
        },
        "lastname": {
          "location": {
            "begin": 6,
            "end": 11
          },
          "text": "Wayne"
        }
      }
    ],
    "View_acronyms": [
      {
        "label": "regex::acronyms",
        "acronym": {
          "location": {
            "begin": 22,
            "end": 26
          },
          "text": "NASA"
        }
      }
    ]
  },
...
}

父主题: 创建您自己的模型

Generative AI search and answer
These answers are generated by a large language model in watsonx.ai based on content from the product documentation. Learn more