不管是现今的大数据仍是企业内部的小数据,都存在一些广泛的问题,如数据格式不对须要转换,一个单元格内包含多个含义的内容,包含重复项等等,虽然咱们也可使用excel解决,可是excel天生有诸多限制,好比其为直接对数据进行操做,容易致使误操做;数据量大会处理缓慢;透视表功能太过简单;没法进行高级的数据分类分析。而OpenRefine很好的解决了以上问题,最重要的一点是它仍是免费的!!mysql
确认错误是保证数据质量的第一步,主要包括数据画像和数据清洗。正则表达式
鉴于后续章节都须要保证数据已经画像清洗过。OpenRefine是一个数据转换工具(IDTS),其可以对数据进行可视化操做处理。它很像传统的excel软件,但其工做方式更像数据库,因其并非处理单独的单元格,而是处理列和字段。这意味着OpenRefine对于增长新行内容表现不佳,但对于探索、清洗、整合数据却功能强大。算法
OpenRefine使用默认浏览器中打开,程序在本地运行,点击下图中的“选择文件”按钮,导入演示实例中的phm-collection.tsv文件,而后点击下一步。sql
当数据上传以后,会出现导入数据的预览和格式需求。数据库
默认状况下,第一行数据会被解析为列名称。OpenRefine同时也会猜想单元格类型,给其赋予整数、日期、网址等等,这在你后续整理排列数据的时候十分有用(好比若是你将单元格设为文本格式,那么10就会排在2前面)express
另外一个选项是“引号在原数据中用来分隔列”选择项,若是选中,则原数据中引号用来分隔列,不然就须要去掉勾选框以使得OpenRefine可以正确读取。在Powerhouse数据集中,引号是用来代表物体名称和说明信息,因此此状况下,引号没有分隔列的意思:因此这里咱们须要去掉勾选。剩下的选项在某些状况下须要设置,试着勾选或者去掉勾选来看看如何影响数据。另外,请确保编码正确,以使得显示正确。当全部都设置好后,点击建立项目来加载数据。浏览器
数据加载以后的界面以下:数据结构
上图中标明1~4的四个区域,咱们按照顺序介绍:编辑器
一、总行数:若是你没有忘记去掉“引号有意义”选项(参照要点2-建立一个新项目),那么你会看到Powerhouse文件包含75814行数据。当数据按照某个参数进行过筛选,这里的显示会变成相似于找到123匹配行(总共75814行)。函数
二、显示选项:试着点击下,将行变成记录来查看区别,事实上变化并不大,只不过该区域显示为75814条记录而已。行数量通常状况下等于记录数量,但在后续状况中仍是不同的。该区域可让你选择按五、十、2五、50每页显示,而且你也能够在这里跳转页。
三、列名称及菜单:你会发现数据加载后的第一行被解析为列名称,在Powerhouse数据集中,列包含Record ID, Object Title, Registration Number等等(若是你在建立时去掉了“将第一行解析为列名称”的勾选,那么列名称区域会显示为Column一、Column2等等)
四、单元格内容:此处显示实际单元格数据
在开始剖析清理数据前,十分重要的一点是确保OpenRefine较好的载入显示了数据:查看列名称被解析正确(数据显示较宽时请使用水平滑动条)、单元格类型是否正确等等。将行显示项改成每页显示50条以查看数据不明显矛盾(理想状况下,你应该在建立项目前的预览界面时处理这些工做)。当你已经熟悉了操做界面,你就能够继续下一步了。
操纵列能够对列进行隐藏和展开、按须要转换、以及重命名和删除等操做。
列是OpenRefine中的基本元素:其是具备同一属性的成千上万的值的集合,能够按照不少方法查看处理。
若是要隐藏一列或几列以方便观察操做,那么点击列下拉菜单,选择View,有四个可选项:
如下是对Categories点击了收起全部其余列的效果:
有时候改变原数据中列的顺序十分重要。好比,为了将两列放在一块儿比较。选择须要处理的一列而后在列菜单中选择“编辑列” 。子菜单中会出现以下选项,在最后的四个选项跟别是对列进行移动。
若是对全部列操做,可使用第一列名称为“所有”的列。这一列可使你同时操做多列。“视图”菜单可让你快速的隐藏和展开列。选择“编辑列”中的“重排/移动列”能够经过经过拖动从新对列进行排列,还能够将将列拖动到右侧来去除该列,以下图所示:
OpenRefine一个特别有用的功能是能够在项目建立后保存全部的操做步骤。这也就意味着你不须要惧怕作数据变换尝试:你能够随意按照本身的想法变换数据,由于一旦你发觉作错了(即便是几个月前作的),你也能够撤销该操做以恢复数据。
为了恢复历史数据,单击你想保留的最近一个步骤操做。好比,为了取消上图第2步及之后的操做,能够单击第1步使其高亮显示,这样第2步以后就会变灰。这意味着选中项后的操做都将取消。若是点击第0步,那么全部操做都将取消。
请注意,撤销某几步操做后再作出新的操做的话,原来的后续操做内容会丢失.好比,若是你从第2步回退到第1步,而后对Description 列执行左移操做,那么会显示第2步操做2. Move column description to position 1 ,而先前的灰色操做项(第2步)会丢失:由于咱们不能在同时拥有两种互相矛盾的操做历史记录。记得多尝试下上面的步骤,省的之后带来严重的困扰。
记住,只有对数据有实际影响的操做才会出如今项目历史操做表中。数据透视好比:交换行列视角、在一页中改变显示数目、隐藏或展开列并不改变原来数据,因此也就不会出如今操做历史表中。以上操做也就没法随着项目信息传递:当你从新打开一个项目,不管原来是否隐藏,这时全部的列默认都是展开的,可是对于重命名列和删除列这类操做会出如今操做历史表中。在第二章,分析和修改数据中,咱们会看到还有一些类型的操做会存在在操做历史表中:好比单元格和列的变换、可是过滤和透视操做则不会。
操做历史也能够以JSON格式导出,能够点击“提取”按钮进行操做。
虽然可能已经移动、重命名或者删除了列,但其实原始数据并无被修改。不像有些电子表格软件直接将改动写进文件,OpenRefine只是对数据文件的一份拷贝进行操做,在界面右上角点击Export按钮进行操做:
大部分弹出的选项可以让你将数据导出为经常使用格式,好比csv、tsv、excel和open document格式、还有不经常使用的RDF格式。让咱们往下看:
到这里,能够初步了解了OpenRefine,一种新的具备数据画像、清洗、转换等等功能的工具,而且已经了解如何在建立新项目中导入数据和如何在完成操做后导出数据以及行、列的运行机制。
排过序的值更加容易理解和分析,以Record ID 列为例进行排序,选择列菜单中的“排序” ,将弹出以下窗口:
单元格值能够按照文本(区别大小写或者不区别)、数字、日期、布尔值排序,另外还能够对错误值和空值指定排序顺序。好比错误值能够排在最前面(这样容易发现问题),空值排在最后(由于空值通常没有意义),而有效值居中。
对Record ID列经过按数字升序排列为例,咱们就会得到一列以七、九、14等等标识的列,而打开时是以267220、346260、 267098标识顺序的,下图对排序先后的状况作了比对:
若是按照Text: 文本排序的话,会获得以100、100一、10019开始的一列。同时应该关注的一点是:排序并不会被记录在项目操做历史中。你能够在屏幕左侧顶部的“撤销/重作”页中确认下。由于排序并不会改变数据,其仅仅是改变了显示方式,好比行列互换、隐藏不想显示的列(就像excel的排序过滤功能)。因此每次对某列进行排序,你就会面对三种抉择:取消排序回到原来状态、暂时保持、永久改变,可是你能够在屏幕顶部的快捷菜单Sort来作到:
Sort菜单可让你移除排序操做或者永久对行进行排序。若是想将排序后的结果再进行后续操做,必定要将排序结果永久保存,好比对于空白单元格或者填充单元格。
数据透视并不改变数据,可是可让你得到数据集的有用信息。你能够把数据透视看做是多方面查看数据的方法,就像从不一样的角度观察宝石同样。咱们将学习如何按照要求或者数据具体的值来透视数据:对字符串进行文本透视、对数字和日期进行数字透视、几个预约义的透视功能、最后还有标星和标旗功能。OpenRefine的强大之处也在于这些透视功能的组合使用。
若是你的数据集中包含城市或者国家名称的列,而你想大体了解下这个字段都有些什么值和这些值的统计次数有多少,那么就能够用文本透视。固然,只有该列中的类别总数不是特别大的时候文本透视才有用,由于文本透视并非为了列出全部的信息,所有列出并无多大意义,同时透视结果也不会出现相同的两个类别(除非有重复项,咱们将在下一点中说明)
让咱们试试看,点击Categories列菜单,选择“归类”|“文本归类” ,结果会出如今屏幕左侧的“归类/过滤器”页中。惋惜的是,OpenRefine提醒咱们总共有14,805个分类,已经超过了咱们的电脑显示内存。事实上,透视不能超过2000个分类。
这里的提示窗口的出现也就意味着分类数太多了,须要减小。其实OpenRefine在超出时彻底有办法提升限制数,但实际状况下每每咱们想减小限制数的,太多的分类对于咱们毫无心义。若是想这么作,能够访问系统参数:http://127.0.0.1:3333/preferences ,编辑ui.browsing.listFacet.limit,而后调低到想要的值。若是想恢复默认值2000,直接删掉这个值便可。
点击下面的“按归类中量来归类”连接,将打开二级透视界面。新的透视也是对Categories的透视,这里可让你对透视显示范围进行限定。当第一次打开的时候,OpenRefine会显示全部分类,不管分类数量只有1次仍是有几千次。由于有太多的分类会被显示,因此通常开始的时候只显示数量较多的分类就比较有意义。
拖动左边的滑块从最小值0到1000,文本透视状况将自动更新,如今将只显示大于1000数量的Categories分类。这里只有7个,这就比先前大大减小了。为了观察方便,能够选择对“数量”(计数项)排序(降序)来替代按字母排序。下图显示你获得的透视图:
若是你想导出最多的7个分类名称,能够点击上图中的7 choices连接,会获得一个TSV格式的内容,你能够复制粘帖到你喜欢的文本编辑器或者电子表格软件中。
可能你会以为奇怪,好比Photographic prints|Photographs 并非一个分类名称,其实包含两个分类,被“|”分开了。这就是为何咱们第一次透视会出现这么多的分类。Glass plate negatives|Gelatin dry plate negatives|Photographs, Glass plate negatives|Photographs和Glass plate negatives被区分为不一样的分类,可是其实他们都属于一个分类。这就是多义单元格的困扰,这里将在第三章:高级数据操做学习中的按钮Cluster进行介绍。
让咱们在对数值列进行透视前来看看另外一个文本透视操做。Height虽然并非特别明显,可是咱们也能够看到这个列并不只仅包括数值,好比还有一些带单位的数字990mm,这意味着咱们不能使用数值透视(最起码不能直接用),可是咱们能够试试文本透视,但愿可以看出端倪。咱们在对Hight列进行透视操做(“归类”|“文本归类”)时,咱们发现只有1313个分类,低于2000限制数,用“数量”排序,咱们发现164mm的数量有1368,而第二位的215mm只有400,以下图所示:
在上图列表底部,咱们能够看到Hight列中空值有45501,也就是说这些值缺失。
若是在项目导入时勾选“将单元格的文本解析为数字、日期等”,那么数字也能够经过绿色来快速识别。本例中Record ID就是个很好的例子,经过对其透视能够看出ID的分布,而且能够看出是否每条记录都有一个ID。点击Record ID列菜单,选择“归类/数值归类”,而后看看左侧“归类/过滤器返回一个不一样分类数量的列表,而数字透视则是某个数值范围的分布,就像咱们经过频数来透视同样。
咱们能够看到Record ID的值域从0到510,000,在270,000至280,000之间有个小缺口,在410,000至500,000有个大缺口。经过滑动滑块,咱们能够看出有533行的值大于500,000。
在图的下方,咱们能够看到值类型被分红四种:数值型, Non-numeric,Blank和 Errors。这是由于一些错误所致使的。在咱们操做前能够看到Errors(错误值)为0,blanks(空值)数也是0,说明每一行都被分配了一个ID,有三行的值为Non-numeric(非数字),不能用做ID。让咱们只勾选Non-numeric来看看状况。如今右侧咱们可以看到这三行的内容了。这三行不光ID缺失,其余不少列也是空白,除了persistent link和license information列,可是这些信息也是自动产生的。这几行并无什么实际意义,因此咱们能够删除(本章最后内容会介绍为何会产生)
可是这里有个问题,若是这三行ID确实为空,那么为何会被分类到Non-numeric,而不是分类到Blank?实际上是空格致使的,咱们能够经过编辑这几个单元格来验证。咱们能够将鼠标移到单元格上,会出现edit标记,点击进入你就会看到包含一个单独的空格,以下图所示:
为了改正这个错误,能够单击Backspace或Delete键删除这个空格,而后点击“应用到全部相同单元格”按钮或者按Ctrl_Enter。OpenRefne 会弹出一个黄框提示你有多个Record ID 列值被修改。最后,左侧的透视图会自动刷新,有问题的三行也会归到Black分类。
时间轴透视要求数据为日期格式,因此相似17/10/1890 的文本字符串须要改成日期格式,17/10/1890 会被转成1890-10-17T00:00:00Z ,其中这些0标识一天中的小时、分钟、秒。你能够用Production Date 列练手,可是请注意,真实的时间不多是肯定的,好比仅仅包含年份的1984,或者一个时间范围如2006到2007.咱们能够对某列作以下操做:编辑单元格|经常使用转换|日期化。
下图显示了将Production Date 列转换成日期后的时间轴透视图:
咱们如今已经学习了两种主要的透视方法-文本透视和数字透视。openrefine也提供一些预约义透视选项,其能够给大多数用户提供有用的透视功能。让咱们先看一下“自定义归类”子菜单的内容,咱们能够在列菜单“归类”菜单中找到。
要标星或者标旗,只须要在对应的符号上点击便可。大都数状况下,经过透视过程实现同时标注多行。好比,能够经过对Registration Number列执行“归类”| “自定义归类”| “按空白归类”来检测出空值,而后点击true来选出118行空行。而后点击“所有”列菜单中“编辑行”|“加星标”,这样即可以对这118行进行加星标。
如今假设你想显示要么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得到数据,固然使用旗帜功能也能够。
重复值是数据集中出现两次或更屡次的恼人数据。重复数据不只浪费存储空间,而且会致使干扰。重复项透视就是一种可以检测重复的简单办法。可是其也有限制性,好比其只能对字符串进行重复检测,最起码不能直接对非字符串进行操做,咱们没法对Record ID列进行重复项透视。
这里最好的选择就是对registration numbers列(内部标识)进行重复项透视:“归类”|“自定义归类”|“复数归类”,281行被标注为重复项,点击左侧中的true显示这批数据。如今鼠标滚动下查看这些重复项。咱们发现一个问题:重复项中包含空白行,这些实际上确实彻底同样,可是和有效行的重复是彻底不一样的。
为了剔除这118行空白行,咱们须要再对Registration Number列做一次空值透视:“归类”|“自定义归类”|“按照空白归类”.点击false保留163行真正的重复数据,咱们发现结果自动刷新了。
最后,再增长一个透视,此次是一个简单文本透视,列出数据集中有多个相同registration numbers的项,按照计数项排序,咱们看到79项中,77项确实是严格的重复项(重复2次),(2008/37/1)出现了3次,(86/1147-3)甚至出现了6次,以下图所示:
如今让咱们回到RECORD ID列的讨论来,由于重复项透视不能用于整数,因此咱们将采起一个迂回的办法来检测该列。首先,咱们对ID列进行排序,其中参数项选择“数字”和“从小到大”。排序只是一种视觉的改变,因此为了让数据永久改为排序状态,咱们须要选择Sort菜单(就在Show: 5 10 25 50 rows右边),点击“固定行顺序”。若是你忘记作了这一步,后续的操做其实会忽略排序这个动做,从而致使不可知的结果。
如今咱们已经获得了排序后的数据,ID重复项必定是在一块儿的。因此咱们选择进行以下操做:“编辑单元格”|“相同空格填充”,重复项中的ID会被空白替代(全部重复项中第一个保留,后续的空白填充)。而后进行一次空值透视:Record ID | Facet|Customized facets| Facet by blank,咱们将获得86个冗余行(若是你删除过空白行,也多是84),其中二次重复项会出现1个,三次重复项会出现2个,六次重复项会出现5个。这86个重复项就是保留1项后剩余的须要删除的冗余项。
假如你想找出Object Title列中全部和美国相关的全部标题。选择Object Title| “文本过滤”,咱们将在左侧看到一个对话框,就在上节中透视对话框相同的位置。如今输入USA。OpenRefne 提示匹配到1,866行,勾选case sensitive (区别大小写),那么好比karakusa和Jerusalem之类的就会被排除,这样咱们下降到1,737行。
这样简单的文本过滤并无考虑到拼写方式,好比遗漏了U.S.A. (201 个匹配), U S A (29个匹配)或 U.S.A (22个匹配)。这时候就须要用到正则表达式了,正则表达式十分强大,可是须要你对这些表达式中的奇怪符号有基本的认识,这样才能发挥其功效。好比,表达式\bU.?S.?A\b(文本过滤时须要勾选regular expression)将匹配上面全部须要包括的内容,而且把干扰项排除,最后将返回1,978项匹配。
文本过滤的另外一个应用是检测分隔符的使用,在Categories列种,管道符”|”被用来分隔目录,让咱们对Categories列应用一个文本过滤,过滤符为“|”,OpenRefine显示匹配到了71105行,这说明大部份内容里面含有至少两个目录(由于单个目录不须要管道符分隔)。
在咱们检测数字重复值的时候咱们已经用到过了Blank down菜单。另外的转换功能好比分割合并单元格、聚类、计算值相对来讲较复杂,因此咱们将在下一章学习。其余的转换功能比较简单,因此咱们将先学习“编辑单元格”|“经常使用转换”子菜单下的功能,以下图所示:
咱们已经介绍完了经常使用的转换方式,可是请注意这些只是转换功能的冰山一角,转换的方法不可计数,这你会在第三章:高级数据操做和附录:正则表达式和GREL体会到。
在实际状况中,这意味着那些有问题的行须要从数据集中删除,由于它们的存在是对数据质量的损害。在删除行前,请确保你已经作过了一个透视或者过滤,否则你可能会误将全部数据删除,另外请确保OpenRefine是以“行”rows显示而不是以“记录”records显示。
咱们将首先删除RECORD ID中没有内容的行。首先对Record ID列进行操做:“归类”|“数值归类”,在左侧弹出面板中去掉“数值型” 勾选,这样咱们就只剩下Non-numeric数据,这里咱们有3条。如今使用“所有”|“编辑行”|“移除全部匹配的行”删除这个行。
这样数据集减小了3行,,数据质量也提升了一点。如今清除透视后咱们发现数据行数量降低到了75,811行。
下一步,咱们将处理数据集中registration number列有问题的行。该列没有空格(你能够对Registration Number列应用一个简单的文本过滤,输入一个空格字符,咱们发现没有匹配行)。因此咱们对该列进行空值透视:“归类”|“自定义归类”|“按照空白归类”。选择为true的值,获得115条匹配行。这些就是空行,咱们能够用Remove all matching rows删除。
如今咱们将处理重复行。重复行就稍显麻烦点,但咱们仍是须要删除它们的,可能你须要回顾下检测重复项,对Registration Number列执行:“归类”|“自定义归类”|“复数归类”。选择true获得163行匹配行。问题是,若是你直接删除这些行,那么不光重复项会被删除,那个惟一的值同时也会被删除。换句话说,若是某行出现了两次,那么删除匹配行就会把两条都删除而不是仅仅删除一条。不过即便你误删除了,你也能够经过项目历史恢复。
因此咱们须要作到既去除多余重复项,同时还可以保留一项。咱们能够这么作:对Registration Number进行排序,选择text和a-z选项(case sensitive没必要勾选,由于该列只有大写),而后选择Sort| Reorder rows permanently来固定排序。最后,使用Registration Number | “编辑单元格”|“相同空白填充”将多余的重复项使用空白填充。最后有84个单元格被修改。
若是你的重复项透视界面还打开着,那么你会注意到重复项刷新为84行。这是由于去重后的值(163条中的一部分)被摘出了,这时候它们已经再也不是重复项了,因此在重复项透视中被识别为false。而真正的重复项则被填充成了空白,它们具备同一个值:空值。这就是出现84项重复的缘由。如今你能够将这些项删除,而且可以保留下原值。
正常状况下,你如今将还有75,612行数据。咱们还能够进一步处理,可是你可能已经知道如何去作了,这些就留给大家去实验。最后看下Undo / Redo页中项目历史究竟咱们作了哪几步。
在本章中,咱们学习了如何使用OpenRefine来分析和修复数据的基本操做,这是数据分析和清理的最基本技能。
分析数据包括排序和各种透视功能,还包括文本过滤和检重。
修复数据步骤则包括排序、单元格转换、删除。
在不少表格数据中有一个广泛的问题:若是一个单元格中有多个值怎么办?举个例子,若是有一张包含名字、地址、电话号码的客户信息表格。录入人员正在对这张表格进行信息录入,当其发现有一个名字为Mr.Thompson的人有两个地址信息,而且每一个地址信息对应一个电话号码,通常状况下录入人员会选择下面三种可能的操做:
虽然咱们知道咱们有不少种技术方法能够解决多值单元格问题,好比表格关联。可是,若是数据模型你不能控制,那么你也就只能选择上面三种中的一种
幸运的是,OpenRefine能够作到多值单元格的识别。固然由于OpenRefine是一种自动化软件,因此其须要在操做前指定某个字段为multi-valued多值字段。在Powerhouse Museum数据集中,Categories列就包含多值单元格,由于其单元格内容能够属于不一样的分类。在咱们进行操做前,咱们必须告诉OpenRefine这个字段是有点不一样的。
假如咱们想了解Categories列中究竟有多少不一样的分类,而且哪一个分类数量最多。选择Categories下拉菜单:“编辑单元格”|“分离多值单元格”,这里咱们使用了“|”做为分隔符,以下图所示:
肯定以后能够看到OpenRefine已经分割好了单元格值,而且对Categories的透视界面也刷新了,显示了单独的分类。默认状况下是按照字母顺序显示的,若是咱们按照频数显示的话咱们可以得到更加有用的信息。咱们能够将Sort by 选项从name改成count。这样咱们就可以发现出现数最多的分类。
下面还须要作的是那些尚未变为单值的分类,咱们须要将分类名称修改下,这样全部的行都会更新。好比,修改分类名Clothing and Dress,在透视界面中移动到该分类名上方,点击edit,以下图所示:
输入一个新的名称好比Clothing,而后点击Apply。OpenRefine 就会把全部Clothing and Dress名称修改成Clothing。而且透视界面也当即刷新了。
一旦你已经将分开的值编辑好了,那么你能够把他们从新组合在一块儿。点击Categories列的菜单:“编辑单元格”|“合并多值单元格”,而后输入你想要得分隔符。此次的分隔符并不必定要和原来的相同,有不少字符可使用。好比,你可使用逗号后面跟一个空格来作分隔符。
如今让咱们看下OpenRefine是如何处理多值单元格的。当咱们按照上一点的操做步骤对一个列进行了分割后,咱们发现OpenRefine作了两件事情。一方面,多值内容中的第一部分被替换放回原来的位置,另外一方面,剩下的值被放到下一空行中对应的位置。举个例子,以下图所示,你能够看到ID7-ID9的记录基本是空行,只有Categories对应的单元格有内容,只有第一行(ID6)中其余单元格内有内容(ID6):
row是指数据集中的一行。
Record包括一个主体中的全部行。第一行全部单元格非空,标识一条记录;后续行中相同内容为空,表示这些行隶属于同一条记录
虽然这种处理方式避免了信息的重复和错误,可是也使得比较难分辨隶属于哪一个主体。好比,若是咱们对Categories列进行了文本透视(参照前一点),咱们能够点击每一个类别名称来看究竟有哪些行属于这个分类。可是,若是咱们这么作的话,咱们会发现许多空行:
产生上图结果的缘由是:OpenRefine其实确实显示了全部分类值为Numismatics的行,这些行中包括那些Numismatics不是首个分类名称的行。可是对于某个主体中的其余行却并无包括。这在咱们关注某个主体中的全部行时就会产生问题。好比,咱们可能想对全部类别为Numismatics的行进行标星操做,从而想对其进行后续操做时就会产生问题,咱们能够试着这么作而后看看发生什么状况。
选中文本透视视图中的Numismatics,点击ALL下拉菜单中Edit rows | Star rows,而后点击文本透视视图中的reset来看看发生什么状况。咱们发现只有值为Numismatics的行被标星了,而隶属于主体的其余行却并无被标星。很显然咱们丢失了信息。因此,让咱们经过Undo / Redo标签页撤销标星操做
OpenRefine可让咱们将隶属于同一个主体的全部行集合成一个单独的record(记录)。这样作的话,可让咱们在分割多值单元格的同时确保这些行还可以被认为是一个总体。咱们能够在“展现方式”中将“行” 改为“记录”。你当即会发现行中颜色的改变。其会从以每一个row进行颜色区隔变为以每一个record进行颜色区隔。
若是咱们在records模式中,在Categories透视图中选中Numismatics,咱们能够发现包含Numismatics的全部主体都被选中了。若是咱们经过ALL下的“编辑行”|“加星标”进行标星,咱们发现全部包含Numismatics的主体都被标星了。
以上说明,在records模式下,操做对整条记录有效,记录起码是一行以上。总结下,咱们能够这么说,rows模式只是各个独立的行,而records模式则是一个总体,能够包含数行。
若是你想匹配既在目录名称为Numismatics中又在目录名称Medals中的记录该怎么办呢?为了作到这点,首先请确保咱们在records模式下,而后咱们对Categories进行透视,首先咱们选择Numismatics,而后再作一次透视,此次选择Medals,这样咱们就获取到了咱们想要的记录。
如今若是切换回rows模式会怎么样呢?忽然,没有记录得到匹配。你起初可能感到疑惑,但其实很正常:没有一行是同时既等于Numismatics又等于Medals的,每一行最多只有这两项中的一项。所以,多重选择必须在records模式下。
另外请注意,其余章节请切换到rows模式,不然可能出错。若是出现不可预料的错误,请先检查下模式是否正确。这能减小不少麻烦。
若是你在分割多值单元格后对分类进行了分析,你会发现一样的分类并不必定有相同的拼写。好比,Agricultural Equipment 和 Agricultural equipment(大小写不一样),Costumes 和 Costume(单复数区别)等等。好消息是这类问题能够借助OpenRefine自动处理。
找到拼写有微小区别的内容的过程叫作clustering(聚类),在你分割好多值单元格后,你能够点击Categories列下拉菜单:“编辑单元格”|“簇集并编辑”,OpenRefine会打开一个对话框,这里能够选择不一样的聚类方法,不一样的方法都提供了不少类似的功能。打开时默认参数为“关键词碰接”key collision和“指纹分类算法”fingerprint选中。OpenRefine会完成对Categories列的聚类算法计算,最后其会列出全部的聚类项,每一项都包含拼写有微小差异的行,而且会提供一个整个聚会项的建议值,以下图所示:
请注意OpenRefine并不能彻底自动的合并聚类值。事实上,OpenRefine须要你确认是否这些值真的指向同一个内容。这个措施能够名称类似但意义不一样的内容被合并。
这里强烈建议要仔细的检查列表,否则会把不一样的值聚类到一块儿。在本例中,全部的建议聚类项都是正确的,能够直接点击“全选”按钮,而后点击“合并选中&从新簇集”按钮,这个操做可让咱们将全部聚类项进行聚类操做而且不会关闭界面,这样咱们还能够试试其它聚类算法。
OpenRefine当即用相同的算法进行了聚类,结果会显示没有须要聚类项了。让咱们尝试下换种聚类算法,可能发现OpenRefine又发现了几个新的聚类,可是请记住咱们要求仔细检查全部的列表,你能发现错误吗?仔细看看下图:
确实,这种聚类算法将Shirts和T-shirts 认为是相同的,可是这可能并不对,因此,要么手工选择全部正确的建议,要么不要勾选不正确的项。
OpenRefine提供两种不一样的聚类模式,“关键词碰撞”key collision和“就近原则”nearest neighbor,这两种模式原理不一样。
在实际应用中,很难肯定究竟哪一种模式和方法组合最好。所以,最好的方法是尝试不一样的组合,每次都须要当心的确认聚类项是否真的能够合并。OpenRefine可以帮助咱们进行有效组合:好比,先尝试key collision ,而后 nearest neighbor。
在第二章:分析和修改数据中,咱们学习到OpenRefine能够自动修改一列的单元格内容,好比去除多余空格。上一点中,咱们学习到聚类是另外一种修改列单元格内容的方法。然而,以上方法都仅仅是单元格值转换通用方法的一部分。你能够经过不一样的稍显复杂的方式修改单元格值。虽然这看起来像是EXCEL公式,可是你会惊讶于其功能的强大。
举个例子,假如你不喜欢使用管道符做为Categories列单元格值得分隔符,你想替换成为逗号后面加个空格做为分隔符。固然你能够先把多值单元格拆分而后再组合实现,但其实咱们能够一步完成上述操做,点击Categories列下拉菜单选择“编辑单元格” |“转换”会出现以下的转换对话框:
以上界面中最重要的部分是Expression(表达式), 这里能够输入小脚本,用来修改值。Language 项可让咱们选择表达式的语言,如今支持的语言有General Refine Expression Language(GREL), Jython (Java环境的Python语言), 和Clojure(函数型语言,相似Lisp语言),若是你对后两种语言较熟悉,你会发现书写表达式十分简单。可是,GREL是设计特别用来做简单转换的,因此本书咱们将使用GREL。
在Preview页,咱们可以同时看到初始值和转换后的值,这可让你实时的调试转换表达式,可以当即看到效果。History页保存了你曾经用过的表达式,这样你后续能够直接重用原来的公式。History页还能够对公式打上星标,这样你还能够在Starred页找到它们。最后Help页对大多数表达式作了简介。
对话框底部,咱们能够肯定若是表达式在某个特定单元格中运行结果出错时怎么办。你能够选择保持原值、置空、使用错误值。另外,你也能够选择将转换表达式对单元格进行重复应用的次数,这个颇有用,能够对处理结果再进行处理。好比,若是你有一个表达式,用来将首字母大写的单词删除,那么就能够利用这个重复功能将单元格中全部大写单词均删除。
回到咱们的任务:将管道符修改成逗号后面加个空格。表达式处默认值是value,就像你猜到的那样,这表明原始值。让咱们作个小实验看看会发生什么:输入1234做为新单元格值 。预览界面会更新,显示全部单元格值变为1234。这固然没什么意义,但对于你理解功能确定有用。咱们真正要作的是对原值按照咱们的意愿进行替换。在Help页,咱们找到实现上面意图的GREL函数叫作replace。由于咱们想把管道符替换成逗号,因此咱们输入value.replace("|", ", ")。这里咱们对字符加了双引号,由于它们是字符串而非数字。预览界面会刷新单元格值,咱们发现就是咱们想要的结果,因此点击OK。只须要很短的时间,OpenRefine就转换好了Categories列的单元格内容,全部的管道符已经被替换。
在修改分隔符时须要特别当心,由于有可能分隔符偏偏是值内容中的一部分。上图出现的错误信息以下:Error: replace expects 3 strings, or 1 string, 1 regex, and 1 string。因此错误的缘由是咱们传递replace参数时出错了,这是有些单元格为null所致使。确实,由于null并非字符串,因此咱们并不能对其中的字符进行操做。因此咱们须要告诉OpenRefine只转换非空的单元格,这里能够在对这个列进行“文本过滤”,找出含有“|”的数据。
虽然管道符已经被替换成了逗号,可是Categories列还有一些其余问题存在。确实,有一些值内容中就包含重复内容,好比第14条记录:Didactic displays, Pearl hells, Buttons,Didactic displays。咱们没法采用上面的重复项处理来解决,由于这里的重复是在一个单元格内的。打开Categories列的值转换窗口,输入以下表达式:value.split(", ").uniques().join(", ")。这个表达式看起来有点复杂,可是分开解读仍是比较容易理解的。首先第一个咱们将值按照“,”分割(逗号后面跟一个空格),而后使用uniques函数去重,最后再把内容从新链接到一块儿。当你点击OK后,OpenRefine会完成操做而且提示你有多少单元格进行了该项操做。
假设咱们但愿增长一列,这一列是对应分类单元格中分类计数。点击Categories列,选择“编辑列”|“由此列派出新列”会弹出一个相似单元格转换的对话框,这里提示须要一个列名。在“新列名称”中输入Category Count。如今咱们能够建立分类计数的表达式了。由于分类是被某个字符分隔的(管道符或者逗号,若是你学习过上一点的话),咱们能够简单的将它们拆分而后计数。表达式以下:value.split(",").length() ,Preview 面板会显示结果,若是发现没有问题,那么点击OK.确认。
OpenRefine增长了一列新列,这样咱们就可使用Category Count列来分析咱们的数据。好比,咱们能够对CategoryCount列进行文本透视:“归类”|“文本归类”. 由于咱们只是想对每一个独立的计数数量进行分析,而不是分析其值域。因此这里使用文本透视比较简单,虽然这列数据是数字格式。左侧透视界面会显示究竟分类数如何分布,以下图所示:
咱们发现有一点比较奇怪:有一栏的值是(blank)。若是咱们点击下,咱们发现全部的记录Categories字段为空,那么为何Category Count不显示为0呢?答案是对于空值单元格,这个转换表达式会致使一个错误,由于没有值能够被分割。上一点的学习中,咱们可能可以作到在转换前把这些行过滤掉了。不过咱们这里尝试修复这些行。在透视界面中点击(blank),点击Category Count 下拉菜单: “编辑单元格”|“转换” 若是咱们在表达式窗口中输入0而且点击OK,那么这些空值单元格就会变成0。那些行会消失,别奇怪,由于咱们在透视中还选中着blank,点击过滤项 0(或者其余你像选择的),你就能 获得你想要的数据。
本章开始的时候,咱们演示了如何将一个单元格中的多值内容拆分红多行。可是,有时候这并不能解决问题。现有例子中,单元格中的多个分类其实属于同一个属性:分类间比较类似,而且顺序能够互换。可是若是多值单元格中的内容属于不一样的类别的话状况就不一样了。好比,当一个clients表格包含电话字段可是没有email字段,而某一个客户却同时又上面两种信息。结果这我的的电话信息和email信息可能会被放在一块儿,用斜杠分隔。
在Powerhouse Museum数据集中,咱们也在不少列种发现这种状况。好比,在Provenance字段,咱们可以同时发现designers, makers等等信息。若是咱们可以把它们拆分红不一样的列的话,咱们分析就会更加有意义。咱们能够点击Provenance (Production)列下拉菜单: “编辑列”|“分割此列”,咱们可以看到以下的拆分对话框:
咱们能够选择按照曾经介绍的“按分隔符”分割, 还能够按照“按长度”分割。按长度分割在数据结构固定的时候特别有用,如1987 en-us,X/Y这样的类型,其没有固定的分隔符(或者根本没有)。固然,本例中咱们使用分隔符。一个有趣的选项是设置一个限制,由于可能有分割成不少列,因此设置下限制好比5会比较明智。千万不要忘记设置一个分隔符,好比这里设置成“|”。你能够选择让OpenRefine猜想下分割后的单元格类型(好比分割后可能会出现数字),还可让OpenRefine删除原来的列。
在你点击OK后,你会发现OpenRefine将原来叫作Provenance (Production) 的列被替换成为了不少叫作 Provenance(Production) 1, Provenance (Production) 2等等的列。这些列能够后续按照实际含义修更名称。并非全部列都有内容,只有那些至少含有5项的单元格分割后才会全部单元格都有内容。虽然分割后不会超过你设置的最大列数目,可是仍是会产生分割前的单元格分项较少,致使没法填满全部的列的状况。
咱们再对Object Title列进行分割,咱们发现该列中有些单元格是以数字开头的。若是把数字从中剥离出来应该十分有意义。首先,让咱们先过滤出这些数字开头的项。点击Object Title 下拉菜单中的Text filter.咱们这里写上以数字开头的正则表达式^\d.这个表达式告诉过滤器从开头(^)进行查找而且寻找数字(\d)。别忘了勾选regular expression 。不然 OpenRefine 会把正则表达式当成字符查找。如今咱们就获得了那些以数字开头的项。
点击Object Title下拉菜单,而后选择:“编辑列”|“分割此列”,如今咱们使用一个空格做为分隔符,设置咱们最多要2列而后点击OK. 数字和标题被分割成了两列。
有时候数据并非以你料想的方式在行和列中分布。确实,有不少种数据排布方式,这取决于具体的状况。好比在Powerhouse Museum数据集中,有一些不少维度的列:Height, Width, Depth, Diameter和Weight.可是,并非全部这些列中都有数据,因此若是按照这种方式排布耗时耗力。一个替代方法是将这5列转换成2列:一列包含维度名称(好比Height 或 Weight),另外一列包含量度值(好比35mm 或 2kg)(有点相似于key-value形式)。
这里咱们想作的就是将这些列转换成行。为了作到这点,点击Height 列下拉菜单:“变换” |“将不一样列中的单元格转换为行”,会弹出以下对话框:
左侧“来源列”栏中选择须要转换的开始列,Height 列已经被选中是由于咱们就是点击这一列开始操做的。“目的列”栏选择中止转换的列。这两列中间的全部列就是须要转换的列(因此你须要首先将这些列放在一块儿).这里咱们选择Weight,因此这两列及其中间的列将会被转换。
右侧,咱们能够选择转换列中的变化内容。“两个新列”栏有两项设置, 好比Dimension和 Measurement。另外“一个新列”栏能够将名称和值都放到一个单元格中,可是这样作后续分析可能比较麻烦。当全部设置项设置好后,点击Transpose 开始转换。5列数据将转换成2列,以下所示:
请注意,这里OpenRefine须要设置成“记录”模式以保证信息关联。因此,若是某行有不一样的量度信息,那么转换后它们会占据多行。可能你但愿可以看到全部5个值,即便有些是空值。那么你能够选择在转换对话框中去掉Ignore blank cells勾选。
咱们还能够经过执行“变换”|“取键值列组合成列”来实现反向转换。可是,这个操做对于空单元格十分敏感,因此必须当心。你可能已经可以将Provenance列(名称/值配对出现)转换成全列格式。
本章介绍了一些高级的数据操做。对于多值单元格咱们有不少处理方法:当它们的值属于同一类型的话,咱们能够将它们分割成多行;当它们意义不一样的话,咱们能够将它们分割成多列。另外咱们也学习了OpenRefine中的一种特殊模式:记录模式。在记录模式下,属于同一主体的多个行被认为是一个总体,这样就能让咱们进行更高效的操做。
咱们也介绍了聚类,这在单元格值自己含义同样可是拼写不一样时很是有用。你甚至能够定义本身的转换操做,或者基于已存在的列建立新列。最后,咱们学习了如何进行合适的行列转换。总的来讲,本章介绍了OpenRefine的高级操做,这些操做隐藏在简单的界面下面。到如今为止,你基本能够称得上是OpenRefine高手了。
本章主要学习如何 与URL进行关联。本章中,介绍了如何使互相孤立的数据集创建联系。一方面,你能够对单内容字段进行解析,这样可使得这些单元格与URL对应,而且可以在线查询详细信息。你也可使用内置的Freebase解析或者安装RDF扩展包 来实现对连接数据的解析。另外一方面,你也可使用扩展包进行抽取单名称项,这可使OpenRefine对单元格内的内容进行查询,而且找到每一个内容小项的URL。最后,你的数据集会与其余数据集创建丰富的联系,使之在发布时变得颇有价值。
字符和URL之间的转换,OpenRefine内置Freebase 解析(略)
----------------------------
我的总结,openrefine最大的特色有以下的几个:
一、在数据导入的时候,能够根据数据类型将数据转换为对应的数值和日期型等。
二、类似单元格聚类,能够根据单元格字符串的类似性来聚类,而且支持关键词碰撞和近邻匹配算法。
三、在单元格值替换时,可以对表达式运行出错的处理,如保留原值、置空或者使用错误值,另外还能够控制表达式运行的次数。
四、并无传统意义上的两个数据集之间的关联查询和处理,如mysql中的join操做
五、数据集关联主要是对内容作URL的关联,在目前所接触到的场景中没有用到该功能。
参考资料:
二、相关学习资料:https://pan.baidu.com/s/1pLXEPvl 密码: cpab