Rasa实体提取异常求助:RegexEntityExtractor识别结果不符合预期
问题解决方法
核心问题分析
输入「Boston High School」时,RegexEntityExtractor会优先匹配lookup表中的「Boston」并标记为location实体,而DIETClassifier虽能正确识别整个短语为highschool,但受管道顺序影响,实体结果被前者覆盖。此外,use_word_boundaries=True的配置让RegexEntityExtractor仅匹配独立的城市词,无法区分城市是作为学校名称一部分还是独立地址的场景。
具体解决方案
1. 调整管道组件顺序,让DIET优先识别实体
将DIETClassifier移至RegexEntityExtractor之前,利用DIET的上下文理解能力优先处理实体,避免规则匹配干扰上下文相关的实体识别。修改后的pipeline配置如下:
pipeline: - name: WhitespaceTokenizer - name: RegexFeaturizer - name: LexicalSyntacticFeaturizer - name: CountVectorsFeaturizer - name: CountVectorsFeaturizer analyzer: char_wb min_ngram: 1 max_ngram: 4 - name: DIETClassifier epochs: 100 constrain_similarities: true - name: RegexEntityExtractor case_sensitive: False use_lookup_tables: True use_regexes: False use_word_boundaries: True overwrite_entities: false # 禁止覆盖已识别的实体 - name: EntitySynonymMapper - name: ResponseSelector epochs: 100 constrain_similarities: true - name: FallbackClassifier threshold: 0.3 ambiguity_threshold: 0.1
2. 禁止RegexEntityExtractor覆盖已识别实体
添加overwrite_entities: false配置,确保Regex匹配到的location不会覆盖DIET已经识别的highschool实体。
3. 优化lookup表的匹配规则
针对location的lookup表,添加负向断言的正则规则,排除城市名后紧跟学校相关词汇的情况。例如,在NLU配置中新增location专属正则:
- regex: location_exclude_school examples: | - \b(Boston)\b(?! High School) - \b(Georgia)\b(?! High School|city school)
同时将RegexEntityExtractor的use_regexes设为True,启用自定义正则过滤误匹配场景。
4. 补充训练数据强化模型区分能力
在NLU.yml的provide_details意图中添加更多对比示例,让模型明确区分城市作为独立地址和作为学校名称一部分的场景:
- intent: provide_details examples: | - [Boston](location) is a city - [Boston High School](highschool) is a school - [Georgia](location) is a state - [Georgia city school](highschool) is a school
内容的提问来源于stack exchange,提问作者Yash Patel
相关产品推荐
相关产品推荐

