上一篇已经对本体构建模块涉及到的概念和技术做了简单的介绍,这一篇原本是想更为详细的讲解本体构建模块的具体实现,但是在写百度百科结构分析部分时写的内容过多,为了让文章更好阅读,这一篇就先只讲百度百科结构分析这一部分。
百度百科结构分析
百度百科是 Answer 系统本体库的主要数据来源,我们将利用 WebMagic 从百度百科抓取数据并利用 Jena 来构建本体库。
之所以选择百度百科作为构建本体库的数据源,是因为其具有半结构化的特点,这降低了从中抽取知识的难度。下面就举几个栗子来分析百科页面的结构特点:
- "周杰伦" 百科页面
- "美人鱼" (周杰伦创作歌曲)百科页面
对比两个页面可以发现,不同词条的页面具有不同的结构。虽然两个页面都具有基本的关于词条的简介,但是 "周杰伦" 页面具有 "代表作品"、"明星关系"等内容,而作为歌曲的 "美人鱼" 则没有。
所以对于百度百科来说,每个页面的内容并不是按照严格而统一的结构来描述的,页面结构将会因词条的不同而有所变化。
但与一般的互联网页面相比,百科页面又具有较为明显的结构性,如 "周杰伦" 页面中,页面开头为关于 "周杰伦" 的简介,之后是 "代表作品" 和 "明星关系"。之后还有如下内容:
从上图中可以查看到 "周杰伦" 的一些基本信息,如 "中文名"、"外文名"、"别名" 等。这种结构化的重要意义就是为我们提供了数据以及数据的语义。而这本质上就是我们需要抽取的知识,如对于属性"别名: 周董",我们就可以将其构造成知识 "周杰伦-别名-周董",并将其插入到本体库中。
但是在插入 "周杰伦-别名-周董" 这条知识到本体库之前我们忽略了一个问题。在页面中 "中文名"、"外文名" 其实都是一些文本数据,而 "别名" 同样是其中一个 "文本" 而已。我们如何知道 "别名" 这个文本代表属性名? "别名" 这个文本难道不能是词条的简介吗?
其实这里还需要对本文数据进行语义标识,但是幸运的是已经有人帮我们做了,虽然不彻底,但是勉强能用,他就是 —— HTML 标签。
实际上 HTML 数据本身就可以视为一种半结构化数据,例如 <title>Hello Coder!</title>
标签就为文本 "Hello Coder!" 提供了语义,我们可以通过 <title>
标签识别出文本 "Hello Coder!" 是网页的标题。
同理,我们可以通过 HTML 标签来标识页面中 "简介"、"基本信息"、"属性名" 等内容。例如百科中标签 <dt class="basicInfo-item name">中文名</dt>
标识属性名(如上文提到的中文名、外文名、别名等),<dd class="basicInfo-item value">周杰伦</dd>
标识属性值(如周杰伦、Jay Chou、周董等)。
但是在我们采用 HTML 来标识文本时需要注意的是 HTML 本身主要是用来定义资源的表现结构、格式和样式的,另外用户可通过 HTML 来发布和获取信息。但是对数据本身进行语义标注并不是 HTML 的工作。
如上提到的 <dt class="basicInfo-item name">中文名</dt>
标签其实也只是程序员为了更好的重用和分类样式,才在 dt 标签中加入 class 属性,而我们现在只是有点取巧的拿来当做文本的语义标注。所以必须意识到这种方式是存在很大局限性的,页面中极有可能存在 <dt class="basicInfo-item name">语义不明的一些文本</dt>
,如果我们把该文本解释为属性名自然是有误的。但是幸运的是百度百科中这种情况较少,HTML 标签具有较强标识性,姑且可采用 HTML 标签来识别文本语义。
在具体实现中,WebMagic 提供了 Xsoup(一款XPath解析器),Xsoup 可以让我们通过定义元素路径 Xpath,快速提取我们所想要的 HTML 数据。具体实现在下一篇中介绍。
一点补充: 语义网
其实在上述的分析过程中,你是否有这样的想法和思考。既然 HTML 描述万维网中资源的表现结构、格式和样式,那能不能创造一种语言来表达资源的语义?
举一个栗子,如发布一段文本 "周杰伦(Jay Chou),1979年1月18日出生于台湾省新北市"。在发布时,我们可以使用 HTML 发布,那么就需要加上 <html>
、<title>
、<body>
等标签,为的是表达这段文本的表现格式和结构,这也是为了让人更容易阅读。但是如果我们在发布时也按照某种规范描述了这段文本中数据的语义,如 "Jay Chou" 是周杰伦的别名, "1979年1月18日" 是周杰伦的出生日期,"台湾省新北市" 是周杰伦的出生地,那么这将使得这段本文能够被计算机阅读和理解。每个资源发布者如果都能按照这种规范发布资源,那么资源网络不仅能够让人阅读和理解,也可以让机器阅读和理解。他不仅仅是资源的网络,同时也是知识的网络。Excited !
实际上面所述便是语义网的概念,而语义网的提出者也正是万维网的发明者-蒂姆·伯纳斯·李。蒂姆·伯纳斯·李早在 1998 年就提出语义网,但是语义网的复杂度较高,距离真正的广泛工业应用还有一定的距离。感兴趣的同学可以查阅相关资料了解。
但话又说回来,在语义网还未完全实现之前,我们面对的依然是无语义的万维网,我们能抓取的大部分网页是无语义的文本内容,那么对于这些网页或者说非结构化文本如何提取知识并构建本体库呢?其实这是目前学术界还在研究的问题,自然语言处理、机器学习等技术自然是该领域比较常见的解决方法,但是效果依然非常不理想。
从严格意义上讲,从任意非结构化文本抽取出知识,这依然是当前技术无法实现的。试想一下,如果给定一段文本,计算机能够正确理解这段文本中每个数据背后的语义,这是多么恐怖的一件事,这从某种程度上讲意味着计算机真正具有了智能。
而目前还没有什么技术和现象表明我们有能力创造出人工智能,这里的人工智能指强人工智能,也就是大众理解的人工智能。实际上我认为人工智能这个词就应该只能指强人工智能,现在的弱人工智能应该用另外的词来表达,比如机器智能?计算机智能?人工函数拟合?人工统计学习?......不然大众和专业领域关于人工智能这个词的理解一直存在着本质上的区别,讨论的都不是一个东西,还相互讨论的那么热烈......如今的 "人工智能" 就和当年的 "黑客" 一样,不同之处在于以前是大众和媒体滥用 "黑客",现在是专业领域人员滥用 "人工智能"......
相对于利用所谓的 "人工智能" 实现从非结构化文本抽取知识,我还是更加看好实现语义网后推动机器智能的发展。
下一篇
下一篇真正开始介绍本体构建模块的实现细节。
汪
汪.