数据清洗在RAG中至关重要,是RAG不可或缺的工作。通常通过移除无关或噪声数据、规范化文本、去重和处理缺失值等数据清洗步骤来提升RAG的效果。这样不仅提升了检索和生成结果的准确性和质量,还减少了计算资源的消耗,从而提高了系统效率和用户体验。本节主要介绍目前常用的数据清洗方法。
首先我们需要确定数据来源,如.txt、PDF、网页爬取等。不同的数据来源,数据的收集方法各不相同,但本质上都是解析并提取相关数据。LangChain上也有大量对不同数据进行解析的相关方法,下面会结合LangChain列举一些示例,便于你更好地理解。
在Python中读取文本文件(.txt文件)时,我们可以直接使用open()函数和read()方法。具体步骤是,使用open(file_path,'r')打开指定路径的文件,并使用with语句确保文件在使用完毕后自动关闭。file.read()方法会将整个文件的内容作为一个字符串返回,然后你可以对这个字符串进行进一步处理或打印。
我们可以使用LangChain方法,将PDF文件加载到文档数组中,其中每个文档包含页面内容和带有编号的页面元数据。
解析不同网页的方法有许多种,Python也支持多种Python库,如requests、BeautifulSoup(bs4)、Selenium等,当然现在也有许多针对LLM的网页解析工具,如AsyncHtmlLoader、Jina。
(1)requests
requests是一个简单而优雅的HTTP库,用于发送HTTP请求。它允许你发送HTTP请求(如GET和POST)并获取响应的内容。requests可以轻松地从网页获取HTML内容,通常用于获取静态网页内容或通过API获取数据。
(2)BeautifulSoup
BeautifulSoup是一个用于解析HTML和XML文档的库,它可以帮助你从网页中提取数据。它能够将复杂的HTML文档转换成一个Python对象的层次结构,每个节点都是Python对象。BeautifulSoup能够处理从requests获取的HTML内容,帮助你按照标签、类名、id等准确定位和提取所需数据。
(3)AsyncHtmlLoader
AsyncHtmlLoader是LangChain中的一个工具,它使用aiohttp发出异步HTTP请求,适用于更简单、轻量级的抓取。
(4)Jina
目前Jina是免费使用的,它可以直接返回解析好的网页内容 。 在需要解析的网页URL前加上“https://r.jina.ai/”,即可返回对应的符合LLM输入的网页内容。例如,若需提取网页的URL是“http://example.com”,那么使用request请求“https://r.jina.ai/http://example.com”即可。
当需要去除特殊字符和标点符号时,我们可以使用Python中的正则表达式来去除所有非字母和数字的字符。
值得注意的是,在处理中文文本时,清除特殊字符和标点符号的过程与处理英文文本的过程有所不同,因为中文中存在许多特殊字符和标点符号。
1)英文文本处理:
2)中文文本处理:
对于直接请求的网页内容,有时会包含大量的网页HTML标签。如果将这些标签直接输入LLM,一方面会增加数据的噪声,影响生成质量;另一方面会增加token的成本。因此,我们需要对这些无意义的标签进行简单的清洗。可以使用LangChain提供的HTML2Text来实现这一目的。HTML2Text可以直接将HTML内容转换为纯文本(类似Markdown的格式),不需要进行任何特定的标签操作。通常,它与AsyncHtmlLoader配合使用。
对于英文的文本,可以将文本统一转化为小写,以简化匹配过程,使搜索更加准确和高效。
停用词 通常是一些常见且在语境中没有特定含义的词,如“的”“是”等。在文本标准化过程中,去除停用词有助于减少噪声,提高文本特征的质量。下面是两个去除停用词的示例。
假设我们有一个中文文本列表chinese_text_list,以及一个中文停用词列表stopwords_chinese。
假设我们有一个英文文本列表english_text_list,以及一个英文停用词列表stopwords_english。
文本分词的过程至关重要,因为它为后续的数据挖掘、主题提炼、情感分析以及文档归类等任务奠定了基础。特别是在中文语境中,由于句子构造不同于英文(英文单词之间有自然的空格分隔),中文分词相比英文分词更为重要且复杂。文本分词的主要方法有jieba和TF-IDF等。
当涉及中文文本处理时,jieba和TF-IDF是两种非常常用的方法。
jieba是一个流行的中文文本分词工具,它可以将中文文本切分成有意义的词语。以下是使用jieba的基本方法:
在这个例子中,jieba.cut()方法接收一个字符串作为输入,并返回一个生成器,生成分词后的结果。
jieba的其他功能列举如下:
❍添加自定义词典:可以通过jieba.load_userdict(file_name)加载用户自定义词典。
❍关键词提取:使用jieba.analyse.extract_tags(text)提取关键词。
TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率) 是一种常用于信息检索与文本挖掘的加权技术,用以评估词语在文档集或语料库的特定文档中的重要程度。在文本处理中,TF-IDF常用于关键词提取、文档相似度计算等任务。在Python中,可以使用scikit-learn库来计算TF-IDF值。
以上是数据清洗的一些常见操作,前期数据的清洗对RAG至关重要,是RAG不可或缺的环节。