Press "Enter" to skip to content

3.12.4 自然语言文本预处理

说明:本文是《Python数据分析与数据化运营》中的“3.12.4 自然语言文本预处理”。

 

—————————–下面是正文内容————————–

 

与数据库中的结构化数据相比,文本具有有限的结构,某些类型的数据源甚至没有数据结构。因此,预处理就是要对半结构化或非结构化的文本进行格式和结构的转换、分解和预处理等,以得到能够用于进一步处理的基础文本。不同环境下,文本所需的预处理工作内容有所差异,大体上分为以下几个部分:

 

基本处理

 

根据不同的文本数据来源,可能涉及到的基本文本处理包括去除无效标签、编码转换、文档切分、基本纠错、去除空白、大小写统一、去标点符号、去停用词、保留特殊字符等。

去除无效标签:例如从网页源代码获取的文本信息中包含HTML标签,此时要提取特定标签内容并去掉标签。
编码转换:不同编码不同对于中文处理具有较大影响,例如UTF-8、UTF-16、GBK、GB2312等之间的转换。
文档切分:如果获得的单个文档中包含多个文件,此时需要进行单独切分以将不同的文档拆分出来。
基本纠错:对于文本中明显的人名、地名等常用语和特定场景用语的错误进行纠正。
去除空白:文本中可能包含的大量空格、空行等需要去除。
大小写统一:将文本中的英文统一为大写或小写。
去标点符号:去除句子中的标点符号、特殊符号等。
去停用词:常见的体用词包括the、a、an、and、this、those、over、under、above、on等。
保留特殊字符:某些场景下可能需要只针对汉字、英文或数字进行处理,其他字符都需要过滤掉。

分词

 

分词是将一系列连续的字符串按照一定逻辑分割成单独的词。在英文中,单词之间是以空格作为自然分界符的;而中文只有字、句和段能通过明显的分界符来简单划界,而作为词是没有形式上的分界符。因此,中文分词要比英语等语种分词困难和复杂的多。对于复杂的中文分词而言,常用的分词方法包括最大匹配法、逆向最大匹配法、双向匹配法、最佳匹配法、联想-回溯法等。

 

文本转向量(word to vector)

 

人们通常采用向量空间模型来描述文本向量,即将文档作为行,将分词后得到的单词(单词会在向量空间模型里面被成为向量,也被称为特征、维度或维)作为列,而矩阵的值则是通过词频统计算法得到的值。这种空间向量模型也称为文档特征矩阵。其表示方法如表3-4:

本示例中,将仅对自然语言文本做分词和word to vector处理,有关更多文本分析的内容,例如词性标注、关键字提取、词频统计、文本聚类、相似关键字分析等会在第4章中介绍。数据源文件text.txt位于“附件-chapter3”中,默认工作目录为“附件-chapter3”(如果不是,请cd切换到该目录下,否则会报“IOError: File text.txt does not exist”)。完整代码如下:

 

# 导入库
 import pandas as pd
 import jieba # 结巴分词
 from sklearn.feature_extraction.text import TfidfVectorizer # 基于TF-IDF的词频转向量库
 # 分词函数
 def jieba_cut(string):
  word_list = [] # 建立空列表用于存储分词结果
  seg_list = jieba.cut(string) # 精确模式分词
  for word in seg_list: # 循环读取每个分词
  word_list.append(word) # 分词追加到列表
  return word_list
 # 读取自然语言文件
 fn = open('text.txt')
 string_lines = fn.readlines()
 fn.close()
 # 中文分词
 seg_list = [] # 建立空列表,用于存储所有分词结果
 for string_line in string_lines: # 读取每行数据
  each_list = jieba_cut(string_line) # 返回每行的分词结果
  seg_list.append(each_list) # 分词结果添加到结果列表
 for i in range(5): # 打印输出第一行的前5条数据
  print (seg_list[1][i])
 # word to vector
 stop_words = [u'\n', u'/', u'“', u'“', u'”', u'的', u',', u'和', u'是', u'随着', u'对于', u'对', u'等', u'能', u'都', u'。', u'、',
  u'中', u'与', u'在', u'其'] # 自定义要去除的无用词
 vectorizer = TfidfVectorizer(stop_words=stop_words, tokenizer=jieba_cut) # 创建词向量模型
 X = vectorizer.fit_transform(string_lines) # 将文本数据转换为向量空间模型
 vector = vectorizer.get_feature_names() # 获得词向量
 vector_value = X.toarray() # 获得词向量值
 vector_pd = pd.DataFrame(vector_value, columns=vector) # 创建用于展示的数据框
 print (vector_pd.head(1)) # 打印输出第一条数据

 

上述代码以空行分为5个部分。

 

第一部分导入库。本代码中用到了jieba做中文分词、sklearn用来做word to vector转换和pandas用于做格式化输出。

 

第二部分建立一个分词函数。该函数用于下面的中文分词。先建立一个空列表用于存储分词结果;使用jieba.cut做中文分词;循环读取每个分词结果并存储到列表中,最后返回。

 

第三部分读取自然语言文件。使用python标准方法open读取文本文件,使用readlines方法读取为列表。

 

第四部分中文分词。新建一个空列表,用于存储每次分词返回的结果;使用for循环将原文本数据按行读取,并调用分词函数做中文分词,并将结果追加到列表中。最后通过循环打印输出前5条数据,如下:

 

对于

 

数据

 

 

运营

 

 

第六部分word to vector。先定义一个要去除的停用词库,然后使用TfidfVectorizer方法词向量模型,将使用fit_transform方法对输入的分词后的列表做转换。最后通过词向量的get_feature_names获得向量名称,通过转换后的向量使用toarray方法将向量结果转换为数组,再通过数据框做数据格式化。打印输出第一条数据如下:

 

python 上 下 不断 不曾 专业 业 业务 两个 严峻 … \

 

0 0.0 0.0 0.0 0.204648 0.0 0.0 0.204648 0.0 0.0 0.204648 …

 

非 非常 非常简单 预测 领域 高 高于 ( ) ;

 

0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

 

[1 rows x 198 columns]

 

在本示例中,没有涉及更多的自然语言文本预处理环节,例如无效标签、编码转换、文档切分、基本纠错、去除空白、大小写统一、去标点符号、去停用词、保留特殊字符等,原因是这些内容都是针对不同案例展开的,而本示例仅做功能演示使用,具体应对不同文本时,很难具有通用性和可复制性。另外,由于测试文件为本书的部分文字内容,文本规模本身有限,因此难以提取真正有价值的数据和规律出来,尤其是基于向量化的分词由于数据量的限制以及作为扩展内容,无法做更多有价值的探索。

 

上述过程中,主要需要考虑的关键点是:

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

代码实操小结:本小节示例中,主要用了几个知识点:

对文本文件的读写操作
通过join方法实现多字符串的拼接
通过encode方法做字符编码转换
使用jieba.cut做中文分词,并可设置不同的分词模式
通过append方法对列表追加元素
通过for循环读取数据列表
通过if语句进行条件判断
通过sklearn.feature_extraction.text的TfidfVectorizer方法做word to vector处理
通过词向量的get_feature_names获得向量名称
通过转换后的向量使用toarray方法将向量结果转换为数组
使用pandas.DataFrame建立数组并通过head方法输出前n条数据

3.13 本章小结

 

内容小结:本章介绍了11个有关数据化运营过程中的数据预处理经验,涵盖了常见的数据清洗、标志转换、数据降维、样本不均衡、数据源冲突、抽样、共线性、相关性分析、数据标准化、数据离散化等内容,并在最后提出了运营业务对于数据处理的影响和应对措施。在扩展内容中简单介绍了有关网页、日志、图像、自然语言的文本预处理工作,作为拓展知识阅读。内容中涉及到技术的部分都有对应示例代码,该代码可在“附件-chapter3”中的名为chapter3_code.py的文件中找到。

 

重点知识:客观上讲,本章的每一节内容都非常重要,原因是所有的内容都没有唯一答案,都需要读者根据不同的场景进行判别然后选择最合适的方法进行处理。因此,掌握每种方法的适用条件以及如何辨别其应用前提是关键知识。

 

外部参考:限于篇幅,本书涉及到很多内容无法一一介绍,以下给出更多外部参考资源供读者学习:

Python第三方库imblearn提供了非常多的样本不均衡处理方法,尤其是SMOTE、组合/集成方法的应用非常广泛。读者可在 https:// github.com/scikit-learn -contrib/imbalanced-learn 中找到更多信息。
本书中多次引用了sklearn中的processing库,里面还有更多有关数据处理的方法,读者可查阅 http:// scikit-learn.org/stable /modules/preprocessing.html 了解更多。
关于数据的预处理,Pandas库真的非常好用,推荐读者更加深入的了解和学习,点击 http:// pandas.pydata.org/panda s-docs/stable/ 可查看更多。
应用实践:本章几乎每个小节都带有示例代码,读者可直接使用附件中的示例数据进行模拟操作,以了解实现方法;同时,推荐读者从自己所在环境中找到一些真实数据,针对每个模块进行操作练习。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注