上一篇:《Using OpenRefine》翻译~7
定制透视
我们现在已经学习了两种主要的透视方法-文本透视和数字透视。但其实还有很多透视方法存在,你甚至可以按照你的想法自如的透视数据。定制透视就可以让你做到这点,无论是文本类型(比如透视字符串的首字母)或者数字类型(比如透视数字的平方根)。当然,你需要对General Refine Expression language(openrefine内建函数语言GREL)有基本的了解,我们将在附件:正则表达式和GREL中介绍。
当然,openrefine也提供一些预定义透视选项,其可以给大多数用户提供有用的透视功能。下面,我们将查看这些透视项,着重对其中重要的东西作下介绍。让我们先看一下Customized facets子菜单的内容,我们可以在列菜单Facets菜单中找到。
Word facet(单词透视)列出了字段中所有不同的单词,一个单词被定义为两个空格之间的字符。这在你想对数据小子集进行分析时十分有用,因为大数据的话统计频数会很快增加到很大,比如对列Description进行单词透视,会显示212,751个不同的单词,这很容易导致软件奔溃。
举个例子,单词透视可以用来对categories进行透视,因为普通的文本透视只会告诉你有多少个体表现为数量极小的长尾,而单词透视则会将内容分成两个单词,这能够让你分析不同的长尾,同时也能够让你将长尾间联系起来考虑(就好像既能够分析整套衣服也能够分析配饰)
Duplicates facet (重复项透视):可以让你检测重复项,我们将在下一点来介绍
Numeric log facet (数字对数透视):对数字的对数值进行透视,这在数字符合幂分布时特别有用。1-bounded numeric log facet(1阶数字对数透视)也一样,只不过其不能应用于小于1的数字。
Text length facet(文本长度透视)针对的是字符串中的字符个数,以Object Title列为例,选择该列菜单Facet| Customized facets|Text length facet,我们可以看到该列中的内容字符个数从0到260,你可以看到有92个标题内容中内容小于10个字符数(无内容的占大多数,这毫无意义),你还可以看到2007个标题内容超过250个字符数(一般情况下一定需要精简了)
对descriptions列进行文本长度透视也十分有趣,但是我们看到这个分布实在太广了点(从0到4100,虽然85%数量的内容小于500个字符数),这导致我们很难了解其规律。这时候我们可以使用文本长度对数透视,如下所示:
Unicode char-code facet(Unicode字符集透视)并不计算字符串的长度,而是列出了所有字符串中使用的字符UNICODE码数。在Object Title列尝试下;大部分英语字符UNICODE码数小于128,一些源于欧洲语言的古文UNICODE码数会达到256,阿拉伯文或中文甚至更大。如果你发觉字符UNICODE码数特别大,可能是OpenRefine没有正确的识别出编码。碰到这种情况,可以新建一个项目然后选择手工指定正确的编码方式。
最后,我们还可以按照错误来透视(如果有的话),或者按照空值来透视。按照空值来透视在了解字段填充分布时十分有用,一般常用来与另一个透视结果作比较。我们看到Marks列开头几行就为空,所以我们通过点击Facet| Customized facets| Facet by blank来了解该列,透视结果提示我们18,986个为FALSE(也就是非空),86,846个位TRUE(也就是空值)。换句话说,只有四分之一的部分有内容。
还要明显的列是Weight(在屏幕右边,使用水平滑动条滑动可见),只有179个有内容,而99.998%的内容为空。对Object titles列进行空值透视发现,有118行是无效行,它们都有一个RECORD ID跟着一个链接和无效的信息,但是其他列却都是空值,所以它们并不代表一个有效记录。
对标星和标旗行进行透视
在1初识OPENREFINE中,我们简要的提到了最左边ALL列中的标星和标旗功能。现在该介绍如何利用这些功能来透视数据了。星星一般用来标识良好的行或者感兴趣的行,我们可以在今后随时找到它们;相反的,旗帜可以用来表示不好的行或者有问题的行,这些行我们应该在后续处理中注意。当然这只是建议,你当然可以赋予星星和旗帜不同的意义。
要标星或者标旗,只需要在对应的符号上点击即可。大都数情况下,你可能想同时标注多行。在标注前,你需要将需要标注的行分离显示出来,一般也是通过一个透视过程实现。比如,你可以通过对Registration Number列执行Facet| ustomized facets| Facet by blank来检测出空值,然后点击true来显示出118行空行。然后点击ALL列菜单中Edit rows | Flag rows。标星功能也同样,并且你也可以在菜单中去掉多行的星星或旗帜。
现在假设你想显示要么diameter字段有内容或者weight字段有内容的行。如果你对这两列都做了空值透视,然后分两次点击结果是false的内容,你将得到29行匹配,但其实这29行指的是diameter字段有内容而且weight字段也有内容,这和我们的目的不符,我了按要求取到数据,解决方法是分两步:先对diameter列进行空值透视,得到2106行为false(也就是diameter内容存在),然后使用All| Edit rows| Star rows标星,清除透视并且对weight列进行空值透视,得到179行(你会注意到只有150行被标星,因为29行已经被标星,其weight和diameter都有内容而已)。再次清除透视,然后选择All| Facet| Facet by star获得数据,当然使用旗帜功能也可以。
喔,我们总算介绍完了本小点,你可能觉得这个小点怎么这么长,但是确实透视是OpenRefine的基础,所以花点时间还是值得的。
点3-重复检测
在本点中,我们将学习什么是重复数据,如何检出,为什么需要处理重复值。
上一小点定制透视中唯一没有介绍的内容就是重复项透视。重复值是数据集中出现两次或更多次的恼人数据。重复数据不仅浪费存储空间,并且会导致干扰。所以我们希望能够删除重复值。重复项透视就是一种能够检测重复的简单办法。但是其也有限制性,比如其只能对字符串进行重复检测,最起码不能直接对非字符串进行操作(如何能够对整数也能作重复检测,请参照附录:正则表达式和GREL)。
因为上面的原因,我们无法对Record ID列进行重复项透视,这里最好的选择就是对registration numbers列(内部标识)进行重复项透视,当然其准确度不如Record ID,因为数据数据收集人员会赋予其额外的意义。不管怎样,让我们试着对Registration Number列进行重复项透视:Registration Number | Facet | Customized facets | Duplicates facet;281行被标注为重复项,点击左侧中的true显示这批数据。
现在鼠标滚动下查看这些重复项。我们发现一个问题:重复项中包含空白行,这些实际上确实完全一样,但是和有效行的重复是完全不同的。为了剔除这118行空白行,我们需要再对Registration Number列作一次空值透视:Registration
Number |Facet |Customized facets |Facet by blank.点击false保留163行真正的重复数据,我们发现结果自动刷新了。
最后,再增加一个透视,这次是一个简单文本透视,列出数据集中有多个相同registration numbers的项,按照计数项排序,我们看到79项中,77项确实是严格的重复项(重复2次),(2008/37/1)出现了3次,(86/1147-3)甚至出现了6次,如下图所示:
现在让我们回到RECORD ID列的讨论来,因为重复项透视不能用于整数,所以我们将采取一个迂回的办法来检测该列。首先,我们对ID列进行排序:Record ID | Sort...,其中参数项选择numbers和smallest first。我们在1初始openrefine中介绍过,排序只是一种视觉的改变,所以为了让数据永久改成排序状态,我们需要选择Sort菜单(就在Show: 5 10 25 50 rows右边),点击Reorder rows permanently.如果你忘记做了这一步,后续的操作其实会忽略排序这个动作,从而导致不可知的结果。
现在我们已经得到了排序后的数据,ID重复项一定是在一起的。所以我们选择进行如下操作:Record ID| Edit cells| Blank down,重复项中的ID会被空白替代(所有重复项中第一个保留,后续的空白填充)。然后进行一次空值透视:Record ID | Facet|Customized facets| Facet by blank,我们将得到86个冗余行(如果你删除过空白行,也可能是84),其中二次重复项会出现1个,三次重复项会出现2个,六次重复项会出现5个。这86个重复项就是保留1项后剩余的需要删除的冗余项。我们将在点6:删除匹配行中介绍如何删除它们