00:01
第七章处理文本数据。在第四章中,我们讨论过表示数据属性的两种类型的特征,连续特征与分类特征。前者用于描述数量,后者是固定列表中的元素。在许多应用中,还可以见到第三种类型的特征文本。举个例子,如果我们想要判断一封电子邮件是合法邮件还是垃圾邮件,那么邮件内容一定会包含对这个分类任务非常重要的信息。或者我们可能想要了解一位政治家对移民问题的看法,这个人的演讲或推文可能会提供有用的信息。在客户服务中,我们通常想知道一条消息是投诉还是咨询。我们可以利用消息的主题和内容来驱动判断客户的目的。从而将消息发送给相关部门,甚至可以发送一封全自动的回复。文本数据通常被表示为由字符组成的字符串。在上面给出的所有例子中,文本数据的长度都不相同。这个特征显然与前面讨论过的数值特征有很大的不同。我们需要先处理数据,然后才能对其应用。机器学习算法7.1用字符串表示的数据类型在深入研究表示机器学习文本数据的处理步骤之前,我们希望简要讨论你可能会遇到的不同类型的文本数据。文本通常只是数据集中的字符串,但并非所有的字符串特征都应该被当作文本来处理。我们在第五章中讨论过,字符串特征有时可以表示分类变量。在查看数据之前,我们无法知道如何处理一个字符串特征。
01:42
你可能会遇到四种类型的字符串数据,分类数据,可以在语义上映射为类别的自由字符串、结构化字符串数据、文本数据。分类数据cat a是来自固定列表的数据。比如,你通过调查人们最喜欢的颜色来收集数据。你向他们提供了一个下拉菜单,可以从红色、绿色、蓝色、黄色、黑色、白色、紫色和粉色当中进行选择,这样会得到一个包含八个不同取值的数据集。这八个不同取值表示的显然是分类变量。你可以通过观察来判断你的数据是不是分类数据。如果你看到的许多不同的字符串,那么不太可能是分类变量。并通过计算数据集中的唯一值并绘制其出现次数的直方图来验证你的判断。你可能还希望检查每个变量是否实际对应于一个在应用中有意义的分类。调查过程进行到一半,有人可能发现调查问卷中将b black black、黑色或并为b bla,并随后对其进行修改。因此你的数据集中同时包含b black和b bla。他们。
02:53
对应于相同的语义,所以应该将二者合并。现在想象一下,你向用户提供的不是一个下拉太大,而是一个文本框,让他们填写自己最喜欢的颜色。许多人的灰呢,可能是像黑色或蓝色之类的颜色名称,其他人可能会出现笔误,使用不同的单词拼写,比如gray和gray这两个词的意思都是灰色,或者使用更加形象的具体名称,比如午夜蓝色。你还会得到一些非常奇怪的条目,FKCD。颜色调查当中有一些很好的例子,其中有人为颜色秘密给出了迅猛龙谢之枪和我牙医办公室的成色。
03:37
我仍然记得他的头皮屑慢慢的飘落到我张开的下巴之类的名称,很难将这些名称与颜色自动对应,或者根本就无法对应。从文本框中得到的回答属于上述列表中的第二类,可以在语义上映射为类别的自由字符串string that can b。Dramatically mapped to categories。
04:04
可能最好将这种数据编码为分类变量。你可以利用最常见的条目来选择类别,也可以自定义类别。使用户回答对应用有意义。这样你可能会有一些标准颜色的类别,可能还有一个多色类别,对于像绿色与红色条纹之类的回答和其他类别,对于无法归类的回答。这种自创预处理过程可能需要大量的人力,并且不容易自动化。如果你能够改变数据的收集方式,那么我们强烈建议对于分类变量能够更好表示的概念。不要使用手动的输入值。通常来说,手动输入值不与固定的类别对应,但仍然有一些内在的结构structurect,比如地址、人名或地名、日期、电话号码或其他标识。后这种类型的字符串通常难以解析,其处理方法也强烈依赖于上下文和具体领域。对这种情况的系统处理方法超出了本书的范围。最后一类字符串数据是自由格式的文本数据type data由短语和句子组成。例子包括推文、聊天记录和酒店评论,还包括莎士比亚文集、维基百科的内容包括登报计划收集的5万本电子书。
05:22
所有这些集合包含的信息大都是由单词组成的句子。推文中链接网站的内容所包含的信息可能比推文本身还要多。为了简单体现,我们假设所有的文档都只属于一种语言英语。本章接下来的绝大部分内容也适用于其他使用罗马字母的语言,部分适用于具有单词定界符的其他语言。例如中文没有词边界,还有其他方面的挑战,所以难以应用本章介绍的技术。在文本分析的语境中,数据集通常被称为语料库pop。每个有单个文本表示的数据点被称为文档document。这些数据来自于信息检索information IR和自然语言处理natural language process NLP的社区,他们主要针对文本数据。
06:16
7.2事例应用电影评论的情感分析作为本章的一个运行事例,我们将使用由斯坦福研究员安德鲁收集的I'm DB Internet movie database、互联网电影数据库网站的电影评论数据集。你可以在这样一个网站中。下载这个数据集怎么下载?点击large movie review1.0。就可以进行下载,当然我这地方是已经下载好了。这个数据集包含评论文本,还有一个标签用于表示该评论是正面的positive还是负面的两个地,正面的就是好评,负面的就是差评。I'm BB网站本身包含一到十个打分,为了简化建模这些评分。
07:12
被归纳为一个二分类数据集,评分大于等于七的评论被标记为正面的,评分小于等于四的评论被标记为负面的中性评论没有包含的数据集中,我们不讨论这种方法是否是一种好的数据表示,而只是使用他所提供的数据。将数据解压之后。数据及包含两个独立文件夹中的文本文件,一个是训练数据,一个是测试数据。每个文件夹。都有两个子文件夹,一个叫做POS,一个叫做net。当然。
08:01
V1.0版本数据的目录结构与书上所讲的略有不同。怎么个不同法?对于V1.0版本的数据。主要是说的是训练数据。其中还包含5万个用于无监督学习的无标签文档。放在on soup。这么一个文件夹中,在进行后续操作之前,建议先把这5万个无标线文档从训练室中进行剔除。POS文件夹包含所有正面的评论。每条评论都是一个单独的文本文件。
09:03
那个文件夹与之类似,包含所有负面的评论,也就是差评。在词中有一个辅助函数,可以加载用这种文件夹结果保存的文件。其中每个子文件夹对应于一个标签。这个函数叫做load files。我们首先将load file函数应用于训练数据。当然加载完成之后,我们需要。将5万个无标签文档进行剔除,怎么剔除?使用掩码索引。
10:00
你可以看到。是一个长度为25000的。朗派速度。当然。书上也没有错。虽然说书上说的是列表啊,因为。点贝塔,它确实是一个列表。如果它是一个囊派数据。我就不需要进行。这样一个类型转换了。为什么要转换成哪派数组?是因为列表不支持掩码索引。我们不去管它。是列表还是数组?只需要知道其中每个元素是包含一条评论的字符串。
11:04
我们打印出索引编号唯一的评论。你还可以看到评论中包含一些HTML换行符。左肩括号BR空格斜杠,右间括号。虽然这些符号不太可能对机器学习模型产生很大的影响,但最好在继续下一步之前清洗数据并删除这一种格式。Text的元素类型与你所使用的pon版本有关,在P3中,它们是S字节类型,是表示字符串数据的二进制编码。在32中。Text群包含的是字符串,这里不会深入讲解P中不同的字符串类型。当我们推荐阅读PYTHON2和PYTHON3的文档中关于字符串和unode的内容。
12:04
收集数据,及时保持正类和反类的平衡,这样所有正面字符串和负面字符串的数量就会相等。我们用同样的方式来加载测试数据集。接下来我们要解决的任务如下,给一条评论,我们希望根据该评论的文本内容为其分配一个正面或负面的标签。这是一项标准的二类任务,但是文本数据并不是机器学习模型可以处理的格式。我们需要将文本的字符串。表示转化为数值表示,从而可以分析应用机器学习算法7.3将文本数据表示为磁带。
13:02
词是单词的词,带是口袋的袋。用于机器学习的文本表示有一种最简单的方法,也是最有效且最常用的方法。就是使用磁带表示,当然这里的磁带刚才说了单词的词,口袋的带,绝不是磁盘的磁。交代的。磁带back of wood。使用这种表示方式时,我们舍弃了输入文本中的大部分结构,如章节、段落、句子和格式,只计算语料库中每个单词在每个文本中的出现频次。舍弃结构并且仅计算单词出现的次数,就会让脑海中出现将文本表示为带的画面。
14:04
对于文档、语料库计算磁代表是包括以下三个步骤分词。Po。将每个文档划分为出现在其中的单词,称为此类poke,比如按空格和标点划分构建词表vocabulary building收集一个词表,里面包含出现在任意文档中的所有词,并对它们进行编号,比如按字母顺序排序编码引扣顶,对于每个文档,计算词表中每个单词在该文档中的出现频次,在步骤一和步骤二中涉及一些细微之处,我们将在本章后面进一步深入讨论。目前,我们。来看一下如何利用在来应用磁带的处理过程。图七杠一在书上254页展示了对字符串this is how you get an的处理过程,其输出是包含每个文档中单词技术的一个向量。
15:14
对于词表中的每个单词。我们都有它在每个文档中的出现次数,也就是说整个数据集中每个唯一单词都对应于这种数值表示的一个特征。请注意原始字符串中单词顺序。与磁带特征表示完全就没有关系。7.3.1将磁带应用于玩具数据集磁带表示是在counterr中实现的,它是一个变换器全多,我们首先将它运用于一个包含两个样本的玩具数据集。
16:00
也就是这里的W。我们导入并将其实例化。然后对玩具数据。进行拟合。你和count,包括训练数据的分词与词表的构建。我们可以通过vocabular的下限属性。来访问词表。词表共包含13个单词,从D到Y。我们可以调用。Transform方法来创建训练数据的磁带表示。磁带表示保存在一个。塞派稀疏矩阵中。这种数据格式只保存非零元素。
17:04
可以参考一下第一章这个矩阵的形状,两行13列。每行对应于两个数据点之一。每个特征对应于词表中的一个单词。这里使用稀疏矩阵是因为大多数文档都只包含词表中的一小部分单词。也就是说。特征数组中大部分元素都是零,想想看,与所有英语单词这是词表的建模对象相比。一篇电影评论中可能出现多少个不同的单词?保存所有零的代价太高了,也浪费内存。你要想查看系数矩阵的实际内容,可以使用粗方法或者粗单词方法也行,将其转换为密集的朗派数组,保存所有的零元素。
18:01
在这里。之所以我这么做是可行的,是因为我在这里使用的是只包含13个单词的小型玩具数据集。对于任何真实数据集来说。十之八九就会导致memory内存错误。我们可以看到。每个单词的计数。都是零或者一八字,Words中两个字上都没有包含相同的单词。我们来看一下如何阅读这些特征项呢?第一个字符串。The four think he is wise被视为第一行。对于词表中的第一个单词。B出现了零次。对于词表中的第二个单词but也出现了零次,对于词表中的第三个单词do doth出现了一次,依此类推。通过观察这两行可以看出,第十个单词for和第十个单词the与第13个单词同时出现在两个字符串中。
19:17
7.3.2将磁带应用于电影评论上一节我们详细介绍了磁带处理过程,下面我们将应用于电影评论情感分析的任务。前面我们将I'mbb评论的训练数据和测试数据加载为字符串列表,Test去和test test,现在我们将处理他们。X是训练数据的磁带表示。其形状为。25000行。74849列的一个基数矩阵。
20:04
这表示此表中包含74849个元素。数据同样被保存为反派稀疏矩阵。我们来更详细的看一下这个词表。访问词表的另一种方法是使用向量级的get name方法。Get方法,它返回一个列表,每个元素对应于一个特征。如你所见。此表的。前十个元素。都是数字,这有些出人意料,所有这些数字都出现在评论中的某处。因此被提取为单词,大部分数字都没有一目了然。一除了007,在电影的特定语境中,它可能指的是詹姆斯邦德詹姆斯邦德这个角色。
21:09
对数据的快速分析可以证实这一点,你可以尝试验证一下。从无意义的单词中挑选出有意义的有时很困难。进一步观察这个词表。我们发现许多以DR开头的英语单词。你可能注意到,对于。Draw drawback和draw,其单数和复数形式都包含在词表中,并且作为不同的单词。这些单词具有密切相关的语义。将它们作为不同的单词进行记述,对应于不同的特征可能不太合适。在尝试改变特征提取之前,我们先通过实际构建一个分类器来得到性能的量化度量。我们将训练标签保存在y string中,训练数据的磁带保存在string中,因此我们可以在这个数据上训练一个分类器。
22:12
对于这样的高维稀疏数据。类似logistic regression的线性模型通常效果是最好的。我们首先使用交叉验证对logisticres进行评估。细心的读者可能会注意到,我们这里违背了第六章中关于交叉验证与预处理的内容,Con RI的默认设置实际上不会收集任何统计信息,所以我们的结果是有效的。对于应用而言,从一开始就使用piline是更好的选择,但我们后面再这么去做,这里是为了便于说明。我们得到的交叉验证平均分是88%,这对于平衡的二分类任务来说是一个合理的性能。我们知道log有一个正则化参数C,我们可以通过交叉验证来调节它。
23:19
我们使用C等于0.1。得到的交叉验证分数是89%,现在我们可以在测试题上评估这个参数设置的大化性能。下面我们来看一下能否改进单词提取con使用正则表达式提取词令默认使用的正则表达式杠B,杠W,杠W加杠B。如果你不熟悉这个正则表达式,它的含义是找到所有包含至少两个字母或数字。杠W。
24:00
且被此边界杠B分隔的字符序列,它不会匹配只有一个字母的单词。还会将类似doesnt或类似点LY之类的缩写分开。但它会将H8T。匹配为一个单词。然而。然后countr将所有单词转换为小写字母。这样。Su。Son全小写还是首字母大写的son和小写so大写、on小写都对应于同一个词例,因此也对于同一个特征。这一简单机制在实践中的效果很好。但正如前面所见,我们得到了许多不包含信息量的特征,比如数字减少。这种特征的方法是仅使用至少在两个文档或至少五个等等中出现过的力。仅在一个文档中出现的磁力不太可能出现在测试集中,因此没什么用。我们可以用min minimum_DF参数来设置磁力至少需要在多少个文档中出现过。
25:13
在我这里设置为了五。通过要求每个磁力至少在五个文档出现过。我们可以将特征数量。减少到27271个。正如上面的输出所示,只有原始特征的1/3左右。我们再来看一下。吃力。数字的个数。明显变少。有些生僻词或拼写错误似乎也都消失了,我们再次运行网格搜索,来看一下模型的性能究竟如何。
26:01
网格搜索的最佳验证进度。还是89%,就和前面一样,我们并没有改进模型。但减少要处理的特征数量可以加速处理过程,舍弃无用的特征也可能提高模型的可解释性。如果一个文档中包含训练数据中没有包含的单词。并对其调con的transform方法。那么这些单词将会被忽略掉,因为他们没有包含在字典中。这对分类来说不是一个问题,因为从不在训练数据中的单词学不到任何内容。但对于某些应用而言,比如垃圾邮件检测,添加一个特征来表示特定文档中有多少个所谓词。表外单词可能会有所帮助。为了实现这一点,你需要设置minimum,想选DF。否则,这个特征在训练期间永远不会被用到。
我来说两句