内容简介:自然语言是人类文明传承和日常交流所使用的语言。狭义的自然语言处理是使用计算机来完成以自然语言为载体的非结构化信息为对象的各类信息处理任务,比如文本的理解、分类、摘要、信息抽取、知识问答、生成等的技术。进一步延展场景,广义的自然语言处理技术也包含自然语言的非数字形态(如语音、文字、手语等)与数字形态之间的双向转换(识别与合成)环节。鉴于自然语言丰富地表现了人类的认知、情感和意志,潜在地使用了大量常识和大数据,自身在算法和模型上也多采用各种启发式线索,目前一般均把自然语言处理作为人工智能的一个分支。最近,在人工
自然语言是人类文明传承和日常交流所使用的语言。狭义的自然语言处理是使用计算机来完成以自然语言为载体的非结构化信息为对象的各类信息处理任务,比如文本的理解、分类、摘要、信息抽取、知识问答、生成等的技术。进一步延展场景,广义的自然语言处理技术也包含自然语言的非数字形态(如语音、文字、手语等)与数字形态之间的双向转换(识别与合成)环节。鉴于自然语言丰富地表现了人类的认知、情感和意志,潜在地使用了大量常识和大数据,自身在算法和模型上也多采用各种启发式线索,目前一般均把自然语言处理作为人工智能的一个分支。最近,在人工智能领域出现重要进展、人工智能应用受到各行各业热切期待,自然语言处理技术也水涨船高,受到普遍的重视。本文对自然语言处理技术做一 “入门级的” 初步介绍,有进一步兴趣者可参阅专业资料。
NLP 的源与流
自然语言处理作为人工智能的一个分支,其源头和人工智能一样,都出自于计算机科学的祖师爷级人物——阿兰 · 图灵。图灵在提出图灵测试的时候,就把使用自然语言与人进行对话可以乱真的能力作为判别一个机器系统有无智能的标准。在图灵的时代,让机器 “善解人意” 是人工智能的诗与远方,在当时的技术条件下还看不到实现的希望。
使用简单直接的词袋技术和模板匹配技术,是处理自然语言早期尝试的开始,冲在最前面的是机器翻译和人机对话。由于没有掌握自然语言的要领,早期的机器翻译和人机对话系统总体上表现稚嫩,充其量只能是玩具系统。
数据库技术和专家系统技术都具有较为复杂的查询和使用逻辑,其内部表示和人类用户所熟悉的自然语言表示具有较大的差异,为弥补这方面的人机差距,实现更加友好的人机互动,利用自然语言处理技术为数据库和专家系统等提供自然语言接口是早期自然语言处理技术发展的动力之一。但是由于图形人机界面技术的发展,冲淡了对自然语言接口的需求,加之自然语言处理技术本身还要攻克大量难关,数据库和专家系统的自然语言接口直到多年以后的 Watson 系统才得以展现其威力,在此之前只是一个不太被看好的 “弃儿”。
随着语言学领域在乔姆斯基的倡导下发生了天翻地覆的革命,形式化方法被引入语言学,用于刻画自然语言的句法结构,形式语言理论蓬勃发展,形成了乔姆斯基形式语言理论框架体系。在这个体系下,语言被分为 0 型(短语结构语法)、1 型(上下文相关语法)、2 型(上下文无关语法)和 3 型(正则语法),它们的成员判定问题复杂度依次为半可判定、NP 完全、多项式和线性。对于各种自然语言来说,大体上占到 2 型的很少但很不规则的一部分,但部分现象呈现上下文相关性,会在局部对 2 型有所突破。这就是笔者所说的 “毛毛虫” 现象。
按照当代语言学理论,自然语言分符号、词法、句法、语义和语用五个层面。在符号层面,有语音、文字、手语和电子输入。在词法层面,有词典、词性标注、词的形态变化、构词法等。在句法层面,有词对词的关联 / 依存关系,以及短语对短语的结合 / 拼接关系。在语义层面,有语义标签与它们在现实 / 想象世界中的所指之间的映射关系和语义标签之间的角色指派关系。在语用层面,有语言成分与语境之间、字面意义和言外之意之间的复杂互动关系。一般称的 “语法”,包含了词法和句法两个层面。
针对自然语言的特性,在形式语言理论框架下建立不同的模型,形成了自然语言处理的诸多形式化机制,基于规则的形式化机制包括 LFG(词汇功能语法)、GPSG(广义短语结构语法)、HPSG(中心词驱动的短语结构语法)、DG(依存语法)、CG(范畴语法)、CCG(组合范畴语法)等,基于统计的形式化机制包括 HMM(隐马尔科夫模型)、PCFG(概率上下文无关语法)等,基于联结的形式化机制包括 CNN(卷积神经网络)、RNN(循环神经网络)、LSTM(长短时记忆模型)等。具有交叉学科性质的 “计算语言学”,就是自然语言处理技术在模型、算法级的研究领域的集中体现。
实际上,鉴于欧氏空间具有良好和丰富的数学 工具 可用,语言 / 文本的向量化努力是跨越统计和联结两大阵营的。基于统计的向量化方法是隐性语义标引(LSI)模型,基于联结的向量化方法是词嵌入(Word embedding)模型,前者具有保距离特性,后者具有保运算特性而且可与任务派生的优化目标深度耦合。目前,嵌入技术已经不局限于词,也可以整结构、整句嵌入了。但是总体说来,当前技术能够大规模处理的,仍然只是具有 “浅层句法” 或者 “简单标记” 的 NLP 任务。更复杂语言现象的理解、更复杂语义关系的抽取,仍然任重道远。
随着日本五代机计划的失败,第二波人工智能浪潮消退,互联网在 WWW 的出现后迅速崛起,NLP 技术穿上了互联网马甲,搭上了搜索引擎的班车,成为了一门互联网应用技术。在无比简单的搜索框背后,是各种 NLP 技术的组合体,文本的分类、聚类、摘要、协同过滤、信息抽取、机器翻译…… 可以说应有尽有。这段时期之所以 NLP 既远离 “人工智能” 的招牌,也远离 “计算语言学” 招牌,是因为人工智能招牌在当时并无正面贡献,而语言学家在经验主义范式下不得施展甚至每每成为负担。而互联网这棵大树却足够容纳 NLP 的一系列成果。大型互联网公司在机器翻译领域的出色表现很好地证明了这一点。
随着深度学习技术以摧枯拉朽之势横扫语音、图像识别和浅层自然语言处理各类任务,知识图谱技术为语义知识处理走向各行各业做好技术栈和工具箱的铺垫,人工智能招牌强势的王者归来已经在所难免,自然语言处理技术也自然地成为了这王者头上的王冠。这是因为,语音和图像识别大局已定。自然语言处理已经成为一种应用赋能技术,随着实体知识库的构建、知识抽取和自动写作在特定领域的实用化和对话机器人从对接语料到对接知识图谱的换代,正通过新一代人工智能创新创业团队,全面渗透到人工智能应用的各个角落。自然语言处理从浅层到深层面临范式转换,还处在对接情感计算与常识计算的战略性要地的关键位置。谁能拔得头筹,谁就能在当下的人工智能 “军备竞赛” 中处于有利地位。
回顾 NLP 技术的发展历史,可以清晰地看到几个流派各领风骚数十年的沿革和范式转换的踪影。从上世纪五六十年代到八十年代,是 “理性主义” 学派盛行的年代,是基于规则的范式主导的年代。上世纪九十年代开始,“经验主义”学派开始反超,基于统计的范式繁荣了近二十年,终于在 2010 年前后被同为 “经验主义” 学派的基于联结的范式所全面取代。这是深度学习算法显现的巨大威力,也是数据和算力积累到临界点的一次综合性的爆发。目前,基于联结的范式风头正盛,但 “深度” 自然语言处理的需求压力之下,“理性主义”学派以某种方式再度回归,实现 “波粒二象性” 的有机结合,也是可期待的。
分词与词法
词法(Lexicon)是自然语言处理的基础层次。西方语言文字多采用空格作为词间间隔的标记,相对易认易解析。汉语、日语等东方语言多采用无空格的词语连写格式,因此需要一个额外的环节,就是分词。
按给定词典进行分词,是中文自然语言处理的经典研究方向,现已有相对成熟的算法和技术。并不是说这样的算法和技术可以独自在词法层面解决所有分词难题,而是说靠这样的技术可以大体上保持一个较高的水准,还有一些分词有歧义的场合,需要结合更大的上下文背景、甚至结合句法分析、语义分析等后续工序的逆向选择,才能够搞定。
分词歧义分成两类:一类叫做 “组合歧义”,另一类叫做“交叉歧义”。“我家家门口的小河很难过” 当中的 “难过” 是一个词 “难过” 还是两个词 “难 / 过”,这是组合歧义。“上交所有非法所得” 当中的 “上交所有” 是“上交 / 所有”还是“上交所 / 有”,这是交叉歧义。这类歧义现象,有的通过上下文句法、语义关系甚至词语的统计分布特征就很容易排除,有的则需动用更高深的情感和常识机制才能排除,这些都是“伪歧义”。除了伪歧义之外还有真歧义,就是必须在具体语境中才能明确的歧义。
依照词典进行分词并不是词法层面的分析任务。其他任务也很实际并且同样具有挑战性。下面我们依次列出除分词之外的词法分析任务,并简述其工作目标和技术难点。
词性标注(POS tagging)。给分出来的词做词性标注,一方面是对那些理论上有多种标注可能、但特定上下文中只有标注可能的词通过标注来消除歧义(比如 “指挥” 既可以是名词又可以是动词;同为名词的“指挥”,既可以指事,又可以指人),另一方面,标注之间的连接和共现关系可以更好地帮助解决分词问题。所以,加上词性标注的分词过程和结果,不仅更有利于后续工序(构词法和句法分析)的处理,也使词法分析这道工序本身获得更多的启发式信心。这样一来,采用何种标注体系,就成了技术路线选择躲不过去的坎儿。选择的依据,一是取决于应用场景的实际区分度需求,二是取决于开发者的语言学理念。业界比较常用的标注体系有北大标注体系和宾州树库标注体系等可供选择,但这并不排除开发者还可以根据实际情况自创其他标注体系。
命名实体识别(NER)。命名实体识别既是自然语言处理当中相对独立的专项任务,也是自然语言深度解析所不可缺少的实际前置步骤。人名、地名、组织机构名、化合物名、药名、金融交易标的名称等等,都有各自的命名体系,而且有很强的专义性(one sense per context)。有些命名实体采取了缩略简称的形式。命名实体识别和词典分词 / 词性标注之间有复杂的协同关系。我们见到有的系统把二者分离处置,各干各的,让后续工序无所适从,这种缺陷,值得引以为戒。
形态变化还原(STEMMING)。西方语言大多属屈折型,词的形态变化比较发达,名词的性、数、格和动词的时态、语态往往需要借助各种形态变化来表示。某些东方语言属粘着型,用名词加粘着语素表示格,用动词的元音谐变表示时态、语态信息。与这些变化手段相应的还原工作,都是对应语言词法分析的应有之义。汉语是孤立型语言,总体上说词的形态变化很不发达,但也有以重叠手段为主的较为初级的形态变化(AA、ABB、AABB、ABAB、A 一 A、A 不 A、A 不 AB 等),很多变化具有能产性,不宜罗列,于是也需要相应的还原。此外,汉语中还有非常独特的 “离合词” 现象。比如 “这种亏我们可不能再吃了” 当中的 “亏” 和“吃”,就是 “吃亏” 这个词的离合形态,中间既被其他词语穿插,又被改变了语序。离合词的识别和还原,既需要词典绑定,又需要借助句法的手段将拆开来的词素精准定位,是比较高级的词法分析技巧。
构词法(Compound-wordformation)。合成词是在词典词基础之上根据一定的机制形成的具有内部 “微结构” 的词。这种词往往是有规律可循的,而且具有相当的能产性,用词典化的方法难以将其穷尽。构词法是以类似句法的手段处理合成词,当然,只是其微结构 “类似句法” 而已,构词法中仍然有许多体现词法特点的因素,比如韵律、倒装等。构词法和句法也许并没有特别严格的界限,中间存在一干灰色地带。在这些灰色的地带,你即可以说是句法反作用于词法,也可以说这本身就是词法内部的事情。在另一个极端,就是压根儿不依赖词典,直接把构词法的触角伸到“字”,由字根据构词法生成一切词典词和非词典的合成词。这些探索,孤立看很难断定成败得失,需要结合应用目标和工程约束才好评判。
由此可见,词法分析领域绝非基于词典的分词这么简单,这个领域还有大量有待攻克的难关,有些难题已经与句法分析搅在一起,非统筹考虑是无法单独推进的。
句法分析
句法(syntax)和词法合称语法(grammar)。语法这个层次要不要存在,一直是引起很热烈争论的话题。如果说符号(说了什么)是起点、语义(谁和谁有什么关系)是终极的话,那么语法就是中继站。如果说符号在一楼、语义在三楼的话,那么语法(谁和谁有关系)就在二楼。从一楼到三楼有两种走法:一种是从一楼直接搭梯子上三楼,这叫 “意合” 派,实际上很多工程性的 NLP 系统采用了这一派,语言学界也有比较极端的人在学术上主张这种观点;另一种是从一楼上到二楼,在二楼拿到一些 “导航” 信息,然后再从二楼再上三楼直达目标,这叫 “结构制导” 派。
很显然,如果意合派能够达到满意的语义分析效果,那么语法就是多余的。如果意合派只能达到表浅的语义分析效果,那么就它只是一种利用了浅层分析技术的阶段性技术路线而已,随着技术的发展和应用的推动,必将让位给充分利用结构信息、更具分析深度的新一代技术路线。真正把 “结构制导” 这样的思路在工程上贯彻到底且能付诸应用的系统少之又少,但这极可能是技术门槛高的原因,而不是技术路线走不通的原因,对此我们后文还会有进一步的讨论。目前看来,“意合”的技术瓶颈是很明显的,比如对机器人说 “你给我讲个故事吧!” 和“我给你讲个故事吧!”,如果没有对语序结构的深究,仅靠基于词袋和模板来处理,混同的可能性更大。
如果说以词袋和模板为基础的 “浅层” 句法分析方法具有局限的话,那么,可以一用的 “深层” 句法分析方法。目前有哪些呢?概括说起来,传统的 “主流” 结构表示方法有三种:CFG(上下文无关语法)、DG(依存语法)、CCG(组合范畴语法),新潮的结构表示方法只有一种,就是字符串到向量空间的嵌入(seq2seq)。
上下文无关语法是比较经典的模型,着眼点在邻接成分之间的拼接(concatenation)关系。它的较大好处是直观,适宜于描述由小的成分逐层拼接成大的成分,自然形成树型层次结构。由于模型过于宽泛,其中有大量递归现象是实际的自然语言中不会发生的,但通用的分析算法却为这种不会发生的递归现象付出了很多无谓的代价。另外,上下文无关语法不能直接处理个体词语之间的关联(association)关系。一旦要处理关联关系,就必须通过语言的语言的向心结构,把复杂成分用中心词语作代表,把中心词语的关联关系和邻接成分之间的拼接关系统一起来。但在有些语言如汉语中,含有大量非中心词参与对外关联关系的 “交叉” 现象,不可能简单地实现关联关系和拼接关系的统一。
依存语法与上下文无关语法相反,处理的着眼点在个体词语之间点对点发生的关联关系。彻底的依存语法可以打破树形结构的羁绊,把所有实际发生的关联关系都揭示出来。而邻接成分之间的拼接关系,则可以通过关联关系的辖域间接得出。故此,依存语法有更大的灵活性和简洁性。但适宜于依存语法的分析手段还没有上下文无关语法那么丰富。尽管如此,依存语法还是成为近期内句法分析领域超过上下文无关语法的推荐模型。
组合范畴语法是在范畴语法基础之上发展起来的,是一种秉持了比较严谨风格的形式化数学演算体系。它把语言成分之间的结合处理为句法范畴对象之间的 “约分” 运算。这种形式化演算体系见诸实用的例子很难找到,但其中很多闪光的思想可以借鉴。特别是词负载结构、无需规则的思想,语言成分自带对外结合的 “插座” 和“插头”的思想,如能发扬光大,扬长弃短,说不定将会有令人惊喜的前景。
字符串到向量空间的嵌入,理论上可以隐性地容纳较为复杂的语言结构,但在深度学习语境下,这些复杂的语言结构转化为向量后,很难显性地予以展现和解释,这对于自然语言处理的工程化实现和根据面向客户的投诉定点纠错、敏捷修复的要求,都是很难做到的。此外,如果应用任务是直接把文本映射为可简单标注的答案,比如是非题或者选择题的答案,或者可轻松获取的答案,比如双语对齐语料,向量嵌入是有优势的;但如果应用任务是复杂知识表示结构的抽取,标注的复杂性和专业性会急剧上升,标注成本会高到得不偿失。
无论使用什么样的句法分析技术,有一点必须明确,就是句法本身是不自足的。细粒度描述的句法不具备鲁棒性和可行性,而粗粒度描述的句法往往必然带有伪歧义。比如 “馒头吃光了” 只有一个理解是符合常识的,即 “馒头” 作为受事,被某个施事 “吃光” 了。另一个理解,即 “馒头” 作为施事,把 “光” 作为受事 “吃” 了,是不符合常识的,因为一个无生命的食品,不会去吃一种有影无形的物理对象。“这碗猪都不喝的汤”,虽然其中的数量短语 “这碗” 和名词 “猪” 之间在句法上是可结合的,但它们之间并不不具备统计上显著的搭配性或者说相谐性。这说明,语义和统计可以反过来作用于句法分析,帮助句法分析环节排除伪歧义。套用量子力学的比喻,如果说正向的结构制导作用好比是 “粒子” 的话,这种基于语义或大数据统计的逆向筛选的作用就好比是“波”,二者恰好构成一种完美的“波粒二象性”。
最后我们要说明,即使语言的结构表示模型是基于理性主义(符号或规则)路线的,但语言解析过程本身仍可以采用基于统计的或基于联结的方法。比如 PCFG 就是基于规则的结构表示与基于统计的过程控制的有机结合。
词典化(免规则)、单子性(免复杂层次)、局域化(免跨成分关联)和鲁棒性(对灵活语序和修辞性失配的适应性),是自然语言句法分析技术未来的发展趋势。限于篇幅,这里不展开论述了。
语义表示与理解
如果说自然语言处理是人工智能的王冠,那么语义表示和理解技术就是王冠上的明珠。目前人工智能领域的发展态势,在语义这一块已经到了重兵集结的程度。句法分析技术的进步,使得我们有希望从结构和算法方向逼近更加精准的语义解析;应用领域数据转化为知识的实践方兴未艾,知识图谱的技术栈里算力充足工具齐全,使得我们有希望从表示的方向为语义架桥铺路添砖加瓦。精彩纷呈的明珠争夺战,可以说是万事俱备,一触即发。
语义长什么样?下面我们以 “今年 A 公司营业额比去年增长 20%” 这句话为例,看看它涉及了哪些语义表示与描述。对它进行解析,可产生如下一些结果:A 公司是 “公司” 这个类型的一个实例,它有一个属性叫做 “营业额”,营业额对应不同的“期间” 标签,有的不同的取值实例。“增长”是一个事件,它涉及基准、当事和比率三个角色,这三个角色都是数学量。基准和当事都是金额,比率是纯量。等等。
有心人很快会发现,这就是知识图谱。
的确,知识图谱就是当代最通用的语义知识表示形式化框架。它的节点就是语义学里面说的 “符号根基(symbol grounding)”,即语言符号与真实或想象空间中的对象的对接,在计算机中体现为语言符号与数字化对象的对接。它的边则是语义学里面说的 “角色指派(role assignment)”,在计算机中体现为每个数字化对象与其他数字化对象之间的语义关系标签。节点和边,这恰恰是知识图谱所支持的要件。
但是,事情并没有完结。语义结构表示框架中,现有的知识图谱可以完美描述实体、关系、属性(状态)及其值这三类要素。但是剩下的还有事件、时间、空间、因果条件、逻辑模态等,我们必须对现有的知识图谱结构进行改造,才能适应这些语义要素的表示。
先看事件。事件可以改变关系和属性。比如 “撤销职务” 的事件真正的语义效果是改变相应实体的 “职务” 属性的取值,其他一切操作,如果不落到这上面,都是耍流氓。此外,一个事件可以触发其他事件(例如 “国王去世” 触发 “王储继位”),一串事件可以是一个大事件的细粒度展开(比如“立案侦查”、“调查取证”、“拘捕” 可能是某个 “案件” 事件的细粒度展开)。这些具有动态特性的操作如何与静态知识图谱的结构和工具融为一体,是一个非常有挑战性的问题。我们注意到哈工大有关 “事理图谱” 的相关研究成果,但要成体系地解决事件的表示问题,目前成果还是很不够的。
再看时间和空间。大多数关系、属性、状态均与时空有关。事件也是在时空中才得以展开。基于关系、属性、状态、事件的语义知识处理,也要依据特定条件在给定时空范围内是否满足而遵循不同的处理逻辑。以农产品现货、期货为例,特定天气事件(比如暴雨、洪水)产生于特定时间(比如橡胶生长期)和空间(橡胶生长地),对特定农产品(橡胶)及其现货、期货交易者才构成预警。所以,时空标签如何引入静态知识图谱,也是一个具有挑战性的问题。
逻辑模态(例如 “准备裁员百分之二十”/“预计增产百分之十五”)、委婉表述(例如 “不认为有必要”/“倾向于暂缓”)、高阶逻辑表述(例如 “对房价过快上涨的预期减弱”)等,也都超出静态知识图谱的表示能力范围之外。如何为此类文本的语义设计相应的标签体系,也是正确抽取知识、融合知识所必须解决的问题。
此外,人类的语义解析过程充满了所谓 “脑补”。比如:“增长率超过了联想”,在字面语义上,“增长率” 作为一个数值和 “联想” 作为一家公司,是不可比的。但我们在 “公司” 为核心节点的本体中,可以找到 “增长率” 这样一个类型匹配的关联属性,于是就可以启动自动的 “脑补” 过程。可见,借助知识图谱,智能化地完成这类需要 “脑补” 的语义理解过程,是语义分析技术走向实用和深化的必然要求。
从上面的分析我们看到,自然语言的语义的确是一个博大精深的体系。知识图谱为语义计算准备好了基本的框架,但要全面推进到实用,还要做许多基础性的工作,包括资源建设和理论模型创新。我们期待在这一领域能有重量级的成果出现,将语义表示和计算的工作推向深入。
应用
自然语言处理技术的应用场景甚广,大致可分为分析型、生成型和交互型三类。舆情监控系统是典型的分析型系统;自动写作系统是典型的生成型系统;形形色色的聊天机器人是典型的交互型系统。
自然语言处理能力以平台化方式提供服务,是广大自然语言处理技术提供者求之不得的事情,但现实中可以这样做的场景几乎没有,也就是说自然语言处理本身的能力输出作为商业模式,是受到很多非技术因素限制的。现实中,更多的自然语言处理技术是融合于一个更大的行业应用场景中,作为其中一项核心技术来发挥自己的作用的。
除了法律、医疗、教育等先行行业之外,金融证券行业对自然语言处理技术业有很迫切的落地需求,但往往必须结合专业领域知识和私有数据才能构建有价值的场景。IT 背景的公司在这方面大都有所欠缺。另一方面,自然语言处理技术门槛很高,资源依赖性很强,不掌握新一代技术的团队也很难在赛道上坚持到胜利。
目前,行业技术提供商、互联网巨头和人工智能创业企业都在进入这个领域。行业技术提供商宜静观进展,直接采用经过实战考验的成熟技术;人工智能创业企业没有一招鲜就没有活路;而互联网巨头们,既有财力又有机制去自我孵化出 N 招鲜来。硝烟滚滚,磨刀霍霍,自然语言处理技术为题材的一场好戏已经开场。
在不久的将来,多智时代一定会彻底走入我们的生活,有兴趣入行未来前沿产业的朋友,可以收藏 多智时代 ,及时获取人工智能、大数据、云计算和物联网的前沿资讯和基础知识,让我们一起携手,引领人工智能的未来!
以上所述就是小编给大家介绍的《人工智能的诗与远方,一文读懂NLP起源、流》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML5与CSS3基础教程(第7版)
[美] Elizabeth Castro、[美] Bruce Hyslop / 望以文 / 人民邮电出版社 / 2013-1 / 59.00元
代表下一代网页编写技术的HTML5,为网页提供布局和格式的CSS3,这两者构成了Web开发的基石,也是Web程序员和设计师必须熟练掌握的最基本技能。 本书是风靡全球的HTML和CSS最佳入门教程的最新版,上一版单单英文版的销量就超过100万册,被翻译为十多种语言,并长期雄踞亚马逊书店计算机图书排行榜榜首。 最新的第7版秉承前一版直观、透彻、全面、循序渐进的讲授特色,仍然采用独特的双栏图......一起来看看 《HTML5与CSS3基础教程(第7版)》 这本书的介绍吧!