如何对非结构化文本数据进行特征工程操作?这里有妙招!

2018-02-07   作者:   来源:

原标题:如何对非结构化文本数据进行特征工程操作?这里有妙招! 雷锋网 AI 研习社按:本文是英特尔数

原标题:如何对非结构化文本数据进行特征工程操作?这里有妙招!

雷锋网 AI 研习社按:本文是英特尔数据科学家 Dipanjan Sarkar 在 Medium 上发布的「特征工程」博客续篇。在本系列的前两部分中,作者介绍了连续数据的处理方法和离散数据的处理方法。本文则开始了一个新的主题,非结构化文本数据的传统处理方法。雷锋网 AI 研习社对原文进行了编译。

如何对非结构化文本数据进行特征工程操作?这里有妙招!

文本数据通常是由表示单词、句子,或者段落的文本流组成。由于文本数据非结构化(并不是整齐的格式化的数据表格)的特征和充满噪声的本质,很难直接将机器学习方法应用在原始文本数据中。在本文中,我们将通过实践的方法,探索从文本数据提取出有意义的特征的一些普遍且有效的策略,提取出的特征极易用来构建机器学习或深度学习模型。

研究动机

想要构建性能优良的机器学习模型,特征工程必不可少。有时候,可能只需要一个优秀的特征,你就能赢得 Kaggle 挑战赛的胜利!对于非结构化的文本数据来说,特征工程更加重要,因为我们需要将文本流转化为机器学习算法能理解的数字表示。即使现在有高级的自动化特征工程,在把它们当作「黑盒子」应用之前,我们仍有必要去了解不同特征工程策略背后的核心思想。永远记住,「如果有人给了你一套修房子的工具,你应该知道什么时候该用电钻,什么时候该用锤子!」

理解文本数据

我们虽然能够获得具有结构数据属性的文本数据,但它们为结构化数据,并不在今天的讨论范围之内。

在本文中,我们讨论以单词、短语、句子和整个文档的形式展现的文本流。从本质上讲,文本确实有一些句法结构,比如单词组成了短语,短语组成了句子,句子又组合成了段落。然而,与结构化数据集中固定的数据维度相比,文本文档没有固定的结构,因为单词有众多的选择,每个句子的长度也是可变的。本文就是一个很典型的案例。

特征工程的策略

下面是一些流行且有效的处理文本数据的策略,这些方法也能应用在下游的机器学习系统中,用于提取有用的特征。大家可以在 GitHub 中查看本文使用的所有代码。

首先加载一些基本的依赖关系和设置:

import pandas as pd
import numpy as np
import re
import nltk
import matplotlib.pyplot as pltpd.options.display.max_colwidth = 200
%matplotlib inline

下面是文档中的语料库,本文大部分内容都是基于该数据集的分析。语料库通常是属于一个或多个主题的文档的集合。

corpus = ['The sky is blue and beautiful.',

'Love this blue and beautiful sky!',

'The quick brown fox jumps over the lazy dog.',

"A king's breakfast has sausages, ham, bacon, eggs, toast and beans",

'I love green eggs, ham, sausages and bacon!',

'The brown fox is quick and the blue dog is lazy!',

'The sky is very blue and the sky is very beautiful today',

'The dog is lazy but the brown fox is quick!'

]

labels = ['weather', 'weather', 'animals', 'food', 'food', 'animals', 'weather', 'animals']

corpus = np.array(corpus)

corpus_df = pd.DataFrame({'Document': corpus,

'Category': labels})

corpus_df = corpus_df[['Document', 'Category']]

corpus_df

如何对非结构化文本数据进行特征工程操作?这里有妙招!

本文中应用的语料库案例

可以看到,我们已经从语料库中提取出几个不同类别的文档。在讨论特征工程之前,一如往常,首先得做数据预处理,删除一些不必要的字符、符号和标记。

文本预处理

有很多种对文本数据进行清洗和预处理的方法。下面我将重点介绍在自然语言处理(NLP)流程中大量使用的方法。

  • 删除标签:文本中通常会包含一些不必要的内容,比如 HTML 标签,这在分析文本时并没有太多价值。BeautifulSoup 库提供了清理标签的函数。

  • 清理重音字符:在许多文本语料库中,特别是在处理英文时,通常会遇到重音字符/字母。因此我们要确保将这些字符转换为标准的 ASCII 字符。一个简单的例子就是将 é 转换成 e。

  • 拓展缩写:在英文中,缩写基本上是单词或者音节的缩减版。缩减版通常是删除某些单词或者短语中特定的字母和声音而来。举例来说,do not 和 don't , I would 和 I'd。将缩写单词转换为完整的原始形式有助于文本的标准化。

  • 删除特殊字符:特殊字符和非字母数字的符号通常会增加额外噪声。通常,可以通过简单的正则表达式来实现这一点。

  • 词干提取和词性还原:可以利用词干创造新的词汇,例如通过附加前缀和后缀等词缀来创造新的单词。这被称为词性变化。词干提取是将这个过程反过来。一个简单的例子是单词:WATCHES, WATCHING, 和 WATCHED,这些单词都把 WATCH 作为词根。词性还原与词干提取很相似,通过移除词缀以得到单词的基本形式。然而在词性还原里,单词的基本形式是词根(root word),而不是词干(root stem)。其不同之处在于词根(root word)总是字典上正确的词(即出现在词典中),但词干并不是这样。

  • 去除无用词:在从文本中构建有意义的特征时,没有意义的词被称为无用词。如果你在一个语料库中做一个简单的词频分析,这些无用词通常会以最大的频率出现。像 a , an 这样的词被认为是无用词。但是实际上并没有明确通用的无用词表,我们通常使用 nltk 的标准英语无用词表。大家也可以根据特定的需要添加无用词。

  • 如何对非结构化文本数据进行特征工程操作?这里有妙招!

    除此之外,还可以使用其他的标准操作,比如标记化、删除多余的空格、文本大写转换为小写,以及其他更高级的操作,例如拼写更正、语法错误更正、删除重复字符等。

    由于本文的重点是特征工程,我们将构建一个简单的文本预处理程序,其重点是删除特殊字符、多余的空格、数字、无用词以及语料库的大写转小写。

    wpt = nltk.WordPunctTokenizer()

    stop_words = nltk.corpus.stopwords.words('english')

    def normalize_document(doc):

    # lower case and remove special characters\whitespaces

    doc = re.sub(r'[^a-zA-Z\s]', '', doc, re.I|re.A)

    doc = doc.lower()

    doc = doc.strip()

    # tokenize document

    tokens = wpt.tokenize(doc)

    # filter stopwords out of document

    filtered_tokens = [token for token in tokens if token not in stop_words]

    # re-create document from filtered tokens

    doc = ' '.join(filtered_tokens)

    return doc

    normalize_corpus = np.vectorize(normalize_document)

    一旦搭建好基础的预处理流程,我们就可以将它应用在语料库中了。

    norm_corpus = normalize_corpus(corpus)
    norm_corpus

    • 责编: