一文讲清楚人工智能自然语言处理中的数据预处理(数据清洗)
根据特定领域的术语或特定的数据集特性,可能需要开发自定义的预处理规则。在以上方法中,我只挑选了部分比较常用且重要的方法进行了详细地分析和讲解并分别给出了代码示例便于大家进一步理解或者运用。数据预处理是NLP任务成功的基础,它有助于提高模型的性能和准确性。预处理步骤的选择和实现取决于具体的应用场景和数据特性。在实际应用中,可能需要结合多种预处理技术来达到最佳效果。
一、定义
在自然语言处理(NLP)中,数据预处理,又可称数据清洗,是指将原始文本数据转换成适合机器学习模型处理的格式的过程。
二、实例讲解
上面的定义阐述有些僵硬吧,笔者思考了好久,给出下面这个极其生动简单的例子:
如果把人工智能算法比作做饭的过程,大家伙的在做饭前需要把食材准备好吧,那么这个食材也就是我们在人工智能算法中的样本数据集,准备好食材之后呢?当然就是清洗食材了,如果食材未经清洗或者清洗不到位的话,一是可能影响口感(算法效率低下),二是可能导致我们坏肚子或者生病(模型偏离或者拟合预测效果较差),所以对于这个清洗的过程,我们需要细心谨慎。
当然了,对于不同的食材我们可能会采用不同的清洗方式,也就是说,对于不同结构的数据样本我们选取的数据处理方法也可能会不同,比如说对于某些蔬菜我们需要用水清洗,然后切成小段,但是对于豆豉,酸菜之类的食材我想没有人会用水清洗它吧,因此不同形式的数据样本往往采取的是不同数据处理方法的组合。
还有,我们对于面粉之类的食材一般没有人生啃吧,是需要对其进行醒面发酵之后才能被我们用作完美的食材,所以这个过程也就涉及食材的转化,也就是说,我们的样本数据也可能会利用一些方法进行适当的转化从而被我们更好地用来训练模型。
三、NLP数据预处理常见方式
以下是我总结的,NLP中常见的数据预处理步骤:
1. 去除无关字符 :
- 去除文本中的无关字符、特殊符号、HTML标签、URLs、电子邮件地址等。
代码示例:
在Python中,你可以使用正则表达式(通过re
模块)来去除文本中的无关字符、特殊符号、HTML标签、URLs和电子邮件地址。因为相比手写的python函数清洗去除,正则表达式表现的更灵活和强大,特别是对于复杂的HTML标签和各种URL格式。
import re
def clean_text(text):
# 去除HTML标签
text = re.sub(r'<[^>]+>', '', text)
# 去除URLs
text = re.sub(r'https?://\S+|www\.\S+', '', text)
# 去除电子邮件地址
text = re.sub(r'\S+@\S+', '', text)
# 去除特殊符号和数字(根据需要调整)
text = re.sub(r'[^\w\s]', '', text)
# 去除多余的空格
text = re.sub(r'\s+', ' ', text).strip()
return text
# 示例文本
text = "这是一个文本,高考加油!其中包含URL: https://www.example.com,电子邮件: example@example.com,以及HTML标签 <b>粗体</b>。"
# 清洗文本
cleaned_text = clean_text(text)
print(cleaned_text)
这段代码中的clean_text
函数执行以下操作:
- 使用
re.sub
函数和正则表达式<[^>]+>
去除HTML标签。 - 使用正则表达式
https?://\S+|www\.\S+
去除URLs。 - 使用正则表达式
\S+@\S+
去除电子邮件地址。 - 使用正则表达式
[^\w\s]
去除特殊符号和数字(\w
匹配字母、数字及下划线,\s
匹配任何空白字符)。 - 使用正则表达式
\s+
去除多余的空格,并将连续的空格替换为单个空格,然后去除字符串首尾的空白字符。
但是请注意,这个示例可能不会涵盖所有可能的HTML标签或URL格式,大家可能需要根据各自的特定需求调整正则表达式。此外,去除特殊符号和数字的决定应基于你的文本数据和NLP任务的具体要求,意思是如果你的样本文本数据中没有相关清除对象,那么就不必要采取对应方法。
2. 文本规范化 :
- 包括将所有文本转换为统一的大小写(通常转换为小写),以及标准化文本中的日期、数字和货币单位。
代码示例:
import unicodedata
import datetime
# 将文本转换为小写
def to_lowercase(text):
return text.lower()
# 去除文本中的 accents (重音符号)
def remove_accents(text):
text = unicodedata.normalize('NFD', text)
return text.encode('ascii', 'ignore').decode('utf-8')
# 标准化日期格式
def standardize_dates(text):
# 这个函数仅用于演示,实际应用中可能需要更复杂的日期识别和转换逻辑
date_patterns = [
r'\b(\d{1,2}[-/]\d{1,2}[-/]\d{2,4})\b', # 简单的日期格式匹配,如DD/MM/YYYY或DD-MM-YYYY
]
for pattern in date_patterns:
text = re.sub(pattern, standardize_date, text)
return text
# 标准化数字格式
def standardize_numbers(text):
# 这个函数仅用于演示,实际应用中可能需要更复杂的数字识别和转换逻辑
number_patterns = [
r'\b(\d+)(st|nd|rd|th)\b', # 匹配数字后缀,如1st, 2nd, 3rd, 4th等
]
for pattern in number_patterns:
text = re.sub(pattern, lambda x: str(int(x.group(1))), text)
return text
# 示例文本
text = "I'll meet you on 7th June, 2024. It's a great opportunity!"
# 规范化文本
text = to_lowercase(text)
text = remove_accents(text)
text = standardize_dates(text) # 假设我们有一个标准日期函数
text = standardize_numbers(text) # 假设我们有一个标准数字函数
print(text)
请注意,这个示例中的standardize_dates
和standardize_numbers
函数仅用于演示目的,它们使用了简单的正则表达式来匹配日期和数字格式。在实际应用中,日期和数字的标准化可能需要更复杂的逻辑,可能涉及到使用正则表达式库(如dateutil
)来解析日期,或者使用数值识别库来转换数字,这些取决于你的需求,大家伙的一定要分清楚。
此外,remove_accents
函数使用了unicodedata
模块来去除文本中的重音符号,并将字符转换为ASCII编码。
3. 分词(Tokenization):
- 将文本分割成单词或短语,这是文本分析的基本步骤。
大家可以把这个分词的过程理解成我之前说的把蔬菜食材切小段的过程,一方面是为了便于"消化吸收",一方面是便于"翻炒"。
代码示例:
Python中很多很多库可以用于分词,其中最常用的是nltk
和spaCy
。以下是使用这两个库的分词示例代码:
使用 NLTK 分词(多用于英文)
import nltk
from nltk.tokenize import word_tokenize
# 确保已经下载了nltk的tokenizers资源
nltk.download('punkt')
# 示例文本
text = "This is an example sentence. NLP is fun!"
# 使用NLTK的word_tokenize进行分词
tokens = word_tokenize(text)
print(tokens)
使用 spaCy 分词(多用于英文)
import spacy
# 加载spaCy的英文模型
nlp = spacy.load('en_core_web_sm')
# 示例文本
text = "This is an example sentence. NLP is fun!"
# 使用spaCy进行分词
doc = nlp(text)
# 获取分词结果
tokens = [token.text for token in doc]
print(tokens)
手动分词示例(简单的空格分割)
如果你不想使用外部库,可以手动实现一个非常基础的分词器,例如基于空格的分词:
# 示例文本
text = "This is an example sentence. NLP is fun!"
# 简单的空格分词
tokens = text.split()
print(tokens)
家人们请注意,这些示例中的分词方法都是基于英文文本的。对于中文或其他不使用空格分隔单词的语言,需要使用适合该语言特性的分词工具,如对于中文,国内爆火的就是使用jieba
分词库。
jieba 分词(中文)
import jieba
# 示例中文文本
text = "自然语言处理是人工智能领域的一个重要方向。"
# 使用jieba进行分词
tokens = jieba.cut(text, cut_all=False)
print(" ".join(tokens))
jieba.cut
函数的cut_all
参数如果设置为False
,则采用精确模式进行分词,这通常能获得更好的分词效果。
分词是文本预处理的重要步骤,它直接影响到后续的词性标注、句法分析等任务的效果。在实际应用中,选择哪种分词方法取决于文本的语言和特性,以及具体的任务需求。
4. 去除停用词 :
- 停用词是指在文本中频繁出现但对分析意义不大的词,如“的”、“和”、“是”等。(可以用简单的python语言实现,这里不做过多解释。)
5. 词干提取(Stemming):
- 将单词还原为词根形式,例如将“running”转换为“run”。
6. 词形还原(Lemmatization):
- 将单词还原为其词典形式,例如将“better”转换为“good”。
对于这两个词形还原和词性标注我个人是更倾向于词性还原,因为我觉得词性还原更能体现样本的特征
7. 词性标注(Part-of-Speech Tagging):
- 为文本中的每个单词标注词性(名词、动词、形容词等)。
词性标注(Part-of-Speech Tagging),也称为POS标注,是自然语言处理中的一个任务,它涉及识别文本中每个单词的语法类别,如名,动词,形,副词(Adverb)等。
词性标注对于多种NLP任务非常重要,包括句法分析、信息抽取、情感分析等。以下是使用Python的nltk
库进行词性标注的代码:
import nltk
from nltk.tokenize import word_tokenize
# 确保已经下载了nltk的tokenizers资源
nltk.download('punkt')
# 示例文本
text = "The quick brown fox jumps over the lazy dog."
# 使用NLTK的word_tokenize进行分词
tokens = word_tokenize(text)
# 使用nltk进行词性标注
tagged_tokens = nltk.pos_tag(tokens)
print(tagged_tokens)
在这段代码中,word_tokenize
函数用于将文本分割成单词列表。然后,pos_tag
函数用于为这些单词分配词性标签。
nltk.pos_tag
函数返回的是一个单词和词性标签的元组列表,其中每个元组的第一个元素是单词,第二个元素是对应的词性标签。nltk
使用Penn Treebank POS标签集,这是一种广泛使用的词性标签集。
输出示例:
[('The', 'DT'), ('quick', 'JJ'), ('brown', 'JJ'), ('fox', 'NN'), ('jumps', 'VBZ'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN'), ('.', '.')]
在这个输出中,每个单词后面跟随的是一个词性标签,例如:
DT
代表冠词(Determiner)JJ
代表形容词(Adjective)NN
代表名词(Noun)VBZ
代表第三人称单数现在时动词(Verb)IN
代表介词(Preposition).
代表标点符号(Punctuation)
家人们请注意,词性标注可能需要考虑上下文信息,因此一些单词可能有多种词性标注。例如,"bear"既可以是名词也可以是动词。在我们实际应用中,词性标注的结果可以作为其他NLP任务的输入,例如句法分析或信息抽取。
8. 命名实体识别(Named Entity Recognition, NER):
- 识别文本中的特定实体,如人名、地点、组织等。
9. 依存句法分析:
- 分析文本中单词之间的依存关系,以理解句子结构。
10.句法分析(Parsing):
- 构建句子的语法树,以更深入地理解句子结构。
11. 特征提取:
- 将文本转换为模型可以处理的数值特征,常见的特征提取方法包括词袋模型(Bag of Words, BoW)、TF-IDF(Term Frequency-Inverse Document Frequency)和词嵌入(Word Embeddings)。
-
词袋模型(Bag of Words, BoW) :
词袋模型是一种简单直观的方法,它将文本表示为一个固定大小的向量,向量的每个维度对应词汇表中的一个词。文本中每个词的存在与否(通常是二进制)或词频(每个词出现的次数)被记录在这个向量中。
-
TF-IDF(Term Frequency-Inverse Document Frequency) :
TF-IDF是一种统计方法,用于评估单词对于一个文档集或一个语料库中的其中一份文档的重要性。它的主要思想是:如果某个单词在一篇文档中出现的频率高(Term Frequency,TF),并且在其他文档中很少出现(Inverse Document Frequency,IDF),则认为这个单词具有很好的类别区分能力。
-
词嵌入(Word Embeddings) :
词嵌入是将单词转换为向量的另一种方法,通常使用深度学习模型预先训练得到。这些向量捕捉了单词之间的语义关系,例如,“国王”和“女王”的词嵌入向量在向量空间中可能比“国王”和“椅子”更接近。
示例代码:
以下是使用scikit-learn
的CountVectorizer
和TfidfVectorizer
进行特征提取的代码:
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
# 示例文本数据
documents = [
"This is the first document.",
"This document is the second document.",
"And this is the third one.",
"Is this the first document?"
]
# 使用词袋模型
vectorizer = CountVectorizer()
X_bow = vectorizer.fit_transform(documents)
# 使用TF-IDF
tfidf_vectorizer = TfidfVectorizer()
X_tfidf = tfidf_vectorizer.fit_transform(documents)
# 查看转换后的向量
print(X_bow.toarray())
print(X_tfidf.toarray())
12.特征编码:
- 将分类数据转换为模型可以处理的格式,例如使用独热编码(One-Hot Encoding)或标签编码(Label Encoding)。
13.序列填充或截断:
- 在处理固定长度的序列模型(如某些类型的循环神经网络)时,可能需要填充或截断文本序列。
14.去除或替换敏感词汇:
- 根据需要去除或替换掉敏感词汇,如俚语、侮辱性语言或不当内容。
15.文本向量化:
- 使用词嵌入技术(如Word2Vec、GloVe或BERT)将文本转换为向量表示。
16. 文本数据增强:
- 通过同义词替换、随机插入、随机交换、回译等技术增加文本数据的多样性。
17. 多语言文本处理:
- 如果文本包含多种语言,可能需要进行语言检测和分离,然后对每种语言分别进行处理。
18. 文本校正:
- 使用拼写检查工具来识别和纠正拼写错误。
19. 文本过滤:
- 根据特定的业务规则或分析需求,可能需要过滤掉某些类型的文本。
20. 自定义规则:
- 根据特定领域的术语或特定的数据集特性,可能需要开发自定义的预处理规则。
总结:
在以上方法中,我只挑选了部分比较常用且重要的方法进行了详细地分析和讲解并分别给出了代码示例便于大家进一步理解或者运用。
数据预处理是NLP任务成功的基础,它有助于提高模型的性能和准确性。预处理步骤的选择和实现取决于具体的应用场景和数据特性。在实际应用中,可能需要结合多种预处理技术来达到最佳效果。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
更多推荐
所有评论(0)