3.12.4 自然语言文本预处理
“文章系统介绍了自然语言文本预处理的核心流程,重点讲解基础文本处理、中文分词及文本向量化技术。结合Python实战,演示了利用jieba库与TF-IDF模型实现分词与词向量转换的代码逻辑,并总结了数据预处理的常见问题与实操技巧,为数据化运营提供技术参考。”
Python 数据分析:自然语言文本预处理与核心要点总结
一、 自然语言文本预处理
与数据库中的结构化数据相比,文本具有有限的结构,某些类型的数据源甚至没有数据结构。因此,预处理就是要对半结构化或非结构化的文本进行格式和结构的转换、分解和预处理等,以得到能够用于进一步处理的基础文本。
不同环境下,文本所需的预处理工作内容有所差异,大体上分为以下三个核心环节:
1. 基础文本处理
根据不同的文本数据来源,可能涉及到的基本文本处理包括:
- 去除无效标签:例如从网页源代码获取的文本信息中包含 HTML 标签,此时要提取特定标签内容并去掉标签。
- 编码转换:不同编码对于中文处理具有较大影响,例如 UTF-8、UTF-16、GBK、GB2312 等之间的转换。
- 文档切分:如果获得的单个文档中包含多个文件,此时需要进行单独切分,以将不同的文档拆分出来。
- 基本纠错:对于文本中明显的人名、地名等常用语和特定场景用语的错误进行纠正。
- 去除空白:文本中可能包含的大量空格、空行等需要去除。
- 大小写统一:将文本中的英文统一为大写或小写。
- 去标点符号:去除句子中的标点符号、特殊符号等。
- 去停用词:常见的停用词包括 the、a、an、and、this、those、over、under、above、on 等。
- 保留特殊字符:某些场景下可能需要只针对汉字、英文或数字进行处理,其他字符都需要过滤掉。
2. 中文分词技术
分词是将一系列连续的字符串按照一定逻辑分割成单独的词。
在英文中,单词之间是以空格作为自然分界符的;而中文只有字、句和段能通过明显的分界符来简单划界,作为词是没有形式上的分界符的。因此,中文分词要比英语等语种分词困难和复杂得多。
对于复杂的中文分词而言,常用的分词方法包括:最大匹配法、逆向最大匹配法、双向匹配法、最佳匹配法、联想-回溯法等。
3. 文本转向量(Word to Vector)
人们通常采用向量空间模型来描述文本向量,即将文档作为行,将分词后得到的单词(单词会在向量空间模型里面被称为向量,也被称为特征、维度或维)作为列,而矩阵的值则是通过词频统计算法得到的值。这种空间向量模型也称为文档特征矩阵。
二、 Python 代码实战:分词与词向量化
本示例中,将仅对自然语言文本做分词和 Word to Vector 处理。有关更多文本分析的内容(如词性标注、关键字提取、词频统计、文本聚类、相似关键字分析等)将在后续章节介绍。
环境提示:数据源文件
text.txt位于“附件-chapter3”中,默认工作目录为“附件-chapter3”(如果不是,请使用cd切换到该目录下,否则会报IOError: File text.txt does not exist)。
1. 完整代码实现
python
2. 代码逻辑拆解
上述代码以空行分为 5 个核心部分:
- 导入库:本代码中用到了
jieba做中文分词、sklearn用来做 Word to Vector 转换,以及pandas用于做格式化输出。 - 建立分词函数:该函数用于下面的中文分词。先建立一个空列表用于存储分词结果;使用
jieba.cut做中文分词;循环读取每个分词结果并存储到列表中,最后返回。 - 读取自然语言文件:使用 Python 标准方法
open读取文本文件,使用readlines方法读取为列表。 - 中文分词:新建一个空列表,用于存储每次分词返回的结果;使用
for循环将原文本数据按行读取,并调用分词函数做中文分词,将结果追加到列表中。最后通过循环打印输出前 5 条数据,如下:code - Word to Vector:先定义一个要去除的停用词库,然后使用
TfidfVectorizer方法创建词向量模型,使用fit_transform方法对输入的分词后的列表做转换。最后通过词向量的get_feature_names获得向量名称,通过转换后的向量使用toarray方法将向量结果转换为数组,再通过数据框做数据格式化。打印输出第一条数据如下:code
三、 关键考量与实操小结
1. 实践中的局限与思考
在本示例中,没有涉及更多的自然语言文本预处理环节(如无效标签、编码转换、文档切分、基本纠错等),原因是这些内容都是针对不同案例展开的。本示例仅做功能演示使用,具体应对不同文本时,很难具有通用性和可复制性。
此外,由于测试文件为本书的部分文字内容,文本规模本身有限,因此难以提取真正有价值的数据和规律出来。尤其是基于向量化的分词,由于数据量的限制以及作为扩展内容,无法做更多有价值的探索。
核心思考点: 如何根据不同自然语言的来源特点、应用场景、语言语法、目标应用做综合的文本处理?文本处理中用到的,大多是针对文字内容的过滤、筛选、去除、替换等基于字符串的操作。
2. 代码实操知识点盘点
本小节示例中,主要用到了以下 Python 知识点:
- 对文本文件的读写操作。
- 通过
join方法实现多字符串的拼接。 - 通过
encode方法做字符编码转换。 - 使用
jieba.cut做中文分词,并可设置不同的分词模式。 - 通过
append方法对列表追加元素。 - 通过
for循环读取数据列表,通过if语句进行条件判断。 - 通过
sklearn.feature_extraction.text的TfidfVectorizer方法做 Word to Vector 处理。 - 通过词向量的
get_feature_names获得向量名称。 - 通过转换后的向量使用
toarray方法将向量结果转换为数组。 - 使用
pandas.DataFrame建立数组并通过head方法输出前 n 条数据。
四、 本章小结与延伸学习
1. 内容回顾与重点提示
本章介绍了 11 个有关数据化运营过程中的数据预处理经验,涵盖了常见的数据清洗、标志转换、数据降维、样本不均衡、数据源冲突、抽样、共线性、相关性分析、数据标准化、数据离散化等内容,并在最后提出了运营业务对于数据处理的影响和应对措施。
在扩展内容中,简单介绍了有关网页、日志、图像、自然语言的文本预处理工作,作为拓展知识阅读。内容中涉及到技术的部分都有对应示例代码,该代码可在“附件-chapter3”中的名为 chapter3_code.py 的文件中找到。
重点知识提示: 客观上讲,本章的每一节内容都非常重要,原因是所有的内容都没有唯一答案,都需要读者根据不同的场景进行判别,然后选择最合适的方法进行处理。因此,掌握每种方法的适用条件以及如何辨别其应用前提是关键知识。
2. 外部参考资源
限于篇幅,本书涉及到很多内容无法一一介绍,以下给出更多外部参考资源供读者学习:
- 样本不均衡处理:Python 第三方库
imblearn提供了非常多的样本不均衡处理方法,尤其是 SMOTE、组合 / 集成方法的应用非常广泛。读者可在 imbalanced-learn GitHub 仓库 中找到更多信息。 - 数据预处理进阶:本书中多次引用了
sklearn中的preprocessing库,里面还有更多有关数据处理的方法,读者可查阅 scikit-learn 官方文档 了解更多。 - Pandas 深度学习:关于数据的预处理,
Pandas库真的非常好用,推荐读者更加深入地了解和学习,可查看 Pandas 官方文档。 - 应用实践建议:本章几乎每个小节都带有示例代码,读者可直接使用附件中的示例数据进行模拟操作,以了解实现方法;同时,推荐读者从自己所在环境中找到一些真实数据,针对每个模块进行操作练习。