当前位置: 首页 > news >正文

深入解析Dify中的文本清洗处理器:CleanProcessor详解

深入解析Dify中的文本清洗处理器:CleanProcessor详解

    • 一、CleanProcessor概述
    • 二、代码结构分析
    • 三、核心功能详解
      • 1. 基础清洗(默认清洗)
      • 2. 规则化处理
        • 2.1 移除多余空格(remove_extra_spaces)
        • 2.2 移除URL和邮箱(remove_urls_emails)
    • 四、处理流程分析
    • 五、技术亮点
      • 1. 正则表达式的巧妙应用
      • 2. 闭包在正则替换中的应用
      • 3. 配置驱动的处理逻辑
    • 六、应用场景

在构建RAG(检索增强生成)系统时,文本预处理是一个至关重要的环节。今天我们来深入分析Dify项目中的CleanProcessor类,这是一个专门用于文本清洗的处理器,它能够根据配置规则对文本进行预处理,为后续的向量化和检索做好准备。

一、CleanProcessor概述

CleanProcessor类位于dify/api/core/rag/cleaner/clean_processor.py文件中,是Dify项目RAG系统的核心组件之一。它主要负责根据预定义的规则对文本进行清洗和预处理。

二、代码结构分析

import reclass CleanProcessor:@classmethoddef clean(cls, text: str, process_rule: dict) -> str:# default clean# remove invalid symboltext = re.sub(r"<\|", "<", text)text = re.sub(r"\|>", ">", text)text = re.sub(r"[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\xEF\xBF\xBE]", "", text)# Unicode  U+FFFEtext = re.sub("\ufffe", "", text)rules = process_rule["rules"] if process_rule else {}if "pre_processing_rules" in rules:pre_processing_rules = rules["pre_processing_rules"]for pre_processing_rule in pre_processing_rules:if pre_processing_rule["id"] == "remove_extra_spaces" and pre_processing_rule["enabled"] is True:# Remove extra spacespattern = r"\n{3,}"text = re.sub(pattern, "\n\n", text)pattern = r"[\t\f\r\x20\u00a0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]{2,}"text = re.sub(pattern, " ", text)elif pre_processing_rule["id"] == "remove_urls_emails" and pre_processing_rule["enabled"] is True:# Remove emailpattern = r"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)"text = re.sub(pattern, "", text)# Remove URL but keep Markdown image URLs# First, temporarily replace Markdown image URLs with a placeholdermarkdown_image_pattern = r"!\[.*?\]\((https?://[^\s)]+)\)"placeholders: list[str] = []def replace_with_placeholder(match, placeholders=placeholders):url = match.group(1)placeholder = f"__MARKDOWN_IMAGE_URL_{len(placeholders)}__"placeholders.append(url)return f"![image]({placeholder})"text = re.sub(markdown_image_pattern, replace_with_placeholder, text)# Now remove all remaining URLsurl_pattern = r"https?://[^\s)]+"text = re.sub(url_pattern, "", text)# Finally, restore the Markdown image URLsfor i, url in enumerate(placeholders):text = text.replace(f"__MARKDOWN_IMAGE_URL_{i}__", url)return textdef filter_string(self, text):return text

三、核心功能详解

1. 基础清洗(默认清洗)

无论是否提供了处理规则,CleanProcessor都会执行以下基础清洗操作:

# 移除特殊标记
text = re.sub(r"<\|", "<", text)
text = re.sub(r"\|>", ">", text)
# 移除控制字符和特殊Unicode字符
text = re.sub(r"[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\xEF\xBF\xBE]", "", text)
# 移除Unicode U+FFFE字符
text = re.sub("\ufffe", "", text)

这些操作主要是为了:

  • 移除可能干扰文本处理的特殊标记(如<||>
  • 清除不可见的控制字符(ASCII码0-31范围内的字符)
  • 移除特殊的Unicode字符(如U+FFFE,这是一个非法的Unicode字符)

2. 规则化处理

CleanProcessor支持根据配置的规则进行更复杂的文本处理。目前实现了两种预处理规则:

2.1 移除多余空格(remove_extra_spaces)

当启用此规则时,会执行以下操作:

# 将3个或更多连续的换行符替换为2个换行符
pattern = r"\n{3,}"
text = re.sub(pattern, "\n\n", text)
# 将2个或更多连续的空白字符(包括各种Unicode空白)替换为1个空格
pattern = r"[\t\f\r\x20\u00a0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]{2,}"
text = re.sub(pattern, " ", text)

这个规则的目的是:

  • 规范化文本中的空行(最多保留一个空行)
  • 将连续的空白字符(包括制表符、换页符、回车符和各种Unicode空白字符)替换为单个空格
2.2 移除URL和邮箱(remove_urls_emails)

当启用此规则时,会执行以下操作:

# 移除邮箱地址
pattern = r"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)"
text = re.sub(pattern, "", text)# 移除URL但保留Markdown图片URL

这个规则的处理逻辑比较复杂,特别是在处理URL时:

  1. 首先识别并保存Markdown格式的图片URL
  2. 然后移除所有其他URL
  3. 最后恢复之前保存的Markdown图片URL

这样做的目的是保留文档中的图片引用,同时移除其他可能不相关的URL链接。

四、处理流程分析

整个文本清洗的流程可以概括为:

  1. 输入:原始文本和处理规则配置
  2. 基础清洗:移除特殊标记和控制字符
  3. 规则处理:根据配置的规则进行特定处理
    • 如果启用了remove_extra_spaces,则规范化空白字符
    • 如果启用了remove_urls_emails,则移除邮箱和URL(保留Markdown图片URL)
  4. 输出:返回处理后的文本

五、技术亮点

1. 正则表达式的巧妙应用

CleanProcessor大量使用了正则表达式来处理文本,这些正则表达式设计得非常精巧:

  • 使用字符类[\x00-\x08\x0B\x0C\x0E-\x1F\x7F\xEF\xBF\xBE]匹配各种控制字符
  • 使用[\t\f\r\x20\u00a0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]匹配各种空白字符,包括Unicode空白
  • 使用([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)匹配邮箱地址
  • 使用!\[.*?\]\((https?://[^\s)]+)\)匹配Markdown格式的图片URL

2. 闭包在正则替换中的应用

在处理Markdown图片URL时,使用了一个内部函数和闭包来保存匹配到的URL:

def replace_with_placeholder(match, placeholders=placeholders):url = match.group(1)placeholder = f"__MARKDOWN_IMAGE_URL_{len(placeholders)}__"placeholders.append(url)return f"![image]({placeholder})"text = re.sub(markdown_image_pattern, replace_with_placeholder, text)

这种方式允许在正则替换的过程中收集和保存匹配到的信息,非常巧妙。

3. 配置驱动的处理逻辑

整个清洗过程是由配置驱动的,这使得系统非常灵活:

rules = process_rule["rules"] if process_rule else {}
if "pre_processing_rules" in rules:pre_processing_rules = rules["pre_processing_rules"]for pre_processing_rule in pre_processing_rules:if pre_processing_rule["id"] == "remove_extra_spaces" and pre_processing_rule["enabled"] is True:# 处理逻辑...

用户可以通过配置来启用或禁用特定的处理规则,而不需要修改代码。

六、应用场景

CleanProcessor在Dify项目中主要用于以下场景:

  1. 数据集导入:在导入文档到数据集时,对文本进行预处理
  2. 文本分段前的清洗:在将文本分割成段落前,先进行清洗以提高分段质量
  3. 向量化前的标准化:在生成文本向量前,对文本进行标准化处理

完结!

相关文章:

  • NSIS打包
  • 数据存储与安全保障双重buff叠满!极空间NAS『病毒查杀』功能上线,如何妙用?
  • Unity-Shader详解-其二
  • STM32 开发 - stm32f10x.h 头文件(内存映射、寄存器结构体与宏、寄存器位定义、实现点灯案例)
  • DAM-3B,英伟达推出的多模态大语言模型
  • 正确应对监管部门的数据安全审查
  • KEPServerEX 6与西门子1500PLC进行OPC通讯
  • 搜广推校招面经八十二
  • 代码随想录打卡|Day28 动态规划(理论基础、斐波那契数列、爬楼梯、使用最小花费爬楼梯)
  • Pycharm 代理配置
  • 【C】初阶数据结构13 -- 快速排序
  • 【Pandas】pandas DataFrame rmul
  • IP数据报发送和转发的过程
  • c语言知识整理
  • LLaMa Factory大模型微调
  • 机器学习——朴素贝叶斯法运用
  • 小白如何学会完整挪用Github项目?(以pix2pix为例)
  • Android Compose 框架矢量图标深入剖析(七)
  • compose 二维码扫描qrcode
  • Swift与iOS内存管理机制深度剖析
  • “五一”逃离城市计划:带上帐篷去大自然里充电
  • 特朗普加征关税冲击波:美国零售、汽车、航空、科技企业纷纷预警业绩波动
  • 铁路上海站今日预计发送旅客65.8万人次,同比增长超16%
  • 浙商银行一季度净赚超59亿微增0.61%,非息净收入降逾22%
  • 年轻人的事业!6家上海人工智能企业畅想“模范生”新征程
  • 美国通过《删除法案》:打击未经同意发布他人私密图像,包括“深度伪造”