《Clojure数据分析秘笈》——1.7节将XML数据读入Incanter数据集

1.7 将XML数据读入Incanter数据集
一类非常常用的数据格式是XML,人们对其褒贬不一。但在某种情况下,几乎所有人都不得不处理它。Clojure可以使用Java的XML库,但它也有自己的包,这个包提供了一种在Clojure中使用XML的更自然的方式。

1.7.1 准备工作
首先,在Leiningen project.clj文件中引入以下依赖:

1.7.3 实现原理
本方法按以下顺序处理XML:
1. 解析XML数据文件。
2. 利用解析树抽取数据节点。
3. 将节点转换成代表数据的映射序列。
4. 最后,将其转换至Incanter数据集。
load-xml-data实现了这个过程。其中包括三个参数:输入文件名、传入解析完成的XML的根节点并返回第一个数据节点的函数,以及传入一个数据节点并返回下个数据节点或空值(如果其后没有节点)的函数。
首先,函数解析XML文件并将之装入zipper(将在后面的章节详细讨论zipper),然后利用传入的两个函数将数据节点抽取成一个序列。对于每个数据节点,获取其子节点并将其转换成一系列“标签名/内容”对。每个数据节点的对转换成一个映射,然后映射序列转换至Incanter数据集。

1.7.4 更多信息
本方法中使用了一对有趣的数据结构或概念。这两种数据结构在函数式编程语言或者Lisp中都很常见,但是都未出现在主流的编程语言中,接下来深入学习一下。
利用zipper浏览结构
解析完成后的XML文件需要作为参数传入clojure.zip/xml-zip。这将使用Clojure本身的XML数据结构并将其转换成可以用如clojure.zip/down和clojure.zip/right之类的命令进行快速浏览。作为一门函数式编程语言,Clojure使用不可变数据结构;而zipper提供了一种浏览、修改类树结构的高效、自然方法,例如XML文档。
zipper非常实用且有趣,理解它们有助于理解如何使用不可变数据结构。如需关于zipper更详细的信息,Clojure关于其的文档会有帮助(http://clojure-doc.org/articles/tutorials/parsing_xml_with_zippers.html)。但是如果很喜欢刨根问底,参考杰拉德·休伊特的论文“The Zipper”(http://www.st.cs.uni-saarland.de/edu/seminare/2005/advanced-fp/docs/huet-zipper.pdf)。
流水线处理
可以使用->>宏来以流水线的方式展示处理过程。对于深度嵌套的函数调用,这个宏需要从右往左阅读,这使得处理过程的数据流和转换序列更清晰。
在Clojure中可以执行流水线处理是因为它的宏系统。->>仅将函数调用重写成Clojure本身的嵌套的格式,与格式读入的方式一样。传入宏的第一个参数将作为下一个表达式的最后一个参数插入。数据结构则插入第三个表达式作为最后一个参数,等等,直到这种格式结束。也就是说,以(->> x first (map length) (apply +))表达式开始。接下来是Clojure构建最终表达式的一系列中间步骤(需要整合的元素在每个阶段都会高亮显示)。
1. (->> x first (map length) (apply +))
2. (->> (first x) (map length) (apply +))
3. (->> (map length (first x)) (apply +))
4. (apply + (map length (first x)))
比较XML和JSON
XML和JSON(在1.4节中提到)非常相似。可以证实的是,JSON的流行很大程度上是被对XML冗长特性的醒悟所驱动的。
当在Clojure中处理这些格式的数据时,最大的不同在于JSON数据是直接转换成对应数据内容的Clojure内部数据结构,例如映射和向量。然而对于XML而言,XML被读入至反映XML结构的记录类型,而不是反映数据结构的记录类型。
换句话说,JSON中的映射的键值来自域,例如,来自first_name或者age。然而,XML中映射的键值来自数据格式、标签、属性或者子节点,也就是说,标签和属性名来自域。这额外的一层抽象使得XML更加不灵活。

时间: 2024-09-19 09:00:50

《Clojure数据分析秘笈》——1.7节将XML数据读入Incanter数据集的相关文章

《Clojure数据分析秘笈》——1.3节将CSV数据读入Incanter数据集

1.3 将CSV数据读入Incanter数据集 以逗号分隔值(CSV)是最简单的数据格式之一,并且这种数据格式应用非常普遍.Excel可以直接读写CSV文件,而且多数数据库也可以.由于CSV文件就是无格式的文本,因此使用任何编程语言都很容易生成或者访问它.1.3.1 准备工作 首先,确保加载了正确的库.Leiningen(https://github.com/technomancy/leiningen)的项目文件project.clj file应该包含以下依赖(也可以使用更新的版本): 这个文件

《Clojure数据分析秘笈》——1.4节将JSON数据读入Incanter数据集

1.4 将JSON数据读入Incanter数据集 另一个越来越流行的数据格式是JavaScript Object Notation(JSON,详见http://json.org/).与CSV相似,JSON也是无格式的文本,因此程序容易处理.它提供了相对于CSV文件关于数据的更多信息,但是代价是更冗长.JSON格式允许用更复杂的方式使数据结构化,例如层次结构或者序列层次结构. 由于JSON是比CSV更完善的数据模型,因此使用时可能需要转换数据.在这种情况下,可以将感兴趣的信息取出,在传入Incan

《Clojure数据分析秘笈》——1.1节引言

第1章导入分析数据1.1 引言如果没有大量数据是无法进行数据分析的,因此任何项目的第一步都是评估有什么样的数据和需要什么样的数据.一旦知道需要什么样的数据,就要想办法得到它.本章和本书中的许多方法使用Incanter(http://incanter.org/)导入数据并规定使用Incanter数据集.Incanter是Clojure中完成统计分析和图形化显示的库,其作用类似于R.Incanter可能并不适用于所有任务(后面将使用Weka库进行聚类和机器学习),但它仍是在Clojure中进行数据分

《Clojure数据分析秘笈》——1.10节读取RDF数据

1.10 读取RDF数据使用不同格式的链接数据越来越多地出现在互联网上:微格式(microformat).RDFa和RDF/XML是其中的一些常见形式.链接数据提供了更大的灵活性且功能强大,但是其处理过程比较复杂.通常,为了高效处理链接数据,需要使用某种类型的三元组存储.在本方法和接下来的三种方法中,将用到Sesame(http://www.openrdf.org/)和kr Clojure库(https://github.com/drlivingston/kr). 1.10.1 准备工作首先,需

《Clojure数据分析秘笈》——3.1节引言

第3章 使用并发编程管理复杂度3.1 引言 设计和创建一个计算机系统是一个均衡行为:不断地添加特性和功能并保持代码简单和系统性能合理.数据分析系统也是如此.事实上,数据分析系统问题更糟糕.通常而言,数据只是部分一致,在开始分析之前需要采取多种策略来抽取有用数据. 这会导致问题失控. Clojure有一系列可以帮助管理系统复杂性的工具.这些最强大的工具之一是并发编程.这使得可以使用另外一种方式设计程序.与之前一段代码做很多事情并且有非常直接.紧密的依赖关系不同,可以通过将许多完成不同功能的独立模块

《Clojure数据分析秘笈》——2.2节使用正则表达式清洗数据

2.2 使用正则表达式清洗数据大概最基本.最普遍的数据清洗方式就是正则表达式了.尽管有时被滥用,但是很多时候正则表达式是完成一项工作最适合的工具.而且,Clojure内置编译正则表达式的语法,因此在Clojure中使用正则表达式也很方便.本例将编写一个标准化美国电话号码的函数. 2.2.1 准备工作本方法需要在脚本或REPL中使用clojure.string库.表达式如下: 2.2.3 实现原理本方法中最复杂的部分是正则表达式,接下来对其详细讲解.(?x):这是本身并不匹配任何内容的标识符.它允

《Clojure数据分析秘笈》——2.10节修正拼写错误

2.10 修正拼写错误 拼写错误是某些时间需要处理的问题.特别是当你试图处理原始的文本数据时,拼写错误会对你的工作造成较大影响. 曾几何时,拼写检查器是进行多种优化的软件的重要部分,这些软件被限制运行于日常工作计算机环境下.现在情况不是这样了.Peter Novig在互联网上发布了一篇名为"如何编写拼写检查器程序"(http://norvig.com/spell-correct.html)的文章.它展示了如何读入被假定为拼写无误的文本并根据这些文本构建拼写检查器.他提供了一个使用Pyt

《Clojure数据分析秘笈》——1.11节使用SPARQL读取RDF数据

1.11 使用SPARQL读取RDF数据在前面的方法中,查询中使用的嵌入式领域专用语言转换成SPARQL(许多种链接数据的查询语言).如果你仔细观察查询,可以发现它好像SPARQL的where子句.它是简单的查询,但其功能并不简单.如果可以访问自己的三元组存储中的原始数据,这种方法很有效.然而,如果需要直接访问远程的SPARQL终端,这个过程会更复杂一些.本例中,在DBPedia(http://dbpedia.org)中查询阿拉伯联合酋长国的货币-迪拉姆.(driham)DBPedia将维基百科

《Clojure数据分析秘笈》——1.12节整合不同格式的数据

1.12 整合不同格式的数据如果能够从多种链接数据源整合数据,这样的作用很大,但是多数数据格式不适用于语义网.幸好链接数据灵活动态的数据模型有助于整合多源数据.在本方法中将结合前面的一些工作.从RDF中读入货币数据(与1.10节中相同),并从X-Rates(http://www.x-rates.com)网页表中信息抓取汇率数据(与1.8节中相同).最后,将所有数据存入三元组存储中并再将其取出使用(与1.11节中相同).