上一篇:《Using OpenRefine》翻译~8

点4-应用一个文本过滤

本点中,我们将学习如何使用文本过滤来寻找符合某个条件的值。

当你想寻找那些匹配某个特定字符串的行时,最简单的方法是使用文本过滤功能。让我们以一个简单的例子开始。假如你想找出Object Title列中所有和美国相关的所有标题。选择Object Title| Text flter,我们将在左侧看到一个对话框,就在上节中透视对话框相同的位置。现在输入USA。OpenRefne 提示匹配到1,866行,勾选case sensitive (区别大小写),那么比如karakusa和Jerusalem之类的就会被排除,这样我们降低到1,737行。

另外,我们并不能确保这些匹配项里面是否都正确,比如大写的字符JERUSALEM,为了解决这个问题,我们可以试着在USA前后加上空格,但是还是有可能丢失类似以[USA] 和 /USA开头或结尾的内容。以“  USA  ”(前后有空格)作为过滤项只会返回172个匹配,只占全部能取到量的1/10左右,大部分都没有取到。

另外,这样简单的文本过滤并没有考虑到拼写方式,比如遗漏了U.S.A. (201 个匹配), U S A (29个匹配)或 U.S.A (22个匹配)。很快你就会发现处理这些问题会让人烦不胜烦,而且你还需要每次都标星以最后将它们组合起来。

这时候就需要用到正则表达式了,正则表达式十分强大,但是需要你对这些表达式中的奇怪符号有基本的认识,这样才能发挥其功效。比如,表达式\bU.?S.?A\b(文本过滤时需要勾选regular expression)将匹配上面所有需要包括的内容,并且把干扰项排除,最后将返回1,978项匹配。

本小点不会教你如何使用正则表达式,可以参考附录:正则表达式和GREL

文本过滤的另一个应用是检测分隔符的使用,在Categories列种,管道符”|”被用来分隔目录,让我们对Categories列应用一个文本过滤,过滤符为“|”,OpenRefine显示匹配到了71105行,这说明大部分内容里面含有至少两个目录(因为单个目录不需要管道符分隔)。

现在再增加一个管道符:||,检测到9个问题行,其包含双管道符,而不是一个。在第三章:高级数据操作中,我们将介绍如何使用GREL来改正这个错误。另一个问题是单元格内容以管道符开始或者结尾,解决这个问题也需要借助于正则表达式。所以我们均将在附录:正则表达式和GREL中探讨。

点5-使用简单单元格转换

本点中,我们将学习如何利用OpenRefine内建的转换功能来修改数据子集。

我们已经学习了透视和过滤,已经基本能够做到按照不同要求进行数据的显示,只不过我们并没有对数据进行过改变。现在到了修改它们的时候了,我们将学习强大的Edit cells菜单。在我们检测数字重复值的时候我们已经用到过了Blank down菜单。另外的转换功能比如分割合并单元格、聚类、计算值相对来说较复杂,所以我们将在下一章学习。其他的转换功能比较简单,所以我们将先学习Common transforms子菜单下的功能,如下图所示:

Trimming whitespace(删除首尾空格),对数据进行删除多余首尾空格操作是提升数据质量的很好的开始。这保证了不会因为首尾处的空格使得相同的值为误认为不同。这些空格导致的值不同肉眼是很难发现的,进行这步可以让你的数据更加整洁。当然该操作也可以减少不需要的字符从而压缩数据集大小。虽然单独一个空格影响不大,但是几千个空格就有差别了,并且可能会导致大的错误。还记得上节中因为一个空格就导致空值被识别成了non-numeric非数字类型。

唯一标识符也不应该有空格;让我们对Registration Number列作下检查:Registration Number | Edit cells| Common transforms| Trim leading and trailing whitespace,我们发现有2,349个单元格被处理,这也就意味着这个操作是必要的。但是记住我们不能对Record ID列进行操作,因为删除首尾空格的操作只能针对字符串,而不能对整数操作。如果你去试试,也会发现所有整数会被删除。

Consecutive whitespace(连续的空格)的产生一般是因为输入时太快导致。我们可能会预见到object titles 或者descriptions这类有很多文本内容的列一定会有这个问题。但是奇怪的是,操作后并没有发现。倒是对Production Date列进行Collapse consecutive whitespace(连续空格只保留一个)操作,发现有7671个值被处理,但其实这大部分只不过是将整数转化成了字符串。对其他的列也试试看,这个操作很安全,而且证明总是对数据清洗有益的。

如果你的数据是从互联网应用中获取来的,那么内容中很可能包含HTML代码,在HTML代码中,字符被解析成HTML实体。比如法语字符é会被编码成é;或者é 这取决于使用什么范例表示方法。

因为浏览器在解析的时候经常会碰到编码问题。如果解析不对的话会变得难以辨认(比如é就可能被解析成é)。所以,如果你碰到一些值是以&开始并且以;结束的话,试着使用菜单项功能:Edit cells | Common transforms| Unescape HTML entities,这样内容就能够被正确解析。

下一个转换功能是case transformations(大小写转换),通过这个功能,我们能够将文本字符串转换成全部小写、全部大写或者首字母大写。举个例子,我们发现registration numbers列没有小写,但是对其进行操作:Registration Number|Edit cells |Common transforms |To uppercase.却发现有2,349个单元格值有变化,一般来说,这应该意味着有很多大小写问题,但其实却并没有。这些值的变化主要是因为整数被转换成了字符串(因为数字被认为没有被大写)。你可以试着对registration numbers列先做一次数字透视,然后进行大小写转换来看看这些数字的变化,程序提示你没有数字,也就是说这次大小写转换将数字转成了字符串。

同样的,我们也可以用To lowercase来验证persistent link URL列种没有大写字母,或者用To titlecase 来规范categories列的拼写、统一Didactic Displays 和Didactic displays的书写。To titlecase只会将空格后的字符串首字母大写,所以Spacecraft|Models|Space Technology会变成Spacecraft|models|space Technology,有些时候我们并不想这么做,但是别担心,因为第三章:高级数据操作中我们将介绍一个更好的处理这种情况的方法clustering聚类。

点2:数据透视中,我们碰到过一种数据转换方式。事实上,你可能记得,就是将应该是时间类型的数据转换成日期格式(OpenRefine日期格式:yyyy-mm-ddThh:mm:ss),因为进行时间轴透视必须要求是日期格式。还有就是将值转换成文本或者数值。比如我们为了去重可以把record ID列转换成文本,但是在我们对其进行排序或者数字透视时就需要将值转换为数字,不然排序就会出现10排在2前的错误。

预定义转换方式的最后一个Blank out cells就有点简单粗暴了,它将删除该列所有的内容。当然最好只对数据子集使用。一个科学的方法是先将有问题的值标上旗帜标识,然后使用All| Facet| Facet by flag分离出来,最后使用Blank out cells删除。

我们已经介绍完了常用的转换方式,但是请注意这些只是转换功能的冰山一角,转换的方法不可计数,这你会在第三章:高级数据操作附录:正则表达式和GREL体会到。打开菜单Edit cells | Transform...就会打开Custom text transform 窗口,你可以在这里使用GREL自定义转换,你可能会觉得太难太复杂,但是学好以后你会觉得值得这么去做。

点6-删除匹配行

在本点中,我们将学习如何处理问题行(前面通过透视和过滤发现的)。

检测重复或者将冗余行标上旗帜标识是需要的,但还不够。某些时候,你可能需要从单纯的数据分析转到数据清洗中来。在实际情况中,这意味着那些有问题的行需要从数据集中删除,因为它们的存在是对数据质量的损害。

在删除行前,请确保你已经做过了一个透视或者过滤,不然你可能会误将所有数据删除。让我们从项目数据集的最初状态开始(重新导入或者在Undo / Redo页中选择0. Create project以恢复默认),另外,请确保OpenRefine是以行rows显示而不是以记录records显示。

我们将首先删除RECORD ID中没有内容的行。首先对Record ID列进行操作:Record ID|Facet |Numeric facet ,在左侧弹出面板中去掉Numeric 勾选,这样我们就只剩下Non-numeric数据,这里我们有3条。记住这里如果使用Facet by blank操作并不会起作用,因为这些行其实并不是空白,而是包含了一个空格。现在使用All| Edit rows| Remove all matching rows删除这个行。

很好,这样我们已经将数据集减少了3行,non-numeric类型的RECORD ID数据被删除了(透视图也刷新了),数据质量也提高了一点。现在清除透视后我们发现数据行数量下降到了75,811行。

下一步,我们将处理数据集中registration number列有问题的行。该列没有空格(你可以对Registration Number列应用一个简单的文本过滤,输入一个空格字符,我们发现没有匹配行)。所以我们对该列进行空值透视:Registration Number| Facet| Customized facets| Facet by blank。选择为true的值,得到115条匹配行。这些就是空行,我们可以用Remove all matching rows删除。

就像你看到的那样,删除空值行十分简单;现在我们将处理重复行。重复行就稍显麻烦点,但我们还是需要删除它们的,可能你需要回顾下点3:检测重复项,对Registration Number列执行:Registration Number| Facet| Customized facets| Duplicates facet。选择true得到163行匹配行。问题是,如果你直接删除这些行,那么不光重复项会被删除,那个唯一的值同时也会被删除。换句话说,如果某行出现了两次,那么删除匹配行就会把两条都删除而不是仅仅删除一条。不过即使你误删除了,你也可以通过项目历史恢复。

所以我们需要做到既去除多余重复项,同时还能够保留一项。我们可以这么做:对Registration Number进行排序,选择texta-z选项(case sensitive不必勾选,因为该列只有大写),然后选择Sort| Reorder rows permanently来固定排序。最后,使用Registration Number | Edit cells| Blank down将多余的重复项使用空白填充。最后有84个单元格被修改。

如果你的重复项透视界面还打开着,那么你会注意到重复项刷新为84行。这是因为去重后的值(163条中的一部分)被摘出了,这时候它们已经不再是重复项了,所以在重复项透视中被识别为false。而真正的重复项则被填充成了空白,它们具有同一个值:空值。这就是出现84项重复的原因。现在你可以将这些项删除,并且能够保留下原值。

正常情况下,你现在将还有75,612行数据。我们还可以进一步处理,但是你可能已经知道如何去做了,这些就留给你们去实验。最后看下Undo / Redo页中项目历史究竟我们做了哪几步。

我们首先删除了3行,然后删除了115行看上去record ID为空的行。为了删除84行重复项,我们对Registration Number列进行了排序,固话排序后我们用空值进行了填充。我们总共删除了202行,我们的数据集更加干净了。你可能注意到了:文本透视和排序操作并没有出现在历史操作中,这是因为这些操作并没有改变数据,而是仅仅是为删除做的一些准备工作。

小结

在本章中,我们学习了如何使用OpenRefine来分析和修复数据的基本操作,这是数据分析和清理的最基本技能。

分析数据包括排序和各类透视功能,还包括文本过滤和检重。

修复数据步骤则包括排序、单元格转换、删除。

下一章中,我们将学习OpenRefine更深层次的内容,我们将学习高级数据操作。

未完待续......

《Using OpenRefine》翻译~9相关推荐

  1. 《Using OpenRefine》翻译~12

    上一篇:<Using OpenRefine>翻译~11 点4:单元格值转换 在第二章:分析和修改数据中,我们学习到OpenRefine可以自动修改一列的单元格内容,比如去除多余空格.上一点 ...

  2. 《Using OpenRefine》翻译~4

    上一篇:<Using OpenRefine>翻译~3 要点5:使用项目操作历史 本点中,你将学习到如何返回到任一个项目历史操作点,并且学习如何在项目重新打开后查看历史操作信息. OpenR ...

  3. Mysql函数group_concat、find_in_set 多值分隔字符字段进行数据库字段值翻译

    Mysql函数group_concat.find_in_set进行数据库字段值翻译 场景 配方表:记录包含的原料 sources表示原料,字段值之间用逗号分隔 原料表:对应原料id和原料名称 现需要查 ...

  4. “Attention is All You Need 翻译

    <p><img src="output_0_0.png" alt="png"></p> "Attention is ...

  5. 基于PyTorch的Seq2Seq翻译模型详细注释介绍(一)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qysh123/article/deta ...

  6. 全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

    全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning 摘要 人们越来越需要将机器学习应用到各种各样 ...

  7. 全文翻译(四) TVM An Automated End-to-End Optimizing Compiler

    全文翻译(四) TVM An Automated End-to-End Optimizing Compiler 6.3 嵌入式GPU评估 对于移动GPU实验,在配备ARM Mali-T860MP4 G ...

  8. 全文翻译(三) TVM An Automated End-to-End Optimizing Compiler

    全文翻译(三) TVM An Automated End-to-End Optimizing Compiler 5. 自动化优化 考虑到一组丰富的调度原语,剩下的问题是为DL模型的每一层,找到最佳的算 ...

  9. 全文翻译(二): TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

    全文翻译(二): TVM: An Automated End-to-End Optimizing Compiler for Deep Learning 3.优化计算图 计算图是在DL框架中表示程序的常 ...

  10. 全文翻译(一):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

    全文翻译(一):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning 摘要 人们越来越需要将机器学习应用到各种各样的硬件 ...

最新文章

  1. Webpack 的简单介绍
  2. python数据预测模型算法_如何对时间序列预测问题计算基准预测(python)
  3. java源码生成jar可执行文件
  4. java 有哪些反射机制_Java 的反射机制你了解多少?
  5. SCNCHECKPOINT
  6. linux内外部命令,Shell、内外部命令――Linux基本命令(2)
  7. bzoj2733永无乡
  8. day18__文件操作
  9. 霍夫曼编码实验matlab,哈夫曼编码 MATLAB程序
  10. 7-1 xbmc学习笔记
  11. Atitit webdav的使用与配置总结attilax总结 目录 1. 支持的协议 2 1.1. http File unc 2 2. 应用场景 2 2.1. 远程文件管理实现功能 文件建立
  12. php com adodb,php COM 连接ADODB.Connection数据库
  13. 数字孪生智慧医院:构建三维医疗看板可视化管理平台(四)
  14. centos 7 安装nvidia-container-runtime
  15. 有趣的概率:三门问题
  16. 史上最全软件测试入门到精通【测试+测开】
  17. [Datasheet PHY] ksz8081数据手册解读
  18. IntelliJ IDEA 项目中不小心把文件设置 Excluded 怎么恢复成原来的文件夹?
  19. java 财务报表_财务报表开发实例分析:几个通用维度介绍与关键点
  20. 【HTTP协议】简单的HTTP协议

热门文章

  1. python结合mysql 购物管理系统
  2. 软件开发生命周期(Software Development Life Cycle)(一)
  3. 物联网服务器Domoticz自带的消息推送到QQ邮箱
  4. SAEJ1757-1-2015(一)
  5. RadAsm模板修改
  6. [bzoj1001]狼抓兔子 最小割
  7. 可以嵌入ppt的课堂点名器_利用Python实现课堂点名器!辅导员大大的夸赞了我!...
  8. python爬虫之豆瓣图片(一)
  9. Shell 脚本常用命令
  10. 国产CI520 13.56MHz非接触式读写器NFC读卡芯片替代CV520