(许野平的Watson Explorer 学习笔记)
关于 IBM Watson Explorer
IBM Watson Explorer 这个产品并不容易弄明白其运行机制。我看不少朋友虽然参加过几次培训了,但是仿佛还是有些云里雾里说不清楚门道。所以我觉得有必要停下脚步,整理一下学习笔记,理一理 Watson Explorer 的架构体系和开发的基本方法,或许能帮助初学的朋友们快速入门。
学习 Watson Explorer 的目的纯粹出于产品开发的需要。我目前从事服务机器人开发,我个人认为,机器人短期内不可能达到人类的思维水平。别拿 AlphaGo 来给我说事,因为下棋这种活就是挺适合用计算机来做。尽管如此,但是我们还是有可能让机器人看上去有生命、会思维。我觉得主要解决两个问题:一个是让机器人学会用眼睛注视人,这个技术上不难做到,但是国内厂商似乎对这个不感兴趣,这个令我很郁闷;另一个是让机器人要能与人对话,我觉得这个比较有挑战性,我对搞定这个问题很感兴趣。
IBM Watson 系统曾在美国一个竞答电视节目中战胜人类冠军,其中用到的技术就是基于 Watson Explorer 的。所以,我觉得利用这个产品,应该有助于我快速达成目标。
既然是整理学习笔记,基本上就是按照学习过程写的,不一定很有逻辑性。这个只能等我整理完全部内容,再按照一定的逻辑关系另写一份教程了。
Watson Explorer 的关键概念
我们开发应用系统,一般离不开数据库。在关系型数据库中,其数据存储在表中,表又分为若干字段,为快速检索,有些字段又有索引。
Watson Explorer 和数据库有很多类似的地方。数据库以结构化的形式处理数据,Watson Explorer 则以半结构化和非结构化形式处理数据。尽管数据结构差别很大,但是宏观思路还是有很多相思的地方。
集合(Collection),是 Watson Explorer 的核心,无论是搜索,还是分析,都是围绕着Collection 展开的。Collection 类似数据库中的表(Table),更类似数据仓库中的多维数据集(Cubes),如果有数据库、数据仓库的经验,很容易理解 Watson Explorer。
(这一部分还没写完,待续… …)
结构化、半结构化、非结构化数据
在我们和计算机打交道的过程中,会遇到三种类型的数据:结构化数据、半结构化数据、非结构化数据。
- 结构化数据:格式固定的数据。常规数据库中的大部分数据、Excel表中按照固定格式填写的数据,基本上都属于结构化数据。
- 半结构化数据:虽然数据没有固定的格式,但是数据项带有类别说明之类的附加信息。例如“姓名=特朗普,职务=美国总统”这样的说明,可以看作是半结构化数据。
- 非结构化数据:完全没有任何格式信息的数据。例如我们平时看到的文章、书籍等文字信息,就是基于自然语言的非结构化数据。
非结构化数据的地位
我们每天都浏览的互联网、读报纸、看电视,接触的信息几乎全部分都是非结构化数据。
非结构化数据在人类交流互动中占据绝对的数量优势,这并非偶然的结果。人类擅长阅读各类非结构信息,例如文章、音频、图像、视频等。如果每天上网看到的都是各种数据报表,恐怕人类就受不了了。所以,即使计算机内部处理的都是各种结构化数据,最终呈现给人类的时候,也都会转换成各种直观的非结构化数据的形式。
Watson Explorer 是帮助我们处理非结构化数据的开发工具,是 IBM Watson 认知技术家族的底层产品,大概类似 MySQL 在数据库应用系统中的地位。如果我们打算开发基于自然语言、图像、视频等非结构化数据的应用系统,Watson Explorer 可以提供比较丰富的底层支持能力。这里提供的第一个练习,是一个非常基础的入门练习,利用一个简单的非结构化数据分析过程,展示 Watson Explorer 的基本操作。
测试数据:NHTSA
NHTSA是美国高速交通安全管理局的缩写,英文全称为National Highway Traffic Safety Administration 。由于享有很高的权威性和公正性,其每年的测评结果不仅在美国本土为广大消费者所认可,也被全球范围内消费者作为汽车购买的权威标准。
这里我们用NHTSA提供的客户投诉数据,看看如何利用 Watson Explorer 分析这些基于自然语言的投诉内容,看看从中能得到什么有价值的信息。
我研究了一下NHTSA的客户投诉记录,发现还算不上完全非结构化的数据,宏观上看包括 36 个字段。列表如下:
序号 | 字段名称 | 字段类型 | 说明 |
---|---|---|---|
1 | CMPLID | CHAR(9) | 投诉记录的唯一编码,但是当数据被传送至下一处理节点时,该编码有可能被修改。 |
2 | ODINO | CHAR(9) | NHTSA 的内部参考号码。该号码可能被多个部件重复引用。 |
3 | MRF_NAME | CHAR(40) | 制造商名称。 |
4 | MAKETXT | CHAR(25) | 车辆/设备制造。 |
5 | MODELTXT | CHAR(256) | 车辆/设备型号。 |
6 | YEARTXT | CHAR(4) | 型号年份,9999表示未知。 |
7 | CRASH | CHAR(1) | 车辆是否受过撞击,用Y和N表示。 |
8 | FAILDATE | CHAR(8) | 事故日期 |
9 | FIRE | CHAR(1) | 是否着火,用Y和N表示。 |
10 | INJURED | CHAR(2) | 事故中受伤人数。 |
11 | FATALITIES | CHAR(2) | 事故中死亡人数。 |
12 | COMPDESC | CHAR(128) | 部件规格描述。 |
13 | CITY | CHAR(30) | 消费者所在城市。 |
14 | STATE | CHAR(2) | 消费者所在州的编号。 |
15 | VIN | CHAR(11) | VIN编码。 |
16 | DATEA | CHAR(8) | 添加到文件中的日期。 |
17 | LDATE | CHAR(8) | NHTSA接收到投诉的日期。 |
18 | MILES | NUMBER(7) | 失效时的行程英里数。 |
19 | OCCURENCES | NUMBER(4) | 事故数量。 |
20 | CDESCR | CHAR(2048) | 投诉详细描述。 |
21 | CMPL_TYPE | CHAR(4) | 投诉源代码。 |
22 | POLICE_RPT_YN | CHAR(1) | 是否报警,用Y和N表示。 |
23 | PURCH_DT | CHAR(8) | 购买日期。 |
24 | ORIG_OWNER_YN | CHAR(1) | 是否为首位车主。 |
25 | ANTI_BRAKES_YN | CHAR(1) | 是否有防滑功能。 |
26 | CRUISE_CONT_YN | CHAR(1) | 是否有巡航控制。 |
27 | NUM_CYLS | NUMBER(2) | 发动机缸数。 |
28 | DRIVER_TRAIN | CHAR(4) | 传动方式(AWD,4WD,FWD,RWD)。 |
29 | FUEL_SYS | CHAR(4) | 燃料系统(FI=Fuel Injection,TB=Turbo)。 |
30 | FUEL_TYPE | CHAR(4) | 燃料类型(FI=Fuel Injection,TB=Turbo)。 |
31 | TRANS——TYPE | CHAR(4) | 档位类型(手动,自动)。 |
32 | VEH_SPEED | NUMBER(3) | 车辆速度。 |
33 | DOT | CHAR(20) | 运输轮胎标识部门。 |
34 | TIRE_SIZE | CHAR(30) | 轮胎尺寸。 |
35 | LOC_OF_TIRE | CHAR(4) | 轮胎代码位置。 |
36 | TIRE_FAIL_TYPE | CHAR(4) | 轮胎失效代码。 |
翻译完这一段快累死我了,谁要是引用我的成果,强烈要求注明本作者版权,哈哈哈!
内容我仔细看了一下,非结构化数据主要体现在第20个字段,投诉内容的详细描述部分。这一部分内容是基于自然语言的文字描述。Watson Explorer 有多大本事? 接下来我们看看它从这一部分内容中能挖掘出什么价值的内容。
构面(Facet)
Watson Explorer 有一个很重要的概念——构面,英语是 Facet。
构面是咋回事呢?我现在只能给一个大致的说明。比如说,客户询问计算机系统“我有些头痛,是不是感冒了?”。
如果有一种机制,能够帮助我们说明“头痛”是一种病症,“感冒”是一种疾病,那么这句话就很容易转化成半结构化的形式“病症=头痛,疾病=感冒,问题=确认疾病”。这样的话,后续处理就会很容易了。于是乎, Watson Explorer 实现了这一机制,在这种机制下,上面说的病症、疾病等都以构面的进行设置定义。比如我们可以定义一个名称为“病症”的构面,并把“头痛”等词汇设置为该构面的元素,这样在句子中看到“头痛”这个词,就可以标注为“病症”。
和结构化数据比较的话,构面非常类似数据库中“字段”的概念。如果把表的行当作一句话来分析的话,数据库表中的每一行的句子结构都是完全一样的。而基于人类自然语言的句子,则无法做到和数据库的表一样完全严格的结构化。因此,不能保证构面何时何地在何处出现。但是,我们可以利用构面,把自然语言句子实现半结构化分析。
当然这只是简单的说说而已,构面真正的价值和作用需要在后续的练习中慢慢体会和了解。
为 HNTSA 的数据设置构面
为了在内容分析挖掘器(Content Analytics Miner)中分析 HNTSA 提供的数据,我们需要设计一些构面。在本练习中,我们设置下面这些构面(Facet)。当然这里的构面直接借助投诉表的字段来定义。
- CDESCR CMPL_TYPE(facet - Complaint Source)
- COMPDESC(facet - Component)
- CRASH(facet - Crash)
- DEATHS(facet - Deaths)
- FAILDATE (facet - Fail Date)
- FIRE(facet - Fire)
- INJURED(facet - Injured)
- MAKETXT (facet – Make)
- MFR_NAME(facet - Manufacture)
- MODELTXT (facet - Model)
- YEARTXT(facet - Year)
由于这些构面的内容和数据类型的特点,在使用过程中可以设置多种不同的搜索选项。下面列举了这些构面一些可能选项:
- 可作为搜索结果(Returnable) - 可在搜索结果中显示字段的值。
- 构面搜索(Faceted search) - 字段在搜索结果中可作为构面显示。
- 自由文本搜索(Free text search) - 字段可以接受自由文本搜索。
- 字段搜索(Fielded search) - 字段可以按照字段名称搜索。
- 参数搜索(Parametric search) - 字段可以接受参数化查询和排序。可以同时指定该选项和文本排序选项。
- 可分析(Analyzable) - 字段作为文档内容进行分析。
例如,在本练习中,我们可以按照如下方式设置这些选项:
字段名称 | 可作为返回结果 | 自由文本搜索和文档汇总 | 字段搜索 | 参数搜索 | 可分析 | 构面搜索 |
---|---|---|---|---|---|---|
CDESCR | Yes | Yes/Yes | No | No | Yes | Yes |
CMPL_TYPE | Yes | Yes/Yes | Yes | No | No | Yes |
COMPDESC | Yes | Yes/Yes | Yes | No | Yes | Yes |
CRASH | Yes | No/No | Yes | No | No | Yes |
DEATHS | Yes | No/No | Yes | No | No | Yes |
FAILDATE | Yes | Yes/Yes | Yes | Yes/Date | No | No |
FIRE | Yes | No/No | Yes | No | No | Yes |
INJURED | Yes | No/No | Yes | No | No | Yes |
MAKETXT | Yes | Yes/Yes | Yes | No | No | Yes |
MFR_NAME | Yes | Yes/Yes | Yes | No | No | Yes |
MODELTXT | Yes | Yes/Yes | Yes | No | No | Yes |
YEARTXT | Yes | No/No | Yes | No | No | Yes |
到此为止,我们了解了非结构化数据的相关概念,接下来我们要探讨如何利用 Watson Explorer对这些数据进行分析。
(未完待续……)