上一期文章是如何从文本中提取特征信息?,文本分析第一步要解决的是如何将文本非结构化信息转化为结构化信息,其中最关键的是特征抽取,我们使用scikit-learn库fit和tranform方法实现了文本数据的特征抽取。
但是对于fit和transform,大家可能还是有点迷糊。最近又将《Applied Text Analysis WIth Python》读了一遍(别惊讶,82页过一遍很快的。之前一直以为这本书82页,今天才发现这本书完整版是400多页。)我主要结合这本书代码和自己的理解,实现了fit和tranform算法,方便大家更好的理解文本分析特征抽取。
一、scikit库 代码实例
fit方法作用:给文本数据建立词典的过程
transform方法作用:根据词典对所有的文本数据进行编码(转码)
1.1 我们先看看fit代码实例
1.2 transform实例
根据建立好的词典vectorize对corpus进行编码。这里为了便于观看理解,我们使用pandas处理下数据输出。
从上面的dataframe表中,行代表一个文档,列代表特征词。比如第1行,hey列的所对应的单元格值为3,说明corpus中第一个document(Hey hey hey lets go get lunch today :) 出现了三次hey。
二、fit 与 transform算法实现
思路:
首先要对输入的文本数据能够分词(这里我们假设是英文吧)
对英文字符能够识别是否为符号,防止出现如“good_enough”这种中间含有非英文字符。
剔除停止词,如“a”、“ the”等
词干化
经过步骤1-4清洗,输出干净的词语列表数据。
基于词语列表,这里需要有一个容器存储每一个新出现的单词,构建出特征词词典。
根据建立好的词典,对输入的数据进行编码。
2.1 分词
这里我们直接使用nltk.tokenize库中的word_tokenize分词函数。
我们看到上面结果有“!”,所以接下来我们要判断分词结果是否为单词。
2.2 标点符号判断
《Applied text analysis with python》一书中判别分词结果是否为符号代码为
测试了下发现,category(符号),结果为“Po”。
而all(data)函数是Python内置函数,当data内各个元素一致时返回True,否则返回False。
2.3 停止词
nltk提供了丰富的文本分析工具,停止词表全部为小写单词,所以判断前要先将token小写化。
2.4 词干化
对单复数、不同时态、不同语态等异形词归并为一个统一词。这里有stem和lemmatize两种实现方法,下面我们分别看看算法。
2.4.1 stem
2.4.2 lemmatize
从中我们可以看出lemmatize更准确,对于小数据量的分析,为了力求精准我个人建议用lemmatize。
2.5 清洗数据
结果中出现None,这是不能允许的。原因应该是lemmatize函数。所以我们要加一个判断
2.6 构建词典-fit
我们需要将待分析的文本数据中抽取出所有的特征词,并将其存入一个词典列表中。思路:凡是新出现,不存在于词典列表vocab中,就将其加入到vocab中。
词典已经构建好了。
2.7 对待分析文本数据编码-transform
根据构建好的词典列表,我们开始对文本数据进行转码。思路不难,只要对文档分词结果与词典列表一一分析,该特征词出现几次就为几。
三、完整版
现在我们将上面的代码合并为TextExtractFeature类
文本处理分析
数据采集
数据结构
杂文
领取专属 10元无门槛券
私享最新 技术干货