Python数据分析与数据化运营

3.12.4 自然语言文本预处理

Author
宋天龙
发布于 2019-01-04
2583 次阅读
0 次赞
0 次分享
3.12.4 自然语言文本预处理
AI 智能核心导读

文章系统介绍了自然语言文本预处理的核心流程,重点讲解基础文本处理、中文分词及文本向量化技术。结合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
1# 导入库 2import pandas as pd 3import jieba # 结巴分词 4from sklearn.feature_extraction.text import TfidfVectorizer # 基于 TF-IDF 的词频转向量库 5 6# 分词函数 7def jieba_cut(string): 8 word_list = [] # 建立空列表用于存储分词结果 9 seg_list = jieba.cut(string) # 精确模式分词 10 for word in seg_list: # 循环读取每个分词 11 word_list.append(word) # 分词追加到列表 12 return word_list 13 14# 读取自然语言文件 15fn = open('text.txt') 16string_lines = fn.readlines() 17fn.close() 18 19# 中文分词 20seg_list = [] # 建立空列表,用于存储所有分词结果 21for string_line in string_lines: # 读取每行数据 22 each_list = jieba_cut(string_line) # 返回每行的分词结果 23 seg_list.append(each_list) # 分词结果添加到结果列表 24 25for i in range(5): # 打印输出第一行的前 5 条数据 26 print(seg_list[1][i]) 27 28# Word to Vector 29stop_words = [u'\n', u'/', u'“', u'”', u'的', u',', u'和', u'是', u'随着', u'对于', u'对', u'等', u'能', u'都', u'。', u'、', u'中', u'与', u'在', u'其'] # 自定义要去除的无用词 30vectorizer = TfidfVectorizer(stop_words=stop_words, tokenizer=jieba_cut) # 创建词向量模型 31X = vectorizer.fit_transform(string_lines) # 将文本数据转换为向量空间模型 32vector = vectorizer.get_feature_names() # 获得词向量 33vector_value = X.toarray() # 获得词向量值 34vector_pd = pd.DataFrame(vector_value, columns=vector) # 创建用于展示的数据框 35print(vector_pd.head(1)) # 打印输出第一条数据

2. 代码逻辑拆解

上述代码以空行分为 5 个核心部分:

  1. 导入库:本代码中用到了 jieba 做中文分词、sklearn 用来做 Word to Vector 转换,以及 pandas 用于做格式化输出。
  2. 建立分词函数:该函数用于下面的中文分词。先建立一个空列表用于存储分词结果;使用 jieba.cut 做中文分词;循环读取每个分词结果并存储到列表中,最后返回。
  3. 读取自然语言文件:使用 Python 标准方法 open 读取文本文件,使用 readlines 方法读取为列表。
  4. 中文分词:新建一个空列表,用于存储每次分词返回的结果;使用 for 循环将原文本数据按行读取,并调用分词函数做中文分词,将结果追加到列表中。最后通过循环打印输出前 5 条数据,如下:
    code
    1对于 数据 化 运营 和
  5. Word to Vector:先定义一个要去除的停用词库,然后使用 TfidfVectorizer 方法创建词向量模型,使用 fit_transform 方法对输入的分词后的列表做转换。最后通过词向量的 get_feature_names 获得向量名称,通过转换后的向量使用 toarray 方法将向量结果转换为数组,再通过数据框做数据格式化。打印输出第一条数据如下:
    code
    1python 上 下 不断 不曾 专业 业 业务 两个 严峻 ... \ 0 0.0 0.0 0.0 0.204648 0.0 0.0 0.204648 20.0 0.0 0.204648 ... 非 非常 非常简单 预测 领域 高 高于 ( ) ; 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 30.0 0.0 0.0 4[1 rows x 198 columns]

三、 关键考量与实操小结

1. 实践中的局限与思考

在本示例中,没有涉及更多的自然语言文本预处理环节(如无效标签、编码转换、文档切分、基本纠错等),原因是这些内容都是针对不同案例展开的。本示例仅做功能演示使用,具体应对不同文本时,很难具有通用性和可复制性。

此外,由于测试文件为本书的部分文字内容,文本规模本身有限,因此难以提取真正有价值的数据和规律出来。尤其是基于向量化的分词,由于数据量的限制以及作为扩展内容,无法做更多有价值的探索。

核心思考点: 如何根据不同自然语言的来源特点、应用场景、语言语法、目标应用做综合的文本处理?文本处理中用到的,大多是针对文字内容的过滤、筛选、去除、替换等基于字符串的操作。

2. 代码实操知识点盘点

本小节示例中,主要用到了以下 Python 知识点:

  • 对文本文件的读写操作。
  • 通过 join 方法实现多字符串的拼接。
  • 通过 encode 方法做字符编码转换。
  • 使用 jieba.cut 做中文分词,并可设置不同的分词模式。
  • 通过 append 方法对列表追加元素。
  • 通过 for 循环读取数据列表,通过 if 语句进行条件判断。
  • 通过 sklearn.feature_extraction.textTfidfVectorizer 方法做 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 官方文档
  • 应用实践建议:本章几乎每个小节都带有示例代码,读者可直接使用附件中的示例数据进行模拟操作,以了解实现方法;同时,推荐读者从自己所在环境中找到一些真实数据,针对每个模块进行操作练习。
分享
最后修订: 2019-01-04