如何在Rasa中利用正则表达式特征检测电话号码、合同ID等实体?
嘿,我刚好在项目里用过Rasa的正则特征来处理电话号码、合同ID这类实体,给你捋清楚怎么操作~
1. 先定义正则表达式(对应教程里的zipcode示例)
首先在nlu.yml里给每个要识别的实体创建对应的正则规则,覆盖这类实体的所有可能格式:
nlu: - regex: phone_number examples: | - \d{3}-\d{3}-\d{4} - \(\d{3}\)\s\d{3}-\d{4} - \d{10} - regex: contract_id examples: | - C-\d{6} - CONTRACT-\d{8} - CT-\d{4}-\d{4}
这里的regex:后面是你给正则起的标识名,examples:下面就是该实体对应的各种格式的正则模式,每个模式前加-即可。
2. 把正则和实体关联起来(教程里没写的关键部分)
接下来要让Rasa知道这些正则对应的是哪个实体,核心是在训练数据里标注实体示例,让模型把正则模式和实体类型关联起来。
在nlu.yml里添加带实体标注的训练样本:
nlu: # 上面的正则定义继续保留 - intent: request_contract_details examples: | - Can you look up my contract *C-123456*[contract_id]? - My phone number is *555-789-0123*[phone_number] - I need help with *CONTRACT-87654321*[contract_id] - Call me at *(555) 123-4567*[phone_number]
这里的*实体内容*[实体名称]是Rasa的实体标注格式,实体名称要和你后续在domain.yml里定义的实体名保持一致。
3. 配置Pipeline让正则生效
确保你的config.yml里包含RegexFeaturizer组件,它会把你定义的正则转换成模型能理解的特征,辅助实体识别。一般默认Pipeline里已经有这个组件,但最好明确写出来:
language: zh # 中文场景用zh,英文用en pipeline: - name: WhitespaceTokenizer - name: RegexFeaturizer # 关键组件:提取正则特征 - name: LexicalSyntacticFeaturizer - name: CountVectorsFeaturizer - name: CountVectorsFeaturizer analyzer: char_wb min_ngram: 1 max_ngram: 4 - name: DIETClassifier epochs: 100
RegexFeaturizer会扫描输入文本,一旦匹配到你定义的正则(比如匹配到电话号码格式),就会给模型传递信号:“这里大概率是phone_number实体”,结合你标注的训练数据,模型就能精准识别这类格式固定的实体。
额外选项:直接用正则提取实体(无需模型学习)
如果你的实体格式绝对固定,不需要模型泛化,也可以用RegexEntityExtractor直接通过正则匹配提取实体,不用依赖DIET模型。只需要在Pipeline里添加这个组件:
pipeline: # ... 其他组件 - name: RegexEntityExtractor case_sensitive: False # 是否区分大小写,按需设置 use_regexes: True # 启用正则匹配
这种方式适合完全标准化的实体,比如合同ID只有C-xxxxxx这一种格式,不需要模型猜测,直接匹配就行。
关于教程里的zipcode例子
教程里的zipcode正则,其实是和上面的逻辑一致:先定义了zipcode的正则,然后在训练数据里标注了zipcode实体的例子,RegexFeaturizer把正则作为特征,帮助DIETClassifier识别zipcode实体,只是教程省略了训练数据和Pipeline配置的细节,导致你没看到完整关联过程。
总结一下,核心就是正则定义+实体标注+Pipeline配置这三步,就能让Rasa利用正则精准识别电话号码、合同ID这类实体啦~
内容的提问来源于stack exchange,提问作者Daneel

