与使用字典检测实体类似,您可以使用正则表达式模式匹配来检测实体。
正则表达式未在诸如字典之类的文件中提供,而是在正则表达式配置中提供在内存中。 可以在同一抽取期间使用多个正则表达式配置。
使用 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 指示是否仅根据记号边界匹配正则表达式。 指定为具有 min 和 max 属性的字典对象。 |
否 (返回输入文本中每个字符位置的最长非重叠匹配项) |
token_boundary.max |
整数 | max 是 token_boundary 的可选属性,当边界需要扩展某个范围 (介于 min 和 max 标记之间) 时需要此属性。 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"
}
}
]
},
...
}
父主题: 创建您自己的模型