语义在哪都有
- Sir Tim Berners-Lee 的语义网(Semantic Web),HTML的article/header标签,爬虫
- Semantic Mediawiki
- 用于视频监控、自动驾驶的语义分割(Semantic Segmentation)
- 对话机器人/聊天机器人的对话管理中的语义帧(Semantic Frame)
- 前端框架Semantic UI
它们的共同点是什么?是有语义(Semantic)!这个词在
那么什么是语义?
Wiki对语义的一段介绍是这样的:
https://en.wikipedia.org/wiki/Semantics
Semantics (from Ancient Greek: σημαντικός sēmantikós, "significant")[1][a] is the linguistic and philosophical study of meaning in language, programming languages, formal logics, and semiotics. It is concerned with the relationship between signifiers—like words, phrases, signs, and symbols—and what they stand for in reality, their denotation.
我觉得这个描述还是太形式化了,是无法让人简单理解的,或者这个词汇本身就不好,太泛泛。那么我们分别说上面指的所有语义存在的地方,它们各自的“语义”是什么。
语义网
语义网的语义,最简单的对应就是HTML5新加入的的语义标签:
从名字可以看出有些是侧边(aside),有些是图表(figure),有些是页脚(footer)。首先,这些标签在浏览器渲染的时候,除了部分标签有特殊方法渲染,基本上都是一视同仁的,或者说人看起来与一致。
那么,它们其实是给机器看的。如果只看文字,机器看不懂你这一段文字是标题还是正文,是时间、还是侧边栏,而人通过写给机器一个标签,也就是你需要把你这段文字的“语义信息”告诉机器,告诉机器这段文字到底是图、标题、正文、摘要还什么其他的东西。你告诉机器了,机器才能更精确的分辨出具体是什么,并且也能更方便的让这些数据信息在不同的机器之间流转(不同站点、不同服务、不同应用),为以后人类知识的流动加速创造条件。
Semantic Mediawiki
Mediawiki就是Wikipedia所使用的wiki程序的名字。由PHP开发,2002年启动,2003年命名。
Semantic MW是Mediawiki的一个插件,也就是给MW增加了语义。
那么它做了什么呢,维基百科的一个作用其实是总结知识,而总结来的知识更好的用途是可以查询。例如你可以维基百科查询中国有多少人口,美国有多少人口,只要分别在中国、美国的页面看就有。那么如果你想知道人口超过1000万的国家都有哪些?只下的呢?2000万呢?
当然你也可以自己或者请人专门去收集、总结这些内容,但是一个明显更好的做法是,假设维基百科是可查询的,我只需要像SQL语句一样“SELECT NAME FROM WIKI WHERE POPULATION > 10,000,000”就可以得到结果,不是更好吗。
怎么做呢,百科本身是有文字的,但是文字没有语义,机器不知道这个数字是什么具体的意思,是人口、面积还是成立时间?。所以我们可以通过加入语义来解决这个问题,假设你正在看“中国”这个页面,假设里面有一句话要得到这些结果其实机器是无法直接解析的,就算解析也需要其他程序、算法辅助(例如使用NLP中的Open Information Extraction技术),但是这些算法本身就收到准确率、后验等影响,那么如果我们在编辑文本的时候,就使用一些成本加入一些语义信息呢?
SMW的写法如下:
中国是一个发展中[[is a::国家]],它的首都是[[has Capital::北京]]。
上面这句话在显示的时候,和之前的自然语言句子是一样的。但是机器通过解析里面的符号,可以得到更多的知识。因为这个页面是在“中国”这个词条下的,所以我们可以得到三元组:
(中国,is a,国家)
(中国,has Capital,北京
这些主谓宾或者主语、属性名、属性值组成的三元组,是更丰富的,机器可读的语义信息,语义知识,可以更方便的搜索。例如我可以简单的查询,国家都有哪些,只要知道有谁 is a 国家就好了。
用于自动驾驶的语义分割(Semantic Segmentation)
语义分割首先是属于计算机视觉(Computer Vision)的一项技术/算法,它的目的是分解图片或视频,给每个部分打上语义标签,例如:
对话机器人/聊天机器人的对话管理中的语义帧(Semantic Frame)
对话系统的语义帧(Semantic Frame)其实有很多叫法,例如Belief,例如Dialog State等等。
它保存的其实是对话的上下文信息,或者说上下文的语义信息。
我们可以假设我们是一个机器人,或者说我们所做的每一步行为必须有推理,那么我们要对话、通过对话完成任务的时候,应该怎么做?
首先我们看我们在对话过程中有什么上下文吧(简单版本,复杂的可能还包括更多轮次的信息、槽值实体等):
- 上一句机器人(我,即假设我是机器人)表达了什么意图(第一轮可以为空)
- 当前用户表达了什么意图(第一轮可以为空)
例如总是机器人先发起对话:
机器人:你好(问候时的语义意图,自然语言可能是:你好、hi、hello、吃了没)
用户:我要买票(表达买票的语义意图,自然语言可能是:买票,卖票吗,我要买啦)
机器人:买票需要10元,确认吗?(表达需要用户确认的语义意图)
用户:没问题(表达肯定的语义意图,自然语言可能是:yes/是的/好的/ok啦)
那么我们站在最后一轮,当前的语义信息是:
- 上一轮机器人表达了:需要用户确认的语义意图
- 当前用户表达了:肯定的语义意图
如果需要一个逻辑推理,或者计算机程序,那么我们就可以写如下的推理步骤:
如果 (上一轮机器人表达了:需要用户确认的语义意图) 并且 (当前用户表达了:肯定语义意图) {
做什么
}
如果 (上一轮机器人表达了:需要用户确认的语义意图) 并且 (当前用户表达了:否定语义意图) {
做什么
}
也就是自然语言被解析为了意图,意图被记录为了语义上下文,然后最后机器人根据这些语义来决定之后的行为(即进行推理)。
前端框架Semantic UI
在开发Web的过程中,有时候我们需要精确的描述一个东西,比如这个按钮需要20个像素,不能多一个也不能少一个。但是很多时候,我们其实需要的是一个模糊的,语义特征化的描述,例如:这里我需要一个大按钮,那里我需要一个小按钮。
至于这个“大按钮”和“小按钮”其实在不同的浏览器软件、不同浏览器宽度、不同平台(手机、电脑、平板)、不同设备(例如设备分辨率不同),可能所代表的像素大小(实际大小)其实是可以不一样的。
如果要每个程序员必须针对所有可能的组合都要重新定义一遍所谓“大按钮”的不同像素宽高,是成本非常高的。那么如果我们实现把一些常用的信息语义化,让你告诉程序这里需要一个“大按钮”,至于到底多大由程序库按照普遍的开发经验(即/或社区经验)自动调整,是不是更好?
这就是一个将实际精确的东西模糊化、语义化的过程,它的目的是带来更好的通用性、广泛性。
总结
以上我们描述了不同环境下“语义”的作用和用法,但是我依然无法用精炼且简要的文字给语义做一个定义,我们可以认为它就是一个符号,这个符号是用一个稍微模糊的词汇,去代表太多太具体的事物。
- 例如在对话机器人,我们用“问候语义意图”来代表“你好、hi、你好吗”等多种自然语言语言;
- 在自动驾驶中,我们用“树”这个语义代表街道路边可能出现的“杨树、柳树、松树”等等不同的树;
- 在Web编程中,我们用“大按钮”这个语义,来代表不同平台、分辨率、PPI下的足够符合人类感知的不同的大的宽高像素数。