精华内容
下载资源
问答
  • 如何构建一级分类则是提纲挈领,快刀斩乱麻的杀手应用,在kmpro的多维分类体系理论中,我们在审视企业知识分类结构时,经常要关注以下三个主要的维度—— “生产类知识”、“成长类知识”、和“经营管理类知识”。

    Kmpro首席分析师王振宇谈多维分类体系理论研究(一)
       
        企业级知识分类,由于企业规模、业务范围所涉幅面甚广,人员众多,岗位遍布,因此想要很快的理顺头绪是比较难的一件事情。
        如何构建一级分类则是提纲挈领,快刀斩乱麻的杀手应用,在kmpro的多维分类体系理论中,我们在审视企业的知识分类结构时,经常要关注以下三个主要的维度——
        “生产类知识”、“成长类知识”、和“经营管理类知识”。
        所谓生产类知识,是指组织产出价值所依赖和附加的知识内容,即各部门所提供的“核心产品与服务”。
        所谓成长类知识,是指为完成各部门的核心产品与服务,要求员工和成员必须掌握的原理、技术、技能、须知,以及高级员工和专家的分享类的知识内容。
        所谓经营管理类知识,是组织运营所需要的企业组织管理性的知识内容,包括各部门日常工作文档、规章制度等,能够作为推动组织运行的知识。
        在知识管理体系的原理中,我们将“核心产品与服务”的知识内容,称之为组织的客户知识资本(如果产品和服务提供给本组内,则视为内部客户),成长类知识称之为“员工知识资本”,而经营管理类知识,则被称之为“组织知识资本”。
     

     

     无形知识资产结构图
           (无形知识资产结构图)
     
        客户知识资本,是组织存在价值的外向表现,是组织最重价值的体现。由于其提供的产品与服务是外向的,所以也称之为组织外部结构。
        员工知识资本包括了员工的显性和隐性知识,员工知识中部分会内化到员工的思维和行动方式,这部分会随着员工的流动而流动,部分则会以显性知识的形式留存下来,沉淀为组织知识的组成部分。
        组织知识资本,则是通过组织的运作明确下来的,确保组织顺畅、高效运转的知识内容,具有一定的稳定性和结构性,我们也称其为组织内部结构。
        组织内外部的知识结构,通过员工本身的知识与行动,共同作用于组织的业绩。

     

    知识作用力模型 

     

                (知识作用力模型)
        因此在久断不决的知识分类问题上,不妨采用多维分类体系理论的三个核心维度分类方法,来确定一级分类体系。
        一级分类的确定,当然只是第一步,接下来要做的还有很多,我们将在后续的多维知识分类体系理论课程中继续跟大家聊。

    展开全文
  • 知识无价:构建现代企业知识管理体系.pdf
  • 文章在分析企业研发项目管理知识分类的基础上,探讨了企业研发项目知识流失的原因,最后从研发项目管理知识信息体系、研发项目全过程知识管理体系企业内部研发组织网络体系等方面构建了基于知识管理的企业研发项目...
  • 文章在分析企业研发项目管理知识分类的基础上,探讨了企业研发项目知识流失的原因,最后从研发项目管理知识信息体系、研发项目全过程知识管理体系企业内部研发组织网络体系等方面构建了基于知识管理的企业研发项目...
  • Java高阶知识体系总结(一)

    千次阅读 2019-05-12 16:37:17
    Java高阶知识体系总结 作为Java开发者多年,是否感觉自己只是凌乱,掌握的知识没有体系化?那么通过此次总结,我们来尝试将高阶知识体系化。

    Java高阶知识体系总结

    1.Java 基础

    Java类设计的原则就是内聚性,一致性和封装性是Java设计的基本原则
    1.1 Java基础理论
    Java基础理论知识
    1.2继承的优缺点
    优点
    新的实现很容易,因为大部分是继承而来的,很容易修改和扩展已有的实现
    缺点
    1)打破了封装,因为基类向子类暴露了实现细节 。
    2)白盒重用,因为基类的内部细节通常对子类是可见的
    3)当父类的实现改变时可能要相应的对子类做出改变 。
    4)不能在运行时改变由父类继承来的实现
    由此可见,组合比继承具有更大的灵活性和更稳定的结构,一般情况下应该优先考虑组合。

    只有当下列条件满足时才考虑使用继承:

    1)子类是一种特殊的类型,而不只是父类的一个角色
    2)子类的实例不需要变成另一个类的对象
    3)子类扩展,而不是覆盖或者使父类的功能失效

    2、Java内核

    2.1堆栈

    栈stack和堆heapJAVA在程序运行时,在内存中划分5片空间进行数据的存储。
    分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆

    栈内存:基本数据类型、局部变量都是存放在栈内存中的,用完就消失。
    堆内存:new创建的实例化对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除。

    1).函数中定义的基本类型变量,对象的引用变量都在函数的栈内存中分配。
    2).栈内存特点,数数据一执行完毕,变量会立即释放,节约内存空间。
    3).栈内存中的数据,没有默认初始化值,需要手动设置。

    1).堆内存用来存放new创建的对象和数组。
    2).堆内存中所有的实体都有内存地址值。
    3).堆内存中的实体是用来封装数据的,这些数据都有默认初始化值。
    4).堆内存中的实体不再被指向时,JVM启动垃圾回收机制,自动清除,这也是JAVA优于C++的表现之一
    (C++中需要程序员手动清除)

    3、Spring

    3.1、简介

    什么是spring,为什么要用spring?

    1.Spring是一个分层的,一站式的轻量级开源框架
    2.它致力于提供一种方法管理业务对象,使JavaEE的开发更方便快捷.
    3.Spring不是仅仅专注于某一层的开发,而是贯穿应用于web层/业务层及持久层,
    与struts2/SpringMVC/hibernate等框架进行无缝整合,
    并对一些API(JDBC/JavaMail/远程调用等)进行了封装,降低了这些API的使用难度
    4.继承Junit4,方便程序测试,@runwith(SpringJunit…)
    5.对支持声明式事物管理@transational,只需通过配置就可以完成对事物的管理,无需动手编程
    6.对AOP(Aspect Oriented Programming)编程的支持,Spring提供面向切面编程,方便实现对程序进行权限拦截/运行监控等功能
    7.Spring 就是一个大工厂,可以将所有对象创建(IOC)和依赖关系维护(DI),交给Spring管理

    3.2、IOC

    IOC为InversionOfControl,控制反转是spring基于Java反射技术来实现的。IOC并不是spring或者面向对象的专用术语。
    IOC 控制反转,是指对象实例化权利由spring容器来管理
    实现原理: 工厂+反射+xml配置文件
    底层是通过BeanFactory的子接口ApplicationContext接口的实现类ClassPathXmlApplicaitonContex从配置文件applicationContext.xml文件
    中读取要创建的类名,再通过它的方法的getBean("…")反射的方式,创建出类,真正意义上达到解耦合的目的.
    DI(dependency injection 依赖注入)
    DI 依赖注入 在spring创建对象的过程中,对象所依赖的属性通过配置注入对象中。
    实现原理:在spring框架负责创建Bean对象时,动态将依赖对象注入到Bean组件。

    IoC中最基本的Java技术就是“反射”编程。通俗的说反射就是根据给出的类名(字符串)来生成对象。这种编程方式可以让对象在生成时才决定要生成哪一种对象。反射的应用是很广泛的,像Hibernate、Spring中都是用“反射”做为最基本的技术手段。
      在过去,反射编程方式相对于正常的对象生成方式要慢10几倍,这也许也是当时为什么反射技术没有普遍应用开来的原因。但经SUN改良优化后,反射方式生成对象和通常对象生成方式,速度已经相差不大了(但依然有一倍以上的差距)。
    IoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拔(有点像USB接口和SCSI硬盘了)。

    3.3、AOP

    面向切面编程,往往被定义为促使软件系统实现关注点的分离的技术。系统是由许多不同的组件所组成的,每一个组件各负责一块特定功能。除了实现自身核心功能之外,这些组件还经常承担着额外的职责。例如日志、事务管理和安全这样的核心服务经常融入到自身具有核心业务逻辑的组件中去。这些系统服务经常被称为横切关注点,因为它们会跨越系统的多个组件。
    3.3.1一般用于日志记录,性能统计,安全控制,事务处理,异常处理等等。
    3.3.2可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。

    3.4 spring事务传播特性

    事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。
    spring支持7种事务传播行为:

    propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
    propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
    propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
    propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
    propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
    propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

    Spring 默认的事务传播行为是 PROPAGATION_REQUIRED,它适合于绝大多数的情况。

    4、Java线程

    多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。
    一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
    多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。
    Java 提供了三种创建线程的方法:
    通过实现 Runnable 接口;
    通过继承 Thread 类本身;
    通过 Callable 和 Future 创建线程。
    有效利用多线程的关键是理解程序是并发执行而不是串行执行的。例如:程序中有两个子系统需要并发执行,这时候就需要利用多线程编程。
    通过对多线程的使用,可以编写出非常高效的程序。不过请注意,如果你创建太多的线程,程序执行的效率实际上是降低了,而不是提升了。
    请记住,上下文的切换开销也很重要,如果你创建了太多的线程,CPU 花费在上下文的切换的时间将多于执行程序的时间!
    同步是多线程中的重要概念。同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果。同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字。
    eg:

    /** * 用同步方法实现 * * @param money */
     public synchronized void save(int money) { 
     		account += money;
     } 
     /** * 用同步代码块实现 * * 
     @param money */ 
    	 public void save0(int money) { synchronized (this) {
    	 		 account += money;
       		}
        }
    

    使用非依赖属性实现同步

    4.1锁

    Java中的锁y有 偏向锁、轻量级锁、自旋锁、重量级锁
    锁从宏观上分类,分为悲观锁乐观锁
    乐观锁:是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。
    java中的乐观锁基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。
    悲观锁:是就是悲观思想,即认为写多,遇到并发写的可能性高,每次去拿数据的时候都认为别人会修改,所以每次在读写数据的时候都会上锁,这样别人想读写这个数据就会block直到拿到锁。java中的悲观锁就是Synchronized,AQS框架下的锁则是先尝试cas乐观锁去获取锁,获取不到,才会转换为悲观锁,如RetreenLock。

    4.1.2、Java中的锁

    自旋锁:自旋锁原理非常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗。
    但是线程自旋是需要消耗cup的,说白了就是让cup在做无用功,如果一直获取不到锁,那线程也不能一直占用cup自旋做无用功,所以需要设定一个自旋等待的最大时间。
    如果持有锁的线程执行的时间超过自旋等待的最大时间扔没有释放锁,就会导致其它争用锁的线程在最大等待时间内还是获取不到锁,这时争用线程会停止自旋进入阻塞状态。
    偏向锁(Biased Locking)是Java6引入的一项多线程优化。
    偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁。
    如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。
    轻量级锁:轻量级锁是由偏向所升级来的,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁;
    重量级锁:synchronized会导致争用不到锁的线程进入阻塞状态,所以说它是java语言中一个重量级的同步操纵,被称为重量级锁,为了缓解上述性能问题,JVM从1.5开始,引入了轻量锁与偏向锁,默认启用了自旋锁,他们都属于乐观锁。

    4.1.3、锁优化

    减少锁的时间:不需要同步执行的代码,能不放在同步快里面执行就不要放在同步快内,可以让锁尽快释放;
    减少锁的粒度:将物理上的一个锁,拆成逻辑上的多个锁,增加并行度,从而降低锁竞争。它的思想也是用空间来换时间;
    锁粗化:大部分情况下我们是要让锁的粒度最小化,锁的粗化则是要增大锁的粒度;
    在以下场景下需要粗化锁的粒度:
    假如有一个循环,循环内的操作需要加锁,我们应该把锁放到循环外面,否则每次进出循环,都进出一次临界区,效率是非常差的;
    使用读写锁:ReentrantReadWriteLock 是一个读写锁,读操作加读锁,可以并发读,写操作使用写锁,只能单线程写;
    读写分离:CopyOnWriteArrayList 、CopyOnWriteArraySet
    CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
     CopyOnWrite并发容器用于读多写少的并发场景,因为,读的时候没有锁,但是对其进行更改的时候是会加锁的,否则会导致多个线程同时复制出多个副本,各自修改各自的;
    使用CAS:如果需要同步的操作执行速度非常快,并且线程竞争并不激烈,这时候使用cas效率会更高,因为加锁会导致线程的上下文切换,如果上下文切换的耗时比同步操作本身更耗时,且线程对资源的竞争不激烈,使用volatiled+cas操作会是非常高效的选择;
    消除缓存行的伪共享:除了我们在代码中使用的同步锁和jvm自己内置的同步锁外,还有一种隐藏的锁就是缓存行,它也被称为性能杀手。
    在多核cup的处理器中,每个cup都有自己独占的一级缓存、二级缓存,甚至还有一个共享的三级缓存,为了提高性能,cpu读写数据是以缓存行为最小单元读写的;32位的cpu缓存行为32字节,64位cup的缓存行为64字节,这就导致了一些问题。

    4.1.3、死锁

    死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
    java 死锁产生的四个必要条件:
    1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
    2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
    3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
    4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。
    解决方式:对于无法成功获取的情况,一般就是重复尝试,或指定尝试的次数,也可以马上退出。

    4.2、Threadlocal

    ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。
    ThreadLocal在每个线程中对该变量会创建一个副本,即每个线程内部都会有一个该变量,且在线程内部任何地方都可以使用,线程之间互不影响,这样一来就不存在线程安全问题,也不会严重影响程序执行性能。
    但是要注意,虽然ThreadLocal能够解决上面说的问题,但是由于在每个线程中都创建了副本,所以要考虑它对资源的消耗,比如内存的占用会比不使用ThreadLocal要大。

    1)实际的通过ThreadLocal创建的副本是存储在每个线程自己的threadLocals中的;
    2)为何threadLocals的类型ThreadLocalMap的键值为ThreadLocal对象,因为每个线程中可有多个threadLocal变量;
    3)在进行get之前,必须先set,否则会报空指针异常;

    4.3、Java对象的引用

    包括:强引用,软引用,弱引用,虚引用
    Java中提供这四种引用类型主要有两个目的:

    第一是 可以让程序员通过代码的方式决定某些对象的生命周期;
    第二是 有利于JVM进行垃圾回收。

    强引用:是指创建一个对象并把这个对象赋给一个引用变量。
    软引用:如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;
    如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被 程序使用。软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。
    SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。
    弱引用:WeakReference弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。
    虚引用:虚引用(PhantomReference) 虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收

    要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

    4.4、ThreadPoolExecutor
    ThreadPoolExecutor是线程池框架的一个核心类,通过对ThreadPoolExecutor,可以知道其对资源进行了复用,并非无限制的创建线程,可以有效的减少线程创建和切换的开销。
    在ThreadPoolExecutor的内部,主要由阻塞队列BlockingQueue和抽象队列同步器AbstractQueuedSynchronizer对其提供支持,BlockingQueue接口有多种数据结构的实现,如LinkedBlockingQueue、ArrayBlockingQueue等。

    corePoolSize:设置线程池的核心线程数,当添加新任务时,如果线程池中的线程数小于corePoolSize,则不管当前是否有线程闲置,都会创建一个新的线程来执行任务。
    maximunPoolSize:是线程池中允许的最大的线程数
    workQueue:用于存放排队的任务
    keepAliveTime:是大于corePoolSize的线程闲置的超时时间
    handler:用于在任务逸出、线程池关闭时的任务处理

    线程池的线程增长策略为,当前线程数小于corePoolSize时,新增线程,当线程数=corePoolSize且corePoolSize时,只有在workQueue不能存放新的任务时创建新线程,超出的线程在闲置keepAliveTime后销毁。

    5、JVM

    5.1、volatile

    直接与主内存交互,保证可见性。避免指令重排序。
    可见性是指的是线程访问变量是否是最新值。
    局部变量不存在可见性问题,而共享内存就会有可见性问题。因为本地线程在创建的时候,会从主存中读取一个共享变量的副本,且修改也是修改副本,且并不是立即刷新到主存中去,那么其他线程并不会马上共享变量的修改。
    因此,线程B修改共享变量后,线程A并不会马上知晓,就会出现上述死循环的问题。

    解决共享变量可见性问题,需要用volatile关键字修饰。
    可见性理解为:
    1. 对volatile变量的写会立即刷新到主存
    2. 对volatile变量的读会读主存中的新值

    volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
    volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
    一般说来,volatile用在如下的几个地方:
    1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
    2、多任务环境下各任务间共享的标志应该加volatile;
    3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;
    另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2 中可以禁止任务调度,3中则只能依靠硬件的良好设计了。
    volatile关键字就是提示JVM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
    使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
    由于使用volatile屏蔽掉了JVM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

    Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。

    5.1、内存泄露

    内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

    5.2、内存溢出

    内存溢出(out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。此时软件或游戏就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件。

    5.3、JVM内存结构

    JVM内存分为工作内存和主存。
    工作内存:即java线程的本地内存,是单独给某个线程分配的,存储局部变量等,同时也会复制主存的共享变量作为本地的副本,目的是为了减少和主存通信的频率,提高效率。
    主存:存储类成员变量等

    5.4、为什么要GC

    GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
    System.gc() 或Runtime.getRuntime().gc() 。
    垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收、标记垃圾回收、增量垃圾回收等方式。
    补充:标准的Java进程既有栈又有堆。栈保存了原始型局部变量,堆保存了要创建的对象。Java平台对堆内存回收和再利用的基本算法被称为标记和清除,但是Java对其进行了改进,采用“分代式垃圾收集”。这种方法会跟Java对象的生命周期将堆内存划分为不同的区域,在垃圾收集过程中,可能会将对象移动到不同区域:
    伊甸园(Eden):这是对象最初诞生的区域,并且对大多数对象来说,这里是它们唯一存在过的区域。

    幸存者乐园(Survivor):从伊甸园幸存下来的对象会被挪到这里。
    终身颐养园(Tenured):这是足够老的幸存对象的归宿。年轻代收集(Minor-GC)过程是不会触及这个地方的。当年轻代收集不能把对象放进终身颐养园时,就会触发一次完全收集(Major-GC),这里可能还会牵扯到压缩,以便为大对象腾出足够的空间
    与垃圾回收相关的JVM参数:

    -Xms / -Xmx --- 堆的初始大小 / 堆的最大大小
    -Xmn --- 堆中年轻代的大小
    -XX:-DisableExplicitGC --- 让System.gc()不产生任何作用
    -XX:+PrintGCDetail --- 打印GC的细节
    -XX:+PrintGCDateStamps --- 打印GC操作的时间戳
    

    5.5、GC算法

    我们一般讨论的垃圾回收主要针对Java堆内存中的新生代和老年代,也正因为新生代和老年代结构上的不同,所以产生了分代回收算法,即新生代的垃圾回收和老年代的垃圾回收采用的是不同的回收算法。针对新生代,主要采用复制算法,而针对老年代,通常采用标记-清除算法或者标记-整理算法来进行回收。
    复制算法的思想是将内存分成大小相等的两块区域,每次使用其中的一块。当这一块的内存用完了,就将还存活的对象复制到另一块区域上,然后对该块进行内存回收。
    这个算法实现简单,并且也相对高效,但是代价就是需要将牺牲一半的内存空间用于进行复制。有研究表明,新生代中的对象98%存活期很短,所以并不需要以1:1的比例来划分整个新生代,通常的做法是将新生代内存空间划分成一块较大的Eden区和两块较小的Survivor区,两块Survivor区域的大小保持一致。每次使用Eden和其中一块Survivor区,当回收的时候,将还存活的对象复制到另外一块Survivor空间上,最后清除Eden区和一开始使用的Survivor区。假如用于复制的Survivor区放不下存活的对象,那么会将对象存到老年代。
    标记-清除(Mark-Sweep)算法分为两个阶段:
    标记–>清除
    在标记阶段将标记出需要回收的对象空间,然后在下一个阶段清除阶段里面,将这些标记出来的对象空间回收掉。这种算法有两个主要问题:一个是标记和清除的效率不高,另一个问题是在清理之后会产生大量不连续的内存碎片,这样会导致在分配大对象时候无法找到足够的连续内存而触发另一次垃圾收集动作。
    标记-整理算法
    标记-整理(Mark-Compact)算法有效预防了标记-清除算法中可能产生过多内存碎片的问题。在标记需要回收的对象以后,它会将所有存活的对象空间挪到一起,然后再执行清理。

    5.6、JVM启动参数

    参数主要有,内存相关,GC相关,GC日志相关

    5.6.1 堆内存相关

    -Xms 与 -Xmx
    -Xms用于指定Java应用使用的最小堆内存,如-Xms1024m表示将Java应用最小堆设置为1024M。-Xmx用于指定Java应用使用的最大堆内存,如-Xmx1024m表示将Java应用最大堆设置为1024m。过小的堆内存可能会造成程序抛出OOM异常,所以正常发布的应用应该明确指定这两个参数。并且,一般会选择将-Xms与-Xmx设置成一样大小,防止JVM动态调整堆内存容量对程序造成性能影响。
    -Xmn
    通过-Xmn可以设置堆内存中新生代的容量,以此达到间接控制老年代容量的作用,因为没有JVM参数可以直接控制老年代的容量。如-Xmn256m表示将新生代容量设置为256M。假如这个时候额外指定了-Xms1024m -Xmx1024m,那么老年代的容量为768M(1024-256=768)。
    -XX:PermSize 与 -XX:MaxPermSize
    -XX:PermSize和-XX:MaxPermSize分别用于设置永久代的容量和最大容量。如-XX:PermSize=64m -XX:MaxPermSize=128m表示将永久代的初始容量设置为64M,最大容量设置为128M。
    -XX:SurvivorRatio
    这个参数用于设置新生代中Eden区和Survivor(S0、S1)的容量比值。默认设置为-XX:SurvivorRatio=8表示Eden区与Survivor的容量比例为8:1:1。假设-Xmn256m -XX:Survivor=8,那么Eden区容量为204.8M(256M / 10 * 8),S0和S1区的容量大小均为25.6M(256M / 10 * 1)。
    

    5.6.2、GC收集器相关

    XX:+UseSerialGC
    虚拟机运行在client模式下的默认值,使用这个参数表示虚拟机将使用Serial + Serial Old收集器组合进行垃圾回收。
    -XX:+UseSerialGC表示使用这个设置,而-XX:-UseSerialGC表示禁用这个设置。
    -XX:+UseParNewGC
    使用这个设置以后,虚拟机将使用ParNew + Serial Old收集器组合进行垃圾回收。
    -XX:+UseConcMarkSweepGC
    使用这个设置以后,虚拟机将使用ParNew + CMS + Serial Old的收集器组合进行垃圾回收。注意Serial Old收集器将作为CMS收集器出现Concurrent Mode Failure失败后的后备收集器来进行回收(将会整理内存碎片)。
    -XX:+UseParallelGC
    虚拟机运行在server模式下的默认值。使用这个设置,虚拟机将使用Parallel Scavenge + Serial Old(PS MarkSweep)的收集器组合进行垃圾回收。
    -XX:+UseParallelOldGC
    使用这个设置以后,虚拟机将使用Parallel Scavengen + Parallel Old的收集器组合进行垃圾回收。
    -XX:PretenureSizeThreshold
    设置直接晋升到老年代的对象大小,大于这个参数的对象将直接在老年代分配,而不是在新生代分配。注意这个值只能设置为字节,如-XX:PretenureSizeThreshold=3145728表示超过3M的对象将直接在老年代分配。
    -XX:MaxTenuringThreshold
    

    设置晋升到老年代的对象年龄。每个对象在坚持过一次Minor GC之后,年龄就会加1,当超过这个值时就进入老年代。

    默认设置为-XX:MaxTenuringThreshold=15。
    -XX:ParellelGCThreads
    设置并行GC时进行内存回收的线程数。只有当采用的垃圾回收器是采用多线程模式,包括ParNew、Parallel Scavenge、Parallel Old、CMS,这个参数的设置才会有效。
    -XX:CMSInitiatingOccupancyFraction
    设置CMS收集器在老年代空间被使用多少(百分比)后触发垃圾收集。默认设置-XX:CMSInitiatingOccupancyFraction=68表示老年代空间使用比例达到68%时触发CMS垃圾收集。仅当老年代收集器设置为CMS时候这个参数才有效。
    -XX:+UseCMSCompactAtFullCollection
    设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片整理。仅当老年代收集器设置为CMS时候这个参数才有效。
    -XX:CMSFullGCsBeforeCompaction
    设置CMS收集器在进行多少次垃圾收集后再进行一次内存碎片整理。如设置-XX:CMSFullGCsBeforeCompaction=2表示CMS收集器进行了2次垃圾收集之后,进行一次内存碎片整理。仅当老年代收集器设置为CMS时候这个参数才有效。
    

    5.6.3、GC日志相关

    -XX:+PrintGCDetails
    表示输出GC的详细情况。
    -XX:+PrintGCDateStamps
    指定输出GC时的时间格式,比指定-XX:+PrintGCTimeStamps可读性更高。
    -Xloggc
    指定gc日志的存放位置。如-Xloggc:/var/log/myapp-gc.log表示将gc日志保存在磁盘/var/log/目录,文件名为myapp-gc.log。
    

    5.7、查看内存使用情况

    命令:top
    PID:进程的ID
      USER:进程所有者
      PR:进程的优先级别,越小越优先被执行
      NInice:值
      VIRT:进程占用的虚拟内存
      RES:进程占用的物理内存
      SHR:进程使用的共享内存
      S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
      %CPU:进程占用CPU的使用率
      %MEM:进程使用的物理内存和总内存的百分比
      TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
      COMMAND:进程启动命令名称
    

    5.8、YGC、FGC

    youngGC、FullGC
    当年轻代收集不能把对象放进终身颐养园时,就会触发一次完全收集(Major-GC),这里可能还会牵扯到压缩,以便为大对象腾出足够的空间。

    5.9、CPU过高、内存占用过高处理

    6、设计模式

    使用涉及模式 其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。**
    设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解
    使用设计模式的好处:

    可以提高程序员的思维能力、编程能力和设计能力。
    使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
    使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。

    6.1、GoF的23种单例模式

    单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
    原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
    工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
    抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
    建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
    代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
    适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
    桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
    装饰(Decorator)模式:动态的给对象增加一些职责,即增加其额外的功能。
    外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
    享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用。
    组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。
    模板方法(TemplateMethod)模式:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
    策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
    命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
    职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
    状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力。
    观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
    中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
    迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
    访问者(Visitor)模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
    备忘录(Memento)模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
    解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。

    6.2、单例模式与线程安全

    Java 语言包含两种内在的同步机制:**同步块(或方法)**和 volatile 变量。
    这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。

    6.3、其他

    7、数据库

    7.1、设计
    7.1.1、3NF
    数据库设计三大范式:
    1nf,每列字段必须具有不可分割性;
    2nf 每个属性必须和主键(主属性)相关;
    3nf 每个属性必须与主属性直接相关或者说,属性不依赖于其他非主属性。

    7.2、SQL
    7.2.1、SQL执行顺序

    	```
    	sql执行顺序:
    	(1)from
    	(2) on
    	(3) join
    	(4) where
    	(5) group by(开始使用select中的别名,后面的语句中都可以使用)
    	(6) avg,sum....
    	(7) having
    	(8) select
    	(9) distinct
    	(10) order by
    	```
    

    select*
    fromtableAjoinBonA.id=B.aId
    wheresize>10
    groupbysize
    havingsum(xxx)>100
    Orderbyyyy

    7.3、索引

    索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
    当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。
    7.3.1、什么时候建索引

    (1)快速取数据;
    (2)保证数据记录的唯一性;
    (3)实现表与表之间的参照完整性;
    (4)在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间。
    当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

    索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。
    索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。

    7.3.2、索引实现算法,算法复杂度

    动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B±tree/ B*-tree(B~Tree)。前三者是典型的二叉查找树结构。
    其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率。

    7.3.3、索引缺点与有点

    优点
    1)大大加快数据的检索速度;
    2)创建唯一性索引,保证数据库表中每一行数据的唯一性;
    3)加速表和表之间的连接;
    4)在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
    缺点
    1)索引需要占物理空间。
    2)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
    根据数据库的功能,可以在数据库设计器中创建四种索引:普通索引、唯一索引、主键索引和聚集索引。

    7.3.4、聚簇索引

    也称为聚集索引,在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引, 即如果存在聚集索引,就不能再指定CLUSTERED 关键字。
    是聚集索引的意思.CLUSTERED| NONCLUSTERED
    指定为 PRIMARY KEY 或UNIQUE约束创建聚集或非聚集索引。PRIMARY KEY 约束默认为CLUSTERED;UNIQUE约束默认为 NONCLUSTERED。如果表中已存在聚集约束或索引,那么在 ALTER TABLE 中就不能指定 CLUSTERED。如果表中已存在聚集约束或索引,PRIMARY KEY 约束默认为 NONCLUSTERED
    索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。聚集索引更适用于对很少对基表进行增删改操作的情况。。

    7.3.5、什么SQL不走索引

    你在Instance级别所用的是all_rows的方式
    1)你的表的统计信息(最可能的原因)
    2)你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。

    1、建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念。
    2、在包含有null值的table列上建立索引,当时使用select count(*) from table时不会使用索引。
    3、在索引列上使用函数时不会使用索引,如果一定要使用索引只能建立函数索引。
    4、当被索引的列进行隐式的类型转换时不会使用索引
    5、并不是所有情况使用索引都会加快查询速度,full scan table 有时会更快,尤其是当查询的数据量占整个
    表的比重较大时,因为full scan table采用的是多块读,
    当Oracle优化器没有选择使用索引时不要立即强制使用,要充分证明使用索引确实查询更快时再使用强制索引。
    6、<>
    7、like’’百分号在前
    8、not in ,not exist.
    

    7.4、分库、分表

    7.4.1、什么时候分
    据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务 的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
    分库分表有垂直切分和水平切分两种。
    何谓垂直切分,即将表按照功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立定义数据库workDB、商品数据库payDB、用户数据库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。
    7.4.2、会有什么问题
    1)事务问题:在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;
    如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。
    2)跨库跨表的join问题:在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上,这时,表的关联操作将受到限制,我们无法join位于不同分库的表,也无法join分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成。
    3)额外的数据管理负担和数据运算压力:

    7.5、事务

    事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

    7.5.1、基本属性、传播属性

    事务的四大属性ACID即事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability.。
    原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
    一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
    隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
    持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

    7.5.2、隔离级别

    事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化

    ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
    ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
    ③ Read committed (读已提交):可避免脏读的发生。
    ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

    脏读、不可重复读、幻象读
    脏读:指当一个事务正字访问数据,并且对数据进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据还没有提交那么另外一个事务读取到的这个数据我们称之为脏数据。依据脏数据所做的操作肯能是不正确的。
    不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有执行结束,另外一个事务也访问该同一数据,那么在第一个事务中的两次读取数据之间,由于第二个事务的修改第一个事务两次读到的数据可能是不一样的,这样就发生了在一个事物内两次连续读到的数据是不一样的,这种情况被称为是不可重复读。
    幻象读:一个事务先后读取一个范围的记录,但两次读取的纪录数不同,我们称之为幻象读(两次执行同一条 select 语句会出现不同的结果,第二次读会增加一数据行,并没有说这两次执行是在同一个事务中

    spring事务传播特性
    事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。
    spring支持7种事务传播行为:

    propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
    propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
    propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
    propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
    propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
    propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

    Spring 默认的事务传播行为是 PROPAGATION_REQUIRED,它适合于绝大多数的情况。

    7.5.3、分布式事务CAP和base理论

    分布式系统对于数据的复制需求一般都来自于以下两个原因:
    1)为了增加系统的可用性,以防止单点故障引起的系统不可用
    2)提高系统的整体性能,通过负载均衡技术,能够让分布在不同地方的数据副本都能够为用户提供服务
    数据复制在可用性和性能方面给分布式系统带来的巨大好处是不言而喻的,然而数据复制所带来的一致性挑战,也是每一个系统研发人员不得不面对的。

    7.5.3.1、CAP

    CAP理论:一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中两项。
    1)一致性
    在分布式环境下,一致性是指数据在多个副本之间能否保持一致的特性。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一直的状态。
    对于一个将数据副本分布在不同分布式节点上的系统来说,如果对第一个节点的数据进行了更新操作并且更新成功后,却没有使得第二个节点上的数据得到相应的更新,于是在对第二个节点的数据进行读取操作时,获取的依然是老数据(或称为脏数据),这就是典型的分布式数据不一致的情况。在分布式系统中,如果能够做到针对一个数据项的更新操作执行成功后,所有的用户都可以读取到其最新的值,那么这样的系统就被认为具有强一致性
    2)可用性
    可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。这里的重点是"有限时间内"和"返回结果"。
    "有限时间内"是指,对于用户的一个操作请求,系统必须能够在指定的时间内返回对应的处理结果,如果超过了这个时间范围,那么系统就被认为是不可用的。另外,"有限的时间内"是指系统设计之初就设计好的运行指标,通常不同系统之间有很大的不同,无论如何,对于用户请求,系统必须存在一个合理的响应时间,否则用户便会对系统感到失望。
    "返回结果"是可用性的另一个非常重要的指标,它要求系统在完成对用户请求的处理后,返回一个正常的响应结果。正常的响应结果通常能够明确地反映出队请求的处理结果,即成功或失败,而不是一个让用户感到困惑的返回结果。
    3)分区容错性
    分区容错性约束了一个分布式系统具有如下特性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。
    网络分区是指在分布式系统中,不同的节点分布在不同的子网络(机房或异地网络)中,由于一些特殊的原因导致这些子网络出现网络不连通的状况,但各个子网络的内部网络是正常的,从而导致整个系统的网络环境被切分成了若干个孤立的区域。需要注意的是,组成一个分布式系统的每个节点的加入与退出都可以看作是一个特殊的网络分区。

    7.5.3.2、BASE

    BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的缩写。BASE理论是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于CAP定理逐步演化而来的。BASE理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
    1、基本可用
    基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性----注意,这绝不等价于系统不可用。比如:
    (1)响应时间上的损失。正常情况下,一个在线搜索引擎需要在0.5秒之内返回给用户相应的查询结果,但由于出现故障,查询结果的响应时间增加了1~2秒
    (2)系统功能上的损失:正常情况下,在一个电子商务网站上进行购物的时候,消费者几乎能够顺利完成每一笔订单,但是在一些节日大促购物高峰的时候,由于消费者的购物行为激增,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面
    2、软状态
    软状态指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时
    3、最终一致性
    最终一致性强调的是所有的数据副本,在经过一段时间的同步之后,最终都能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
    总的来说,BASE理论面向的是大型高可用可扩展的分布式系统,和传统的事物ACID特性是相反的,它完全不同于ACID的强一致性模型,而是通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。但同时,在实际的分布式场景中,不同业务单元和组件对数据一致性的要求是不同的,因此在具体的分布式系统架构设计过程中,ACID特性和BASE理论往往又会结合在一起。

    7.6、MySQL

    7.6.1、存储引擎分类
    (1):MyISAM存储引擎(2)InnoDB存储引擎*,(3):MEMORY存储引擎,(4)MERGE存储引擎
    7.6.2、不同存储引擎特点
    (1):MyISAM存储引擎:不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表
    支持3种不同的存储格式,分别是:静态表;动态表;压缩表
    静态表:表中的字段都是非变长字段,这样每个记录都是固定长度的,优点存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多(因为存储时会按照列的宽度定义补足空格)ps:在取数据的时候,默认会把字段后面的空格去掉,如果不注意会把数据本身带的空格也会忽略。
    动态表:记录不是固定长度的,这样存储的优点是占用的空间相对较少;缺点:频繁的更新、删除数据容易产生碎片,需要定期执行OPTIMIZE TABLE或者myisamchk-r命令来改善性能
    压缩表:因为每个记录是被单独压缩的,所以只有非常小的访问开支
    (2)InnoDB存储引擎:该存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM引擎,写的处理效率会差一些,并且会占用更多的磁盘空间以保留数据和索引。
    InnoDB存储引擎的特点:支持自动增长列,支持外键约束
    (3):MEMORY存储引擎:Memory存储引擎使用存在于内存中的内容来创建表。每个memory表只实际对应一个磁盘文件,格式是.frm。memory类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失掉。
    MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引,两种不同类型的索引有其不同的使用范围
    Hash索引优点:
    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
    Hash索引缺点: 那么不精确查找呢,也很明显,因为hash算法是基于等值计算的,所以对于“like”等范围查找hash索引无效,不支持;
    Memory类型的存储引擎主要用于哪些内容变化不频繁的代码表,或者作为统计操作的中间结果表,便于高效地对中间结果进行分析并得到最终的统计结果,。对存储引擎为memory的表进行更新操作要谨慎,因为数据并没有实际写入到磁盘中,所以一定要对下次重新启动服务后如何获得这些修改后的数据有所考虑。
    (4)MERGE存储引擎:Merge存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,merge表本身并没有数据,对merge类型的表可以进行查询,更新,删除操作,这些操作实际上是对内部的MyISAM表进行的。
    7.6.3、行锁、表锁
    mysql常用引擎有MYISAM和InnoDB,而InnoDB是mysql默认的引擎。MYISAM不支持行锁,而InnoDB支持行锁和表锁。

    类型行锁表锁页锁
    MyISAM
    BDB
    InnoDB

    表锁:不会出现死锁,发生锁冲突几率高,并发低。
    行锁:会出现死锁,发生锁冲突几率低,并发高。
    锁冲突:例如说事务A将某几行上锁后,事务B又对其上锁,锁不能共存否则会出现锁冲突。(但是共享锁可以共存,共享锁和排它锁不能共存,排它锁和排他锁也不可以)
    死锁:例如说两个事务,事务A锁住了15行,同时事务B锁住了610行,此时事务A请求锁住610行,就会阻塞直到事务B施放610行的锁,而随后事务B又请求锁住15行,事务B也阻塞直到事务A释放15行的锁。死锁发生时,会产生Deadlock错误。
    7.6.4、行锁的类型
    行锁分 共享锁 和 排它锁。
    共享锁又称:读锁。当一个事务对某几行上读锁时,允许其他事务对这几行进行读操作,但不允许其进行写操作,也不允许其他事务给这几行上排它锁,但允许上读锁。
    排它锁又称:写锁。当一个事务对某几个上写锁时,不允许其他事务写,但允许读。更不允许其他事务给这几行上任何锁。包括写锁。
    7.6.5、行锁的实现
    1.行锁必须有索引才能实现,否则会自动锁全表,那么就不是行锁了。
    2.两个事务不能锁同一个索引,例如:
    1.事务A先执行:
    2.selectmathfromzjewheremath>60forupdate;
    3.事务B再执行:
    4.selectmathfromzjewheremath<60forupdate;
    5.这样的话,事务B是会阻塞的。如果事务B把math索引换成其他索引就不会阻塞,但注意,换成其他索引锁住的行不能和math索引锁住的行有重复。
    7.6.5、导致MySQL数据库事务失效得几个原因

    1. 存储引擎类型,myISAM不支持事务,但是它是高效得插入和查询存储引擎
    2. Bean没有被spring管理
    3. 方法不是public修饰得,

    7.7 Oracle

    Oracle的数据结构
    oracle数据库是数据的无聊存储,包括数据文件ORA或DBF,控制文件,联机日志,参数文件,这里的数据库是一个操作系统只有一个库。可以看作是oracle就只有一个大数据库
    实例:一个oracle实例有一系列的后台进程和内存结构组成,一个数据库可以有n个实例
    数据文件dbf:数据文件是数据库的物理存储单位,数据库的数据是存储在表空间中的,真正是在某一个或多个数据文件中,而一个表空间
    可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间,一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果
    要删除文件,只能删除其所属的表空间才行
    表空间:表空间是oracle对物理数据库上相关数据文件的逻辑映射,一个数据库可以被划分多个表空间,每个数据库至少有一个表空间
    用户:用户是在实例下建立的,不同实例中可以建立相同的用户。
    表的数据是由用户放入某一个表空间,而这个表空间会随机把这些表数据放到一个或多个数据文件

    8、缓存

    8.1、时机

    remote dictionary server (远程数据服务) 内存高速缓存数据库 数据模型为 k-v 也就是redis 的一种最经常使用的数据类型 stringk-v 的算法时间复杂度 可是 0(1) 而mysql 的查询是基于表关联技术 ,这就是nosql的优势所在。

    redis 和memcahe 的比较:

    Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    Redis支持master-slave(主-从)模式应用,高可用的cache系统,支持集群服务器之间数据同步。
    Redis支持数据持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
    Redis单个value的最大限制是1GB,(k-v),memcached只能保存1MB的数据。(k:250kb v:1mb)
    PS:1 从存储媒介来看,内存比磁盘的读取速度 hash查找是100w/s 的数量级
    2 多路复用io (todo)

    8.2、原因

    那么为什么要使用类似redis这样的Nosql数据库呢?
    1) 当数据量的总大小一个机器放不下时;
    2) 数据索引一个机器的内存放不下时;
    3) 访问量(读写混合)一个实例放不下时
    单机时代,存储只用一台机器装mysql,如果每次存储成千上万条数据,这样很会导致mysql的性能很差,存储以及读取速度很慢,然后就演变成缓存+mysql+垂直拆分的方式。
    Cache作为中间缓存时代,将所有的数据先保存到缓存中,然后再存入mysql中,减小数据库压力,提高效率。
    但是当数据再次增加到又一个量级,上面的方式也不能满足需求,由于数据库的写入压力增加,缓存只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。
    主从分离模式时代,在redis的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。

    8.3、Redis

    为什么选择Redis

    1)Redis不仅仅支持简单的k/v类型的数据,同时还提供string、hash、list、set及zset(sorted set:有序集合)。
    2)Redis支持master-slave(主-从)模式应用
    3)Redis支持数据持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
    4)Redis单个value的string类型是Redis最大限制是1GB,memcached只能保存1MB的数据
    

    8.3.1 Redisd的几种数据淘汰策略

    定时删除策略 : 在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
    优点 : 对内存友好,保证过期键会尽可能快地被删除,并释放过期键所占用的内存。
    缺点 : 对CPU时间不友好,占用太多CPU时间,影响服务器的响应时间和吞吐量。
    惰性删除 策略 : 放任过期键不管,每次从键空间读写操作时,都检查键是否过期,如果过期,删除该键,如果没有过期,返回该键。
    优点 : 对CPU时间友好,读写操作键时才对键进行过期检查,删除过期键的操作只会在非做不可的情况下进行。
    缺点 : 对内存不友好,只要键不删除,就不会释放内存,浪费太多内存,有内存泄漏风险。
    定期删除 策略 :
    对定时删除策略和惰性删除策略的一种整合和折中。每隔一段时间执行一次定时删除,并通过限制删除操作执行的总时长和总频率来限制删除操作对CPU占用时间的影响。通过定期删除过期键,有效减少了因为过期键而带来的内存浪费。
    难点:确定删除操作执行的总时长和总频率。执行太频繁,执行时间过长,就会退化成定时删除策略,影响客户端请求效率;执行得太少,执行时间太短,会演变为惰性删除,存在内存浪费的情况。
    Redis服务器使用惰性删除和定期删除两种策略,通过配合使用,很好地在合理使用CPU时间和避免浪费内存之间取得平衡。

    举例:
    从过期键中随机选取 20 个 key
    遍历这 20 个 key,并对过期的 key进行删除操作
    如果过期的 key 比率超过25%,则重复步骤 1
    同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,增加了扫描时间的上限,默认不会超过 25ms以及频次上线10次。

    主动清理策略:
    当前已用内存超过maxmemory限定时,触发主动清理策略。
    清理时会根据用户配置的maxmemory-policy来做适当的清理。
    主动清理策略主要有一下六种:

    volatile-lru : 从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用 的数据淘汰。
    volatile-ttl : 从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数 据淘汰。
    volatile-random : 从已设置过期时间的数据集(server.db[i].expires)中任意选择数据 淘汰。
    allkeys-lru : 从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰。
    allkeys-random : 从数据集(server.db[i].dict)中任意选择数据淘汰。
    no-enviction : 禁止驱逐数据。

    8.4、“缓存击穿”和“缓存雪崩”

    缓存穿透:是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。

    避免方式一般会采用缓存空值的方式,也就是【代码流程】中第5步,如果从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短,比如设置为60秒。

    缓存雪崩:是指在某一个时间段,缓存集中过期失效。
    产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。

    一般可以在时间加上一个随机因子。这样能尽可能分散缓存过期时间,而且,热门键值缓存时间长一些,冷门类目缓存时间短一些,也能节省缓存服务的资源。

    缓存击穿:是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

    8.5、一致性Hash

    CARP :Common Access Redundancy Protocol共用地址冗余协议Common Access Redundancy Protocol,或简称 CARP 能够使多台主机共享同一 IP 地址。在某些配置中,这样做可以提高可用性,或实现负载均衡。这些主机也可以同时使用其他的不同的 IP 地址。
    一致性哈希基本解决了在P2P环境中最为关键的问题——如何在动态的网络拓扑中分布存储和路由。每个节点仅需维护少量相邻节点的信息,并且在节点加入/退出系统时,仅有相关的少量节点参与到拓扑的维护中。所有这一切使得一致性哈希成为第一个实用的DHT算法。
    但是一致性哈希的路由算法尚有不足之处。在查询过程中,查询消息要经过O(N)步(O(N)表示与N成正比关系,N代表系统内的节点总数)才能到达被查询的节点。不难想象,当系统规模非常大时,节点数量可能超过百万,这样的查询效率显然难以满足使用的需要。换个角度来看,即使用户能够忍受漫长的时延,查询过程中产生的大量消息也会给网络带来不必要的负荷。
    DHT(Distributed Hash Table,分布式哈希表)类似Tracker的根据种子特征码返回种子信息的网络。DHT全称叫分布式哈希表(Distributed Hash Table),是一种分布式存储方法。在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储。新版BitComet允许同行连接DHT网络和Tracker,也就是说在完全不连上Tracker服务器的情况下,也可以很好的下载,因为它可以在DHT网络中寻找下载同一文件的其他用户。

    9、MQ

    9.1 MQ特性

    1、顺序保证/先进先出
    不能先进先出,都不能说是队列了。消息队列的顺序在入队的时候就基本已经确定了,一般是不需人工干预的。而且,最重要的是,数据是只有一条数据在使用中。 这也是MQ在诸多场景被使用的原因。
    2、发布订阅/异步通信
    发布订阅是一种很高效的处理方式,如果不发生阻塞,基本可以当做是同步操作。这种处理方式能非常有效的提升服务器利用率,这样的应用场景非常广泛。
    3、持久化
    持久化确保MQ的使用不只是一个部分场景的辅助工具,而是让MQ能像数据库一样存储核心的数据,消息中间件允许把数据持久化知道他们完全被处理。
    4、分布式
    在现在大流量、大数据的使用场景下,只支持单体应用的服务器软件基本是无法使用的,支持分布式的部署,才能被广泛使用。而且,MQ的定位就是一个高性能的中间件。
    5、解耦
    基于数据的接口层,不同的项目都实现这个接口,允许独立的修改或者扩展两边的处理过程,只要两边遵守相同的接口约束即可,从而达到解耦作用。
    6、增加缓冲,避免突然大量业务访问的压力

    9.2 Kafka、RabbitMQ、RocketMQ性能比较:

    Kafka:是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。
    RabbitMQ:是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
    RocketMQ:是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。

    在服务端处理同步发送的性能上,Kafka>RocketMQ>RabbitMQ

    9.1、P2P
    peer to peer
    9.2、pub/sub
    广播

    10、网络

    10.1、OSI模型(计算机网络分层)

    顺序分别为:
    7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层
    OSI是一个开放性的通信系统互连参考模型,他是一个定义得非常好的协议规范。OSI模型有7层结构,每层都可以有几个子层。
    OSI的7层从上到下分别是: 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 ;
    其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端的数据流

    10.2、DNS

    DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。
    DNS协议运行在UDP协议之上,使用端口号53。在RFC文档中RFC 2181对DNS有规范说明,RFC 2136对DNS的动态更新进行说明,RFC 2308对DNS查询的反向缓存进行说明。

    10.3、Http协议状态码

    200 OK 服务器成功处理了请求(这个是我们见到最多的)
    301/302 Moved Permanently(重定向)请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置
    304 Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存
    404 Not Found 未找到资源
    501 Internal Server Error服务器遇到一个错误,使其无法对请求提供服务

    10.4、TCP、UDP

    TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。

    TCP支持的应用协议主要有:Telnet、FTP、SMTP等
    UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等

    10.5、IP

    网络之间互连的协议(IP)是Internet Protocol的外语缩写, [1] 中文缩写为“网协”。
    网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,可以分为5类。另外,IP还有进入防护,知识产权,指针寄存器等含义。

    10.6、https

    10.6.1 http与https的区别

    超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。
    为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
    HTTPS和HTTP的区别主要为以下四点:

    一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
    二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
    三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    10.6.2、https的通信原理

    客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤:
    HTTPS方式与Web服务器
     (1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
     (2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
     (3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
     (4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
     (5)Web服务器利用自己的私钥解密出会话密钥。
     (6)Web服务器利用会话密钥加密与客户端之间的通信。

    10.6.3、https的四次握手:

    1、客户端请求建立SSL链接,并向服务端发送一个随机数–Client random和客户端支持的加密方法,比如RSA公钥加密,此时是明文传输。

    2、服务端回复一种客户端支持的加密方法、一个随机数–Server random、授信的服务器证书和非对称加密的公钥。

    3.客户端收到服务端的回复后利用服务端的公钥,加上新的随机数–Premaster secret 通过服务端下发的公钥及加密方法进行加密,发送给服务器。

    4、服务端收到客户端的回复,利用已知的加解密方式进行解密,同时利用Client random、Server random和Premaster secret通过一定的算法生成HTTP链接数据传输的对称加密key – session key。

    11、IO与NIO

    一个IO操作可以分为两个部分:发出请求、结果完成。如果从发出请求到结果返回,一直Block,那就是Blocking IO;如果发出请求就可以返回(结果完成不考虑),就是non-blocking IO;如果发出请求就返回,结果返回是Block在select或者poll上的,则其只能称为IO multiplexing;如果发出请求就返回,结果返回通过Call Back的方式被处理,就是AIO。
    11.1、NIO和IO的主要区别:
    1)IO是面向流的,NIO是面向缓冲区的
    2)阻塞与非阻塞IO:
    这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。
    3)选择器(Selectors)
    Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

    12、 Web服务

    Web服务器的工作原理并不复杂,一般可分成如下4个步骤:连接过程、请求过程、应答过程以及关闭连接。下面对这4个步骤作一简单的介绍。连接过程就是Web服务器和其浏览器之间所建立起来的一种连接。查看连接过程是否实现,用户可以找到和打开socket这个虚拟文件,这个文件的建立意味着连接过程这一步骤已经成功建立。请求过程就是Web的浏览器运用socket这个文件向其服务器而提出各种请求。应答过程就是运用HTTP协议把在请求过程中所提出来的请求传输到Web的服务器,进而实施任务处理,然后运用HTTP协议把任务处理的结果传输到Web的浏览器,同时在Web的浏览器上面展示上述所请求之界面。关闭连接就是当上一个步骤–应答过程完成以后,Web服务器和其浏览器之间断开连接之过程。Web服务器上述4个步骤环环相扣、紧密相联,逻辑性比较强,可以支持多个进程、多个线程以及多个进程与多个线程相混合的技术。

    13、幂等性

    幂等操作的特点是人一次或者多次执行产生的影响均与一次执行的影响相同。
    幂等函数和幂等方法实质使用了相同的参数重复执行。
    在很多场景中,我们可以使用分布式事务、分布式锁等来保证一个方法在同一时间内只能被同一个线程执行,从而保证他的幂等性。

    分布式锁通常有以下几种实现方案:
    基于数据库实现分布式锁
    基于缓存(redis)实现分布式锁
    给予zookeeper实现分布式锁

    14 RPC(远程过程调用)

    远程过程调用
    注册中心中任意一台机器宕机之后,可以切换到另一台主机上。如果所有的主机都宕机了,还可以依赖本地缓存进行通信

    展开全文
  • 如何在这三个 层次之间建立合理的分类检索体系成为企业建模知识管理的一个核心问题。文章引入模糊神经网络分类器解决企业参考模型库的模型分类问题,通过一个应用实例进行算法验证,并与基于模糊数据挖掘的分类方法...
  • ”团队知识管理的重要性正在被越来越多的企业和组织重视,戴尔、惠普、毕马威等众多知名公司早已搭建一套完善的团队知识管理体系。然而国内大部分公司在这方面还处于早期探索阶段。互联网团队属于重协作类型。对重...

    现代管理学之父彼得·德鲁克说:“21世纪的组织,最有价值的资产是组织内部的知识工作者和他们的生产力。”团队知识管理的重要性正在被越来越多的企业和组织重视,戴尔、惠普、毕马威等众多知名公司早已搭建一套完善的团队知识管理体系。然而国内大部分公司在这方面还处于早期探索阶段。

    互联网团队属于重协作类型。对重协作型的团队而言,知识管理更是极为重要。然而很多团队在搭建团队知识管理体系过程中遇到了很多问题。那么,究竟如何才能搭建起一套有价值的团队知识管理体系呢?

    一、了解团队知识管理体系

    1.知识管理是什么?

    知识管理目前仍没有一个标准的定义,众多定义中比较全面的一个是:

    在组织中建构一个量化与质化的知识系统,让组织中的资讯与知识,透过获得、创造、分享、整合、记录、存取、更新、创新等过程,不断的回馈到知识系统内,形成永不间断的累积个人与组织的知识成为组织智慧的循环,在企业组织中成为管理与应用的智慧资本,有助于企业做出正确的决策,以应对市场的变化。

    从定义中可以看出,团队知识管理体系有一个十分有趣的特点——团队知识管理体系是一个“生产者即消费者”的平台。由团队成员来生产内容,而这些内容也由团队成员来使用、分享,整个流程形成一个完整的内容生态环境。这个内容生态质量完全由团队自己来控制,价值的高低也取决于团队本身。即想要从中获得高价值的内容,就需要有人向其中输入高质量的内容。本质上跟知乎有些相像。所以想要创造一个健康的生态,就必须达成生产与消费的平衡。

    2.为什么要搭建团队知识管理体系?

    企业会把现金放在保险柜里,会对所有资产进行严密的管理,包括记录各个资产的账目、位置和数量等等。知识作为最有价值的资产,自然也需要妥善管理,以便它保证能够在最需要的时间将最需要的知识传送给最需要的人,这样可以帮助人们共享信息, 并进而将其通过不同的方式付诸实践, 终极目标是协助企业实现价值最大化。

    二、如何搭建团队知识管理体系

    第1步:普及

    创建团队知识库是一个很简单的动作,只要在某个平台上创建一个团队,我们甚至就可以说创建完成了。然而搭建不同,搭建是一个持续一段时间的行为。搭建包括前期的准备、规划,后期的管理、完善等等,直至形成一个完整的可持续的体系。

    如何让团队知识管理体系长久地运营下去才是难题,而能否解决这个难题的关键,正是团队是否认可这种方式。只有大家认可了,才会主动来做这件事情。前期需要对团队进行知识管理意识的普及,如跟大家分享其他企业利用这样的管理方式的例子,如让大家先尝试个人知识管理等。目次在于让大家认识到知识管理的有效性,继而愿意来尝试这种方法。

    第2步:规划

    规划是非常关键的一步,切勿提出要搭建团队知识管理体系后,只是简单地要求成员来上传自己的文档,后续就不再予以关注。这样不仅无法调动多数成员积极性,比较积极的一部分成员也只能按照自己的想法东拼西凑,最后搭建出一个非常混乱的体系。不仅耗费了积极成员的精力,还无法让他们得到任何成就感。

    如果要建立一个团队知识管理体系,一定要指定专人负责规划,职责到人才能够把事情做到位。至于如何制定具体的规则,可以结合难点,进行一场头脑风暴。不仅能够充分发挥团体的智慧,还能够了解每一个人的想法。

    在整个规划中,搭建知识架构这件事非常重要。后期在要求成员扩充内容时,可能成员本人并不知道该写什么,就会以架构作为参考来选题。所以架构本身就带有指导的性质,切不可敷衍。

    规划中的两个难点:

    难点1:怎样把隐性知识显性化?

    这里涉及到了关于知识的两个名词。隐性知识指的是未被表述的知识,如技能、秘诀等;显性知识则是以书面文字、图表和数学公式加以表述的知识,更加直观。一般来讲,隐性知识比显性知识更完善、更能创造价值,隐性知识的挖掘和利用能力,将成为个人和组织成功的关键。显性知识则必须能很快地再转换为隐性知识,否则它的真实价值就不复存在。因为显性知识转换为企业员工隐性知识的过程,一般都是知识应用的过程或知识成为生产力的过程。

    怎样把隐性知识显性化,通俗地来说就是怎样把优秀人才的工作经验转化大家看得懂的文字或流程等。一个可考虑的方式,是在每一个项目或较复杂工作做成果总结的时候,规定项目负责人对整个过程进行一次复盘。即除了提交成果以外,还要对整个项目从头到尾进行一次梳理,归纳出优点和不足。这样其他成员也能够间接从中吸取到经验教训。

    难点2:如何快速找到对自己有用的信息?

    完善的分类模式+脑图+准确标题=快速查找

    团队知识库会随时间而扩大,当目录层级非常多的时候,如何找到所需的信息成了一大难题。如果不在归纳梳理上花功夫,知识库里的内容就容易成为一个“杂书间”,完全没有条理,来找“书”的人也根本无法找到对自己有用的“书”。实际上,解决这个问题所要的事也很像一个图书管理员的日常。

    首先要建立一个合理的分类架构,这件事情要由对团队工作所有相关领域都极熟悉的元老级人物来做。因为他们知道什么是合理构架,知道团队需要什么样的内容,知道什么样的内容具有复用性,会从更严谨的角度出发来搭建架构。新人不够熟悉业务领域,所以无法搭建起一个实用合理的知识架构。

    然后要在已经创建了分类架构的基础上,制作一张全局预览图。比较建议的方式是做一张可以实时更新的云端协作思维导图,随着知识库内容的增加而更新。团队成员想查找信息的时候,只要打开脑图就能够找到大概的位置。因为文件夹目录只能看到当下的一层,而要精准地找到某个文件,则需要看到完整的结构。

    除此之外,在最初制定管理规则的时候,对文档标题进行比较严格的规定,要求标题中包括比较详细的关键字,也有助于查找。

    第3步:管理与完善

    规划中制定的规则在实施中还会发现各种不完善的地方,需要在后期的实施中持续优化。甚至可以做A/B 测试来观察不同的规则所带来的效果。规则方面,非常重要的一点是适度,不能让成员感到要求过分。这种用规则来进行约束的方法,可以称之为“硬管理”手段。

    与“硬管理”相对的还有“软管理”,指的是为达成目的所使用的非强制手段。在“软管理”中,管理者的作用十分关键。一方面能够起到表率作用:管理者自己分享一些经验、行业观察等,带起分享知识的风气。另一方面,管理者可以鼓励有潜力的成员,让员工感到被认可,从而主动分享自己的知识。还可以表扬对知识库贡献比较大的成员,增加他们的成就感,同时也让其他的成员愿意花心思来做这件事。

    实际上,最重要的是创造一个乐于分享的和谐氛围,让大家自发性地来分享知识,而不是因为被push才不得不写。

    此外,还要明白每个团队都有自己的特点,产品团队、研发团队、运营团队等等,在很多方面都有自己的特性。当前企业文化、员工素质、运营模式也是需要考虑的方面。应以专人管理辅以员工自发,并随其发展而逐步调整两者比例。

    管理难点:怎样让团队成员持续分享自己的知识?

    经济奖励+精神奖励=持续分享

    分享知识这件事本身就是有门槛的一件事,要求持续分享则是更高的目标。对于成员而言,团队知识管理体系常见的驱动力有两种:经济价值和个人价值。

    要求成员主动而持续地分享,最有效的还属经济驱动。常见形式是有直接的奖金鼓励,以及间接的积分或悬赏等鼓励方式。个人价值方面,则可以提供成员更多成就感,以及更优的工作机会。这两者激励机制都是反馈周期越短,效果越明显。

    Tips:先试错,再实行

    实际上搭建一个完整的团队知识分享体系是一个比较复杂的过程,需要投入许多成本和精力,所以可以先小范围进行尝试,采用产品中MVP(最小化可行产品)的理念来进行试错,等到状态比较理想的时候再在团队全体成员中实行。

    • 挑选团队知识管理平台

    想要搭建起一个完整的团队知识管理体系,必然要借助团队知识管理平台,用以管理存放团队知识文档。好的平台能让搭建团队知识体系这件事变得更简单,从而达到事半功倍的效果。

    1.对团队知识管理平台的要求

    一个好的团队知识平台至少要做到以下几个方面:

    (1)稳定,知识安全不丢失。

    文档的安全是首要考虑因素,所以平台最好由大厂提供。

    (2)存储空间大,且内容不泄密。

    团队知识、资料包括许多机密,平台一定要谨慎选择,非常小的第三方平台可能没有那么有保障。

    (3)个人文档和团队文档加以区分。

    方便成员使用,因为成员也有自己的知识库,需要加以区分。

    (4)多级目录,多种成员权限,多种文档权限。

    多种目录是为了分类与层级管理。多种权限则是leader的管理需要。

    (5)利于查看使用,分享便捷。

    使用方便和分享快速很重要。就使用而言,需要符合多终端的特点,这样才能满足不同的应用场景。分享则包括成员间的分享,以及向外部人员的分享,轻量操作为佳。

    (6)最好还提供多人共同编辑,而且编辑完能够直接保存到平台。

    多人编辑能够让工作流程更简单,不需要传输下载。直接保存到平台也是非常重要的功能。

    很多工具都把“编辑”与“保存”分离开了,编辑依托于别的工具,到保存的时候在纳入管理保存工具之下。流程的衔接性不友好,要在多个系统中切换。复杂的操作流程会提高分享门槛。

    (7)带一些沟通功能,如评论等。

    能够对文档进行评论可免去需要来回切换至IM工具的繁琐过程。评论最好是划词评论,能够更清晰地了解评论针对的是哪部分内容。

    展开全文
  • 因此,为了建立起富有成效的知识管理体系企业必须有所为,有所不为,把知识管理的重点放在影响企业生存与发展最重要的知识——核心知识上面,即通过建立企业的核心知识管理体系,来提高知识管理的成效。
  • 人工智能之知识图谱体系总结

    千次阅读 2020-04-14 18:23:13
    第一部分:知识图谱介绍 知识概念图谱介绍:知识是认知,图是载体,数据是实现,结构化的数据进行关联形成了知识图谱 知识图谱发展历程 人工智能的发展介绍:5次重要的发展里程碑 认知智能的基础:海量行为数据的...
    • 第一部分:知识图谱介绍
    1. 知识概念图谱介绍:知识是认知,图是载体,数据是实现,结构化的数据进行关联形成了知识图谱
    2. 知识图谱发展历程
    1. 人工智能的发展介绍:5次重要的发展里程碑
    2. 认知智能的基础:海量行为数据的知识化(推理预测),既定知识的海量数据化(表示和存储)
    3. 知识工程的发展:一阶谓语表示;
    • 知识的表示:
    1. 语义网介绍:语义网要解决对Web内容增加语义后提供查询功能。
    2. 语义网到知识图谱:抽取网页内容后,得到实体和实体关系
    • 知识图谱的类型和代表性知识图谱
    1. 知识图谱的类型:常见的大规模知识库,WordNet专家系统/Freebase/DBpedia/Wikidata
    2. 典型知识图谱:
    3. 语言类和项目类的知识图谱介绍
    4. 应用类知识图谱的介绍
    • 知识图谱的生命周期
    1. 知识图谱的知识体系构建:抽取网页内容后,得到实体和实体关系,实体识别和消除歧义,关系抽取和事件抽取
    2. 知识图谱的知识获取和融合:一种是基于RDF的存储;另一种是基于图数据库的存储。
    • 知识图谱的应用场景
    1. 应用场景之智能搜索和推荐:电商的商品推荐,
    2. 应用场景之智慧金融和医疗
    3. 知识图谱的内涵分析
    4. 知识图谱的未来发展方向
    • 知识图谱概述总结
    1. 什么是人工智能?人工智能的发展历程是怎样的?如何学习人工智能?人工智能有哪些应用?知识工程如何兴起,已经伴随人工智能的发展,促发了知识图谱的产生?大家回顾一下发展的关键里程碑:
    2. 1956年的达特茅斯会议标志着“人工智能”概念的诞生。约翰·麦卡锡提出了“人工智能”一词,标志着人工智能这门学科的诞生。麦卡锡也因此被誉为是“人工智能之父”。
    3. 1977年,在五届人工智能大会上,斯坦福科学家爱德华·费根鲍姆提出知识工程概念,成为人工智能的一个重要方向。
    4. 1997年,一个是十多年前IBM研发的计算机“深蓝”(DeepBlue)战胜了国际象棋冠军卡斯帕罗夫。
    5. 2012年,谷歌发布知识搜索引擎,基于知识图谱的实体技术,实现了从wikipieida维基百科中抽出实体及属性的知识网络。
    6. 2019年3月27日,ACM(美国计算机学会)宣布,深度学习的三位创造者Geoffrey Hinton、Yann LeCun以及Yoshua Bengio共同获得了2019年的图灵奖。
    7. 人脑的思维模型是这样的:我们会从以往的经验中总结出规律,这样当遇到新问题的时候,我们会利用已有的规律来预测接下来会发生什么事,也就是预测未来。机器的思维模型与人脑非常的相似,它们是从历史数据中总结出一个比较通用的模型,这样当遇到新的数据时,它们会利用已有的模型来挖掘出一些过去未曾发现的东西,也就是预测未知属性。
    8. 案例一:喜欢看NBA的人都知道,金州勇士队是2015年、2017年和2018年NBA的总冠军,是当前NBA中炙手可热的一支球队。但在2009年,它还是NBA里最烂的球队之一,成绩排名倒数第二。那么,它是如何在短短的几年之间实现从最差到最好的逆袭的呢?这就要归功于科技的力量了。由于勇士队靠近科技之都硅谷,而硅谷从来都不缺少创新,因此就有人想到用科技的手段来改变这支球队。首先,硅谷的工程师利用大数据和人工智能算法制定球队的发展战略和比赛战术;接着,经过数据分析,发现最有效的进攻是准确的传球和投篮,而不是个人的突破和扣篮;然后,利用实时数据及时调整比赛中的战术。就这样,金州勇士队一跃成为了NBA最牛的球队之一,这也是大数据和人工智能改变体育行业的一个典型例子。
    9. 案例二:大家对酒吧行业是否了解呢?传统的酒吧很难管理,美国酒吧的平均寿命不超过五年,除了经营不善之外,就要归因于酒水不好管理。据统计,一家酒吧大约23%的酒被酒保偷喝了,那么,有不有方法可以让难管理的酒吧变得容易管理呢?这时,大数据和人工智能又要显身手了。在成功的案例中,改造酒吧行业的方法为:首先,改造酒吧的酒架,装上可以测量重量的传感器以及无源的RFID芯片读写器,然后再在每个酒瓶上贴上一个RFID的芯片;接着,分析每一家酒吧过去经营情况的统计数据,以帮助酒吧的主人全面了解经营情况;然后,为每一家酒吧的异常情况提供预警;最后,综合各家酒吧数据的收集和分析,利用人工智能算法为酒吧老板提供该行业宏观的数据作为参考。
    10. 案例三:比如对于教育行业,我们经常谈论个性化教育、因材施教的理念。其核心在于理解学生当前的知识体系,而且这种知识体系依赖于我们所获取到的数据比如交互数据、评测数据、互动数据等等。为了分析学习路径以及知识结构,我们则需要针对于一个领域的概念知识图谱,简单来讲就是概念拓扑结构。

     

    1. “知识图谱本质上是语义网络(Semantic Network)的知识库”。但这有点抽象,所以换个角度,从实际应用的角度出发其实可以简单地把知识图谱理解成多关系图(Multi-relational Graph)。

     

    1. 图是由节点(Vertex)和边(Edge)来构成,但这些图通常只包含一种类型的节点和边。但相反,多关系图一般包含多种类型的节点和多种类型的边。

     

    1. 比如一个社交网络图谱里,我们既可以有“人”的实体,也可以包含“公司”实体。人和人之间的关系可以是“朋友”,也可以是“同事”关系。人和公司之间的关系可以是“现任职”或者“曾任职”的关系。

     

    1. 知识图谱应用的前提是已经构建好了知识图谱,也可以把它认为是一个知识库。这也是为什么它可以用来回答一些搜索相关问题的原因,比如在Google搜索引擎里输入“Who is the wife of Bill Gates?”,我们直接可以得到答案-“Melinda Gates”。这是因为我们在系统层面上已经创建好了一个包含“Bill Gates”和“Melinda Gates”的实体以及他俩之间关系的知识库。所以,当我们执行搜索的时候,就可以通过关键词提取("Bill Gates", "Melinda Gates", "wife")以及知识库上的匹配可以直接获得最终的答案。

     

    1. 知识图谱主要有两种存储方式:一种是基于RDF的存储;另一种是基于图数据库的存储。它们之间的区别如下图所示。RDF一个重要的设计原则是数据的易发布以及共享,图数据库则把重点放在了高效的图查询和搜索上。其次,RDF以三元组的方式来存储数据而且不包含属性信息,但图数据库一般以属性图为基本的表示形式,所以实体和关系可以包含属性,这就意味着更容易表达现实的业务场景。

     

     

    • 第二部分:知识图谱构建
    1. 知识的种类

     

    1. 陈述性知识(描述性知识)

     

    1. 描述客观事物的性状等静态信息

     

    1. 分为事物,概念,命题3个层次

     

    1. 事物是特定的事或物

     

    1. 概念是对一类事物本质特性的反映

     

    1. 命题是对事物之间关系的陈述

     

    1. 概括性命题

     

    1. 描述概念之间普遍关系

     

    1. 非概括性命题

     

    1. 描述特定事物之间的关系

     

    1. 过程性知识(程序性知识)

     

    1. 描述问题如何求解等动态信息

     

    1. 规则

     

    1. 描述事物的因果关系

     

    1. 控制结构

     

    1. 描述问题的求解步骤

     

    1. 图谱将传统基于浅层语义分析的信息服务范式提升到基于深层语义的知识服务

     

    1. 知识和结构化数据

     

    1. 本体

     

    1. 抽象的概念表示

     

    1. 数据库

     

    1. 电脑表示和存储计算机应用中的数据的产品

     

    1. 框架

     

    1. 数据的描述和定义

     

    1. 上下位知识: 大熊猫是猫科动物

     

    1. 属性之间的关系:子女和父母逆关系

     

    1. 属性的约束:人的父母只有两个

     

    1. 框架和数据构成完整的知识系统

     

    1. 知识是认知,图谱是载体,数据是实现

     

    1. 知识图谱发展历程

     

    1. 人工智能:推理、分析、预测、思考

     

    1. 语义网:推理

     

     

    • 知识图谱类型

     

    1. 知识的主客观性

     

    1. 事实性知识:确定性的,不随状态的变化而改变的知识(中国,首都,北京)

     

    1. 主观性知识:某个人或群体的情感信息

     

    1. 苹果手机太贵了

     

    1. 知识的变化性质

     

    1. 静态知识:不随时间,空间的变化而变化 出生日期

     

    1. 动态知识:随时间、空间的变化而变化 美国总统,上一任是奥巴马,下一任是特朗普事件是动态知识的重要组成部分

     

    1. 按场景分类

     

    1. 领域知识:领域特有的知识,法律,金融

     

    1. 百科知识:涵盖各行业、领域的通用知识 ,如人物,机构,地点

     

    1. 场景知识:某个特定场景下或者需要完成某个任务市需要的知识 如订机票、盖房子等

     

    1. 语言知识:语言层面的知识,如减肥和瘦身是同义词

     

    1. 常识知识:大家都认可的知识 如鸟会飞

     

    1. 举例:

     

    1. wordnet:语言知识图谱,由同义词和描述同义词的关系构成

     

    1. Hownet:语言认知知识图谱,基于词语义原,揭示词语更小的语义单元的含义。

     

    1. cyc和conceptnet:常识知识图谱

     

    1. 领域知识图谱:电影知识图谱、医学知识图谱

     

    • 知识图谱生命周期

     

    1. 知识体系构建

     

    1. 资源描述框架(RDF)

     

    1. 资源:能够使用RDF表示的对象称之为资源,包括实体、事件和概念等

     

    1. 谓词:描述资源本身的特征和资源之间的关系

     

    1. 陈述:RDF三元组<主体、谓词、宾语>

     

    1. 知识获取

     

    1. 结构化数据

     

    1. 表格、数据库

     

    1. 优点是置信度高,数据质量可靠

     

    1. 缺点是规模小,不易获得

     

    1. 半结构数据

     

    1. 不能通过固定的模板直接获得的结构化数据

     

    1. 优点:置信度高,规模大

     

    1. 缺点:样式多变,难以用模板获取

     

    1. 非结构化文本数据

     

    1. 文本信息抽取

     

    1. 主要任务

     

    1. 实体识别

     

    1. 姚明1981年出生在上海

     

    1. 姚明-》人名

     

    1. 1981-》时间词

     

    1. 上海-》地名

     

    1. 命名实体识别:

     

    1. 3大类:实体、时间、数字

     

    1. 7小类:人名、地名、机构名、时间、日期、货币和百分比

     

    1. 领域实体

     

    1. 实体消歧

     

    1. 消除指定实体的歧义

     

    1. 实体链接:给定文本中的某一个实体指称项链接到已有图谱的某个实体上

     

    1. 实体聚类:通过聚类的方法消除语料中所有同一实体指称项的歧义

     

    1. 关系抽取

     

    1. 按抽取目标的不同,分为:

     

    1. 关系分类

     

    1. 判别一句话中两个实例之间的语义关系

     

    1. 比如姚明,上海,判断是否具有出生地的关系

     

    1. 属性抽取

     

    1. 把这句话中的表达出生地的属性值抽取出来,即上海

     

    1. 关系实例抽取

     

    1. 判断实体间关系和抽取满足该关系的知识实例数据

     

    1. 例如上下位关系等

     

    1. 事件抽取

     

    1. 从描述事件信息的文本中抽取出用户感兴趣的事件信息并以结构化的形式呈现出来

     

    1. 是发生在某个特定的时间点或者时间段、某个特定的地域范围内,由一个或者多个角色参与的,一个或者多个动作组成的事情或者状态的改变

     

    1. 因为自然语言表达的歧义性和灵活性,很有挑战

     

    1. 方法有:

     

    1. 基于模式匹配的事件抽取

     

    1. 基于机器学习的事件抽取

     

    1. 知识融合

     

    1. 知识融合是对不同来源、不同语言或不同结构的知识进行融合,从而对已有知识图谱进行补充、更新和去重。

     

    1. 知识体系的融合

     

    1. 两个或多个异构知识体系的融合

     

    1. 相同类别,属性,关系进行映射

     

    1. 实例级别的融合

     

    1. 两个不同知识图谱中的实例

     

    1. 竖直方向的融合

     

    1. 融合高层通用本体与底层领域本体或实例数据

     

    1. 水平方向的融合

     

    1. 融合同层次的知识图谱,形成实例数据的互补

     

    1. 知识存储

     

    1. rdf:搜索的效率低下,提升效率,使用六重索引

     

    1. 图数据库neo4j:完善的图查询语言,支持大多数的图挖掘算法,缺点是数据更新慢,大节点的处理开销大

     

    • 知识推理

     

    1. 用于补全

     

    1. 传统逻辑的方法,规则冲突

     

    1. 表示学习的方法,分布式表示的语义向量相似度计算,缺点是不可解释,缺乏语义约束

     

    1. 用于自动问答的推理

     

    • 知识应用

     

    1. 智能搜索

     

    1. 返回相关的大量信息

     

    1. 用户意图理解

     

    1. 姚明运动员,搜索返回包含姚明的网页,知识图谱识别查询词的实体和属性,将姚明和运动员关联,得出用户查询的篮球运动员姚明。

     

    1. 自动问答

     

    1. 实体和关系推理得到答案

     

    1. 屠呦呦是哪里人?实体:屠呦呦 哪里人(国籍)

     

    1. 推荐

     

    1. 实体的关系推荐产品

     

    1. 如战狼2,右侧出现相似产品推荐,通过知识图谱的类型标签推荐的

     

     

     

    1. 决策支持

     

    1. 描述出来,描述知识的演变过程和发展规律,从而为研究和决策提供准确、可追踪、可解释、可推理的知识数据。如,通过对数据的一致性检验识别银行交易中的欺诈行为。

     

     

    • 知识图谱与深度学习

     

    1. 深度学习的本质是通过多层神经网络,自动学习处理对象的抽象表示,以便在具体任务中有更好的性能。

     

    1. 基于神经元的深度学习方法把处理对象表示为数值(标量/向量/矩阵),并通过数值计算(数值相乘、开方、乘以非线性函数)完成各种语义计算任务。

     

    1. 局限:

     

    1. 依赖大量标注数据

     

    1. 不可解释过程不可调控

     

    1. 端到端的学习难以加入先验知识

     

    1. 词表示学习

     

    1. 基于深度学习的自然语言处理方法

     

    • 知识图谱表示学习

     

    1. 将知识图谱中的用符号表示的实体和关系投影到低维向量空间中,这种表示体现实体和关系的语义信息

     

    1. 神经符号机

     

    1. 神经网络与符号相结合的技术

     

    1. 经典知识表示理论

     

    1. 逻辑

     

    1. 从简单到复杂分为:

     

    1. 命题逻辑:

     

    1. 具有最简单的语法,定义了具有真假值的原子命题,通过与、或、非、蕴含、当且仅当等将多个原子命题组合成复合命题,而推理过程则根据逻辑连接词的真值表进行推导

     

    1. 一阶谓词逻辑(一阶逻辑):

     

    1. 在命题逻辑基础上引入了全称量词和存在量词,使得一阶逻辑可以量化实体和概念

     

    1. 高阶逻辑:

     

    1. 量化谓词或集合

     

    1. 二阶量化集合

     

    1. 三阶量化集合的集合

     

    1. 谓词逻辑

     

     

     

    1. 优点

     

    1. 谓词逻辑是一种强大的知识表示语言,一阶谓词逻辑具有完备的逻辑推理算法。

     

    1. 缺点

     

    1. 但是难以表示过程性知识和不确定知识,当表示知识的属性、谓词和命题数量增大时,推理因为符号的组合爆炸问题,计算复杂度呈指数增长态势。比较耗时,工作效率低。

     

    1. 语义网络

     

    1. 通过语义关系连接的概念网络。语义单元的形式表示为:<节点1,关系,节点2>

     

    1. 语义网络的关系类型有:

     

    1. 实例关系(ISA):

     

    1. 具体与抽象,一个事物是另一个事物的一个实例,如“小王是一个人”。

     

    1. 分类关系(AKO):

     

    1. 一个事物是另一个事物的一种类型,如“篮球是一种球”

     

    1. 成员关系:

     

    1. 个体与集体,一个事物是另一个事物的成员,如“小于是一个公务员”

     

    1. 属性关系:

     

    1. 事物和其属性之间的关系,如人的身高

     

    1. 聚合关系:

     

    1. 组织或结构特征的部分与整体的关系,如“凳子是桌子的一部分”

     

    1. 时间关系:

     

    1. 不同事件发生时间的先后次序关系,常用在前,在后

     

    1. 位置关系:

     

    1. 不同事物在位置方面的关系,在上,在下,在内

     

    1. 相近关系:

     

    1. 不同事物在形状、内容等方面相似,如狮子老虎食物链位置相近

     

    1. 多元关系转化为多个二元关系

     

    1. 框架

     

    1. 从认知学的角度,人类都是以一种类似于框架的结构存储在记忆中。在根据实际情况对框架进行填充,填充的部分叫做槽,框架以及槽的粒度则根据人类对事物的认知程度而定。

     

    1. 脚本

     

    1. 通过一系列的原子动作来表示事物的基本行为,按照时间顺序描述事物的发生,类似于电影剧本。

     

    1. 脚本表示的知识有确定的时间或因果顺序。用来描述一个动态的过程而非静态知识的表示方法。比如:

     

    1. 顾客去餐厅吃饭脚本:

     

    1. 走进餐厅

     

    1. 拿号等待

     

    1. 被叫号

     

    1. 去固定座位就坐

     

    1. 完整的脚本包括:

     

    1. 进入条件

     

    1. 事件所发生的先决条件,比如就餐,顾客饿了不在家中就餐

     

    1. 角色

     

    1. 描述事件中可能出现的人物。如顾客,厨师,服务员等

     

    1. 道具

     

    1. 相关物体,菜单等

     

    1. 舞台

     

    1. 发生的空间,如餐馆

     

    1. 场景

     

    1. 时间的序列

     

    1. 主体部分,并不是只有一种就餐的场景,枚举出来是庞大的工程,这是脚本的一个缺陷

     

    1. 结局

     

    1. 结果,进入后续脚本的先决条件,比如顾客不再饿了

     

    1. 语义网中的知识表示方法

     

    1. 语义表示方法

     

    1. 这里指万维网,有效的组织和检索信息,从而使计算机能够利用互联网丰富的资源完成智能化的应用任务。

     

    1. 语义网知识描述体系

     

     

     

    1. XML

     

    1. 可扩展标记语言

     

    1. RDF

     

    1. 资源描述框架

     

    1. 三元组也可以扩展为内容更丰富的六元组

     

    1. 主语、谓词、宾语、时间、地点、附加信息

     

    1. OWL

     

    1. 网络本体语言

     

    1. 知识图谱中的知识表示方法

     

    1. 表示框架

     

     

     

    1. 事物

     

    1. 客观世界中的实体或对象

     

    1. 概念

     

    1. 具有相似本体特征的一类事物

     

    1. 属性

     

    1. 事物或概念具有的特征和特性等

     

    1. 关系

     

    1. 概念与实体之间的关联方式

     

    1. 函数

     

    1. 事物或概念之间转化的形式表达

     

    1. 约束

     

    1. 某项断言成立的限制条件的形式化描述

     

    1. 规则

     

    1. 一句某项断言得到逻辑推理的因果关系知识的形式化表达

     

    1. 公理

     

    1. 永远为真的断言

     

    1. 知识图谱真正的魅力在于它的图结构,在知识图谱上运行搜索,随机游走,网络流等大规模图算法,使得知识图谱与图论、概率图擦出火花。

     

    1. 基于知识图谱的逻辑规则的挖掘

     

    1. 得益于知识图谱频繁子图的挖掘,促进了逻辑规则的自动生成和评价

     

    1. 基于大规模链接图谱的标签传播

     

    1. 对知识图谱中的实体按照普通角度分类,有利于发现关键的实体

     

    1. 知识图谱的数值化表示方法

     

    1. 符号的数值化表示

     

    1. 语义计算

     

    1. 特征工程

     

    1. 文本的数值化表示

     

    1. 词空间模型

     

    1. 得到词的分布表示

     

    1. 知识图谱的数值化表示

     

     

     

    1. 基于张量分解

     

    1. 基于能量函数

     

     

     

    • 第三部分:知识体系和知识融合

     

    1. 知识融合通过框架匹配和实例对齐,把分散的知识资源联合起来,可以极大的增加知识图谱的覆盖领域和共享程度。

     

    1. 知识体系构建

     

    1. 知识体系三个方面核心内容:

     

     

    1. 对概念的分类

     

    1. 概念属性的描述

     

    1. 概念之间相互关系

     

    1. 知识体系的基本形态:

     

    1. 词汇

     

    1. 概念

     

    1. 分类关系

     

    1. 非分类关系

     

    1. 公理

     

    1. 人工构建方法

     

    1. 人工构建知识体系的过程可以分为6个阶段:

     

    1. 确定领域及任务

     

    1. 知识图谱作为人工智能应用的基础设施,其构建过程不能不了解具体的应用任务,也不能抛开领域建立一个高大全的、无法被广泛使用的产品。

     

    1. 与具体的领域密切相关

     

    1. 限定了知识体系应该包含的知识范围,领域内还是可以构建出各种各样的知识体系。

     

    1. 想要构建更为合适的体系,需要回答:

     

    1. 我们为什么要使用这个知识体系

     

    1. 这种知识体系呢个构帮助回答哪些类型的问题

     

    1. 谁会使用并维护这个知识体系

     

    1. 体系复用

     

    1. 知识体系具有很强的抽象性和概括性。从零开始构建不仅成本高昂,而且质量难以保证。

     

    1. 领域词典

     

    1. 专家编撰的领域内的词典,对构建限定领域的知识体系具有重要的参考意义。

     

    1. 语言学资源

     

    1. 语言学资源可以帮助知识体系的构建

     

    1. 开源知识图谱

     

    1. 网络百科

     

    1. 罗列要素

     

    1. 根据领域,罗列期望在知识图谱中出现的要素列表,主要包括概念、属性以及关系。

     

    1. 确定分类体系

     

    1. 确定了相关要素后,需要将其中表示概念的要素组织成层级结构的分类体系。

     

    1. 自顶向下

     

    1. 从最抽象的概念开始,逐层添加更为具体的概念

     

    1. 自底向上

     

    1. 从具体的概念开始,逐层开始抽象

     

    1. 定义属性及关系

     

    1. 为每个类别定义属性及关系。

     

    1. 属性是描述概念的内在特征,

     

    1. 关系是刻画不同概念之间的关系。

     

    1. 定义约束

     

    1. 不同的属性和关系具有不同的定义域和值域。

     

    1. 数据报障数据的一致性,避免异常值的出现。

     

    1. 自动构建方法

     

    1. 基于非结构化数据的知识体系学习

     

    1. 也叫基于文本的本体学习。首先利用自然语言处理工具对文本进行分词、句法分析、命名实体识别等预处理操作,然后利用模板匹配、统计学习的方法从文本抽取重要信息,主要包括领域概念、实例以及概念之间的关系。

     

    1. 领域概念抽取

     

    1. 从文本数据中抽取出构建知识体系所需的关键元素,包括实体类型名,属性名,关系名,步骤如下:

     

    1. 抽取候选术语

     

    1. 利用nlp抽取文本中的字符串,尽可能多的把真正的术语包括进来,对质量没有严格的要求,但是尽量保证抽取术语的高覆盖度。

     

    1. 术语过滤

     

    1. 领域术语与破铜词汇在语料上往往具有不同的统计特征,例如普通词汇在领域内外具有相似的分布,但是领域词汇有显著的区别。通过互信息(MI),词频逆文档概率(TF-IDF),术语相关频率(RTF)等过滤。

     

    1. 术语合并

     

    1. 把相同概念的术语合并,聚合到一起,转换的过程就是识别同义词的过程。

     

    1. 基于词典

     

    1. 词汇就是wordnet等

     

    1. 基于统计的方法

     

    1. 基于统计就是假设相同的词汇具有相似的上下文,在大规模语料上学习,并进行聚类,识别同义词。

     

    1. 分类体系构建

     

    1. 获取不同概念之间的继承关系,即上下文关系

     

    1. 基于词典

     

    1. wordnet

     

    1. 基于统计

     

    1. 通过词的上下文进行表示,并基于术语得到层次聚类。不同层次类别内的构成了上下位关系

     

    1. 概念属性及关系抽取

     

    1. 与概念属性抽取一致

     

    1. 基于结构化数据的知识体系学习

     

    1. 基于数据表的主键、外键和字段内容等信息实现上述目标

     

    1. 基于半结构化数据的知识体系学习

     

    1. 有一定模式,但是不太严格,如XML、HTML等格式

     

    1. 典型知识体系

     

    1. SUMO

     

    1. Schema.org

     

    1. freebase

     

    1. protege常被应用于基于框架的知识表示模型,一般是先定义类,在定义类中的属性,最后定义类和属性的约束。

     

    1. 知识融合

     

    1. 竖直方向的融合

     

    1. 融合高层通用本体与底层领域本体或实例数据

     

    1. 水平方向的融合

     

    1. 融合相同层次的知识图谱

     

    1. 如BabelNet融合不同语言的已购知识图谱,实现跨语言的知识关联和共享。

     

    1. 知识融合通过对多个相关知识图谱的对齐、关联和合并,使其成为一个整体。按融合对象的不同分为框架匹配和实体对齐。

     

    1. 框架匹配

     

    1. 对概念、属性、关系等知识描述体系进行匹配和融合

     

    1. 实体对齐

     

    1. 对齐合并相同的实体完成知识融合

     

    1. 但是实例知识有时有冲突,需要对其检测和消解

     

    1. 框架匹配

     

    1. 解决异构性,本体对齐

     

    1. 元素级匹配

     

    1. 独立考虑元素是不是匹配,不考虑其他元素的匹配

     

    1. 字符串匹配:

     

    1. 前缀距离,后缀距离,编辑距离和n元语法距离

     

    1. 这种方法忽略了语言符号的多义性,一词多义和一义多词

     

    1. 词向量

     

    1. 将词表示为低维语义向量空间的一个点,语义相似度用点之间的距离来衡量。与字符串相比,有更强的捕获词背后的真正语义的能力。

     

    1. 可将其与其他编辑距离等结合,混合方法获得了很好的性能。

     

    1. 结构级匹配

     

    1. 不把各个元素作为孤立的资源,利用知识图谱的结构,在元素匹配中考虑其他元素的影响。

     

    1. 不同元素的匹配之间也会有影响

     

    1. 例如属性的定义域和值域匹配度高,属性匹配度也高。基本思想是:相似的概念具有相似的概念结构。

     

    1. 基于图的技术

     

    1. 当做已经标记的图结构

     

    1. 对于两个本体的节点,如果它们的邻接节点是相似的,它们也是相似的。发现最大公共子图的问题,计算量很大

     

    1. 基于分类体系的技术

     

    1. 分类体系进行对齐

     

    1. 基于统计分析的技术

     

    1. 对已有样本挖掘其中蕴含的规律

     

    1. 分组,计算距离

     

    1. 实体对齐

     

    1. 成对实体对齐

     

    1. 协同实体对齐

     

    1. 表示学习方法

     

    1. 计算实体相似度

     

    1. 不需要依赖人工设定的规则和特征,也不需要了解知识库的命名习惯 适应性强

     

    1. KB1,KB2,产生初始种子对齐,核心思想是种子对齐中的两个向量要尽可能类似。

     

    1. 冲突检测和消解

     

    1. 冲突忽略

     

    1. 冲突避免

     

    1. 过滤

     

    1. 冲突消解

     

    1. 基于投票

     

    1. 频率

     

    1. 基于质量

     

    1. 来源

     

    1. 实体识别和扩展

     

    1. 在文本中对实体的引用可以有三种形式:

     

     

     

    1. 命名性指称

     

    1. 名词性指称

     

    1. 名词性指称

     

    1. 例如:中国乒乓球男队主教练刘国梁出席了会议,他布置了备战世乒赛的具体安排。

     

    1. 中国乒乓球男队主教练是名词性指称

     

    1. 刘国梁是命名性指称

     

    1. 他是代词性指称

     

    1. 这里主要研究命名性实体

     

    1. 实体识别

     

    1. 任务概述

     

    1. 识别出文本中实体的命名性指称项,标注其类别。

     

    1. 三大类:实体类,时间类,数字类

     

    1. 七小类:人名,地名,组织名,时间,日期,货币和百分比

     

    1. 实体识别的难点

     

    1. 时间,日期,货币和百分比的构成有比较明显的规律,识别起来相对容易

     

    1. 人名、地名和组织名用字灵活,识别的难度也大。这里指的是这三类的识别

     

    1. 包括两部分:

     

     

     

    1. 识别实体边界

     

    1. 确定实体类别

     

    1. 难点在于:

     

    1. 命名实体形式多变

     

    1. 内部结构复杂,对中文来说尤其如此

     

    1. 人名

     

    1. 包含姓氏和名,姓的用字是有限制的,但是名的用法灵活。还有很大其他的形式,使用字号代替人,姓+前缀/后缀以及职务名代替人。如杜甫,杜子美,子美是同一个人,李杜则是一个简称。

     

    1. 地名

     

    1. 若干个字组成,可能包括作为后缀的关键字。也有一些简称。如:湖北,湖北省,鄂

     

    1. 机构名

     

    1. 可以包含命名性成分,修饰性成分,表示地名的成分以及关键词成分。如北京百得投资咨询公司

     

    1. 机构名嵌套子机构名,北京大学附属小学

     

    1. 简称形式,中国奥委会

     

    1. 命名实体的语言环境复杂

     

    1. 在不同语境下可能就不是实体

     

    1. 人名:彩霞,有时是人名,有时是自然现象

     

    1. 地名:河南,有的是省名,有的是泛指

     

    1. 机构名:新世界,有时是机构名,有时是短语

     

    1. 英语有明显的标志,如首字母大写,识别边界容易,但是中文没有,相比

     

    1. 英文有明显的词边界标志符

     

    1. 首字母大写

     

    1. 基于规则的实体识别方法

     

    1. 基于命名实体词典的方法

     

    1. 采用字符串完全匹配或部分匹配的方式

     

    1. 基于正向最大匹配的方法

     

    1. 基于逆向最大匹配的方法

     

    1. 基于最短路径的方法

     

    1. 缺点

     

    1. 专家

     

    1. 规则冲突

     

    1. 根据优先级排序

     

    1. 通用性不强

     

    1. 基于机器学习的实体识别–基于特征的方法

     

    1. 计算概率值,鲁棒性好,构建代价小

     

    1. 主要是应用传统的人工设计的大量特征进行实体识别

     

    1. 而基于神经网络是自动捕获特征

     

    1. 无论何种模型,都在试图充分发现和利用实体所在的上下文特征和实体的内部特征,包括词形,词性和角色级特征

     

    1. 基本步骤:

     

    1. 特征选取

     

    1. 词性,大小写,词缀信息

     

    1. 模型学习

     

    1. 根据具体的任务和需求选择

     

    1. 比如:支持向量机、最大熵模型,隐马尔科夫模型以及条件随机场等,多模型也可以联合使用。

     

    1. 样本预测

     

    1. 利用训练好的模型,对输入样本进行标注预测

     

    1. 后处理

     

    1. 最广泛的是基于字的模型,代表性的方法有CRF。

     

    1. crf

     

    1. crf计算联合概率分布的概率图模型。输入的预测值标记为BIO

     

    1. 如果是人名,地名,组织名加上标签。

     

    1. 无向图G(V,E)

     

    1. V是顶点,E是边,X是输入序列,Y是输出序列。

     

    1. 数学表达式为:

     

    1. t,s为特征函数,t表示观察序列的标记序列位置i-1和i之间的转移特征函数。p是i位置状态特征函数。

     

    1. 特征函数集

     

    1. 特征函数,状态特征函数和转移特征函数,都是二值函数,0或1 上下文和词性特征

     

    1. 模型参数估计

     

    1. 估计模型参数,估计权重

     

    1. 命名实体标注

     

    1. 每个节点是每个预测值的不同取值。通过寻找网络中的最大概率的路径来确定输出的命名实体标记。动态规划方法,维特比方法。

     

    1. 基于机器学习的实体识别–基于神经网络的方法

     

    1. 特征表示

     

    1. lstm

     

    1. 模型训练

     

    1. softmax分类,但是忽略了约束,如O之后不能接I,接入CRF

     

    1. 模型分类

     

    1. 细粒度实体识别

     

    1. 细粒度特点

     

    1. 类型更多

     

    1. 类别具有层次结构

     

    1. 难点

     

    1. 类别制定

     

    1. 语料的标注

     

    1. 实体识别的方法

     

    1. 实体扩展

     

    1. 种子实体,获取同类实体的方法

     

    1. Google 后台维护大量的开发类别命名实体列表来提高用户体验。典型应用包括:

     

     

     

    1. 知识图谱中同类实体的检索和推荐

     

    1. 提高查询分析的准确率

     

    1. 辅助文档分类

     

    1. 辅助用户行为分析与广告精准投放

     

    1. 实体扩展方法

     

    1. 种子处理模块

     

    1. 输入若干种子组成的初始种子集合,输出高质量种子组成的集合

     

    1. 实体抽取模块

     

    1. 抽取目标实体,打分排序,输入种子,输出排序后的实体列表

     

    1. 结果过滤模块

     

    1. 实体抽取的方法有:

     

    1. 基于模块的实体抽取

     

    1. 好的模板出现次数频繁,总是指示目标类别的实体,可以在不需要其他知识前提下在文本中被识别出来

     

    1. 基于统计学习的实体抽取

     

    1. 基于上下文相似的方法

     

    1. 融合模板和上下文相似的方法

     

    1. 种子处理与结果过滤

     

    1. bootstapping

     

    1. 错误放大

     

    1. 引用

     

    1. 如何用简单易懂的例子解释条件随机场(CRF)模型?它和HMM有什么区别?

     

    1. 条件随机场CRF

     

    1. 知识存储和检索

     

    1. 知识图谱是一种有向图结构,描述了现实世界中存在的实体、事件或者概念以及他们之间的关系。图中的节点表示实体、事件或者概念,图中的边表示相邻节点的关系。

     

     

     

    1. 知识图谱的存储

     

    1. 基于表结构的存储

     

    1. 利用二维的数据表对知识图谱中的数据进行存储。根据不同的设计原则,可以具有不同的表结构,比如

     

    1. 三元组表

     

    1. 如jena等,优点是简单直接,易于理解,

     

    1. 缺点是:

     

    1. 整个知识图谱都存储在一张表中,导致单表的规模太大。

     

    1. 相应的插入,删除,查询,修改的操作开销也大。对实用性大打折扣。

     

    1. 复杂查询在这种存储结构上的开销巨大

     

    1. 复杂查询拆分成若干个简单查询的操作,降低了查询的效率。

     

    1. 类型表

     

    1. 为每个类型构建一张表,同一类型的实例放在相同的表中。每一行存实例,每一列代表实体的一个属性。

     

    1. 缺点:

     

    1. 大量数据字段的冗余存储

     

    1. 假如实例又是物理学家又是数学学家,那么同属于这两个类别的实例会同时存储在这两个表中,共有属性会重复存储。

     

    1. 大量的数据列为空值

     

    1. 解决的方法可以是特有属性拿出来,保存在上一级类型对应的数据表中,下级表继承上级表的所有属性。

     

    1. 缺点:

     

    1. 查询时必须指明属性或者关系,无法做到不确定属性或关系查询

     

    1. 表和具体类型对应,不同类型的数据具有不同的结构,查询时也要知道目标对象的类型才能确定查找的数据表。

     

    1. 查询不同类型的实体,需要多表的链接,开销巨大

     

    1. 丰富实体类型的,要建大量的数据表。

     

    1. 关系数据库

     

    1. 关系数据库通过属性对现实世界中的事物进行描述。一行一个记录,一列表示一个属性。

     

    1. 候选集

     

    1. 能够唯一标识一条记录的最少的属性集合

     

    1. 主键

     

    1. 一个数据库包含多个候选集,从中任意选取一个为主键。

     

    1. 外键

     

    1. 数据表中的某个属性或属性组是其他表的候选集,那么为该表的外键。

     

    1. 主属性与非主属性

     

    1. 包含在任何候选键中的属性为主属性,不包含在任何候选键中的属性为非主属性。

     

    1. 对知识图谱的操作要转为SQL语句执行。

     

    1. 基于图结构的存储

     

    1. 基于图的能直接反应图谱的内部结构,有利于知识的查询。也可以借鉴图的算法,有利于知识的深度挖掘与推理。

     

    1. 基于图结构的存储模型

     

    1. 从实体出发

     

    1. 优点

     

    1. 利用有向图对知识图谱的数据进行建模

     

    1. 不仅可以为节点定义属性,还可以为边定义属性

     

    1. 常用图数据库

     

    1. neo4j:开源、高性能,轻量

     

    1. orientDB

     

    1. infogrid

     

    1. hypergraphdb

     

    1. infiniteGraph

     

    1. 知识图谱的检索

     

    1. 常见形式化查询语言

     

    1. 关系库:SQL

     

    1. 图数据库:SPARQL

     

     

     

    1. SQL语言

     

    1. 数据插入

     

    1. insert into 表名 values (值1,值2,…)[,(值1,值2,…),…]

     

    1. 值可以为多个

     

    1. 如:

     

    1. insert into Triples Values (‘费米’,‘老师’,‘伯恩’),(‘伯恩’,‘类型’,‘数学家’)

     

    1. 数据修改

     

    1. update 表名 set 列1=值1,列2=值2,…where 条件

     

    1. where指定需要修改的记录,不然所有的都被修改

     

    1. update triples set O=‘1901’ where s=‘费米’ and P=‘出生日期’

     

    1. 数据删除

     

    1. delete from 表名 where 条件

     

    1. delete from triples where s=‘奥本’ or o=‘奥本’

     

    1. 数据查询

     

    1. 查询结果存在一个临时的表中

     

    1. select 列1 ,列2 … from 表名 where 条件

     

    1. select S from P =‘类型’ and O =‘数学家’

     

    1. SPARQL语言

     

    1. 为RDF数据开发的一种查询语言和数据获取协议

     

    1. 数据插入

     

    1. insert data 三元组数据

     

    1. 多条三元组用.分隔,已存在则忽略

     

    1. 头实体相同的可用;分隔

     

    1. insert data {

     

    1. ns:伯恩 ns:类型 ns:数学家;

     

    1. ns:类型 ns:物理学家.

     

    1. }

     

    1. 数据删除

     

    1. delete data 三元组数据

     

    1. 删除三元组:

     

    1. delete data {

     

    1. ns:奥本 ns:类型 ns:物理学家.

     

    1. }

     

    1. 删除奥本节点:

     

    1. delete where {

     

    1. ns:奥本 ?p ?o.

     

    1. ?s ?p ns:奥本.

     

    1. }

     

    1. 数据更新

     

    1. 更新RDF三元组中的值,只能删除在插入

     

    1. 数据查询

     

    1. 丰富的数据查询功能

     

    1. 包括select、ask、describe、construct

     

    1. select:查询

     

    1. ask:测试是否存在

     

    1. describe:详尽资源的描述

     

    1. construct:生成RDF

     

    1. select

     

    1. select 变量1 变量2 where 图模式 select ?s

     

    1. where {

     

    1. ?s ns:类型 ns:数学家.

     

    1. }

     

    1. ask:

     

    1. ask 图模式

     

    1. ask {ns:伯恩 ns:类型 ?o.}

     

    1. describe

     

    1. describe 资源或变量[where 图模式]

     

    1. describe ?s where {?s ns:类型 ns:数学家.}

     

    1. construct

     

    1. 针对每个变量取值,替换RDF图模板中的变量,生成三元组

     

    1. construct {

     

    1. ?s ns:搭档 ns:奥本.

     

    1. }

     

    1. where {

     

    1. ?s ns:老师 ns:伯恩 .

     

    1. }

     

    1. 图检索技术

     

    1. 子图筛选

     

    1. 图索引技术是实现子图筛选的有效方法。

     

     

     

    1. 基于路径索引

     

    1. 基于路径索引是把图上所有长度小于某特定值的路径收集起来,并根据这些路径建立倒排索引.

     

    1. 基于子图的索引方法

     

    1. 频繁项集

     

    1. 频繁度是子图出现的次数

     

    1. 子图同构判定

     

    1. 枚举所有的同构子图

     

     

     

     

     

    1. 知识图谱中的推理任务

     

    1. 知识推理是人工智能应用迈向更高级认知智能的重要技术。包括知识补全和知识问答。

     

     

     

    1. 知识补全

     

    1. 面向知识库或者知识图谱的事实补全

     

    1. 如图谱中给出了出生地但没有国籍,即可以通过推理的方法把实体或关系预测出来。称为链接预测。

     

    1. 它是利用已知知识预测未知的隐含知识,利于完善现有知识图谱。

     

    1. 包含两个评测任务:

     

     

     

    1. 三元组分类

     

    1. 判断是否正确 比如

     

    1. 首都(北京,中国)

     

    1. 首都(成都,中国)是错的,二分类问题,

     

    1. 过程是补全时可以选一条边连接任意两个实体,构成新的三元组,判断是否正确。

     

    1. 链接预测

     

    1. 预测三元组的头实体或尾实体

     

    1. 能预测出则能加关系。

     

    1. 知识问答

     

    1. 简单推理

     

    1. 将问题转化为图谱上三元组的查询或者三元组序的查询。对于缺失的需要使用推理,例如唐朝开国皇帝是谁,若开国皇帝(唐朝,李渊)是缺失的。通过前文的链接预测开国皇帝(唐朝,X)。若问开国皇帝的父亲是谁,推理开国皇帝(唐朝,李渊),再对父亲(李渊,x)进行查询和推理。

     

    1. 复杂推理

     

    1. 表示成多个链接组成的非链式或有嵌套的复杂结构时,需要推理。

     

    1. 桃花开花后结果,问开花的目的是什么

     

    1. 答案是吸引蜜蜂采蜜,就是一个推理问题。

     

    1. 知识推理分类

     

    1. 归纳推理和演绎推理

     

    1. 归纳推理

     

    1. 从特殊到一般的过程。根据部分对象具有的性质,推出一类事物中所有对象都具有的这类性质的推理方式。

     

    1. 对资料进行观察、分析和归纳整理

     

    1. 得出规律性的结论,即猜想

     

    1. 检验猜想

     

    1. 例如<蓝鲸,可以喷射,水柱>

     

    1. <抹香鲸,可以喷射,水柱>

     

    1. 观察整理得:

     

    1. <xx鲸,可以喷射,水柱>

     

    1. 检验猜想:

     

    1. <齿鲸,是一种,鲸鱼>

     

    1. <齿鲸,可以喷射,水柱>

     

    1. 演绎推理

     

    1. 从一般到特殊

     

    1. 大前提,小前提,结论

     

    1. 大前提:

     

    1. 虎鲸背部有背鳍

     

    1. 小前提:

     

    1. 背部有背鳍的鲸鱼都属于海豚科

     

    1. 结论:

     

    1. 虎鲸属于海豚科

     

    1. 确定性推理与不确定性推理

     

    1. 确定性逻辑推理

     

    1. 逻辑推理,具有完备的推理过程和充分的表达能力

     

    1. 不确定性推理

     

    1. 根据以往的经验和分析,结合专家先验知识构建概率模型,并利用统计计数、最大化后验概率等统计学习的手段对推理假设进行验证或推测。

     

    1. 概率图模型

     

    1. 有向图的贝叶斯网络以及无向图的马尔科夫网络

     

    1. NP难题 主要的改进有:

     

    1. 基于和积变量消除的方法,通过对一个变量求和,并和其他因子相乘以消除变量,简化

     

    1. 基于概率图结构的置信传播或期望传播的方法,将原有的推理问题转为优化问题,优化 的方式设计好的能力函数或势函数求解概率最大以达到推理的目的

     

    1. 从所有实例触发,都其进行统计或采样以估计推理目标概率,如蒙特卡洛采样等

     

    1. 只对具有直接概率依赖的实例级元素,并没有对更高层次的语义框架进行抽象,但需要大量的重复的概率依赖关系,需要大量计算。

     

    1. 概率逻辑推理

     

    1. 弥补了概率图模型中缺乏可复用规则的特点。

     

    1. 结构学习又可以称为概率逻辑推理模型下的规则自动挖掘。迭代局部搜索代替全局搜素。

     

    1. 关联规则挖掘

     

    1. 路径排序算法是基于图模型上随机游走的启发式方法,通过枚举或抽样图上的两个节点间的路径,递归地计算两个点间的到达概率,对每个路径进行打分。

     

    1. 符号推理和数值推理

     

    1. 传统的逻辑推理。特点是在知识图谱中的实体和符号上直接进行推理了操作。

     

     

     

    1. 基于符号演算的推理

     

    1. 归纳推理:学习推理规则

     

    1. 有三大方法

     

     

     

    1. 频繁子图挖掘

     

    1. 父亲(x,y)^母亲(y,z)->奶奶(x,z)

     

    1. 频繁子图规则挖掘是一个相反的过程,它是搜索知识图谱的规则实例,再将规则实例中的实体替换成变量,加约束,确定规则的实用性。

     

    1. 计算路径 剪枝

     

    1. AMIE算法:

     

     

     

    1. 增加悬挂边

     

    1. 增加具体边

     

    1. 增加闭合边

     

    1. 归纳逻辑编程

     

    1. 更重视没有没有出现在图谱中的负三元组,认为 正例+负例+背景知识->假设。

     

     

     

    1. 结构学习方法

     

    1. 挑选整体概率最大的加入到推理模型中。 + 定义目标函数

     

     

     

    1. 创建逻辑规则结构

     

    1. 搜索逻辑规则的策略

     

    1. 提速方法

     

    1. 演绎推理:推理具体事实

     

    1. 确定性推理:λ推理

     

    1. λ程序语言设计的模型。

     

    1. λ三种操作:

     

    1. α-置换

     

    1. β-归约

     

    1. η-变换

     

    1. 不确定性推理:马尔科夫逻辑网和概率软逻辑

     

    1. 马尔科夫逻辑是被看成一种通过为逻辑规则绑定权重的方式将一阶逻辑向概率逻辑进行扩展的方法,当权重调整到无限大时,为一阶逻辑。

     

    1. 软逻辑是一种基于一阶逻辑谓词和马尔科夫逻辑网络的统计学习关系票框架。

     

    1. 基于数值计算的推理

     

    1. 将离散的符号表示成低维实数向量或矩阵以捕捉元素之间隐式关联的一种技术手段。

     

    1. 映射可以带来如下好处:

     

    1. 减少维度灾难

     

    1. 减少数据稀疏

     

    1. 通过数值计算填充了稀疏矩阵,在一定程度上解决了数据稀疏性问题。

     

    1. 使符号直接参与计算且计算速度非常快

     

    1. 有如下方法:

     

    1. 基于张量分解

     

    1. 矩阵分解的基本思想是用多个低维的矩阵或张量的积代替原始的关系矩阵,从而用少量的参数代替稀疏而大量的原始数据。

     

    1. 基于能量函数

     

    1. 目标不是恢复出原始的关系矩阵和张量,而是根据任务的不同,自定义能量函数使得三元组能量低,不成立的能量高,计算能量函数对事实是否成立进行推理。

     

    1. 符号演算和数值计算的融合推理

     

    1. 常识知识推理

     

     

     

    1. 知识问答与对话

     

    1. 知识图谱最直接和最重要的任务是满足用户的精确信息需求,提供个性化知识服务。

     

    1. 目前的问答只能事实型问题,不能很好地处理复杂问题。例如:为什么天是蓝色的。关注回答事实型问题的相关技术。

     

     

     

    1. 自动问答概述

     

    1. 九十年代中期,系统的主要特点:利用浅层自然语言处理技术分析问题,并利用信息检索等技术从大规模文本或网页红抽取答案。 由于用户需求的多样性和自然语言的复杂性,没有得到广泛应用。

     

    1. 两大困难:
    1. 缺乏高质量的知识资源

     

    1. 高效的自然语言技术

     

    1. 近几年,这两点有了很大的突破。

     

    1. 问答系统分很多类型:

     

    1. 单文本问答系统:阅读理解式问答系统 如入学考试评测任务和斯坦福问答测试平台SQuAD

     

    1. 固定语料非结构化文本问答系统

     

    1. 从给定的文本语料中抽取答案

     

    1. 网络问答系统

     

    1. 从互联网中查找问题的答案,但是因为互联网动态变化,难以评测

     

    1. 知识库问答系统

     

    1. 知识问答和基于知识图谱的问答系统

     

    1. 从预先建立好的结构化知识库中查找问题的答案。本章主要是这两个方面:

     

    1. 知识问答

     

    1. 知识问答技术概述

     

    1. 结构化查询语言的有点事表达能力强,但是缺点是用户不但需要掌握结构化查询语言的语法,而且还要充分了解知识库中的资源表达形式。

     

    1. 使用自然语言进行人机交互是最简便、最直接也是最有效的一种模式。

     

    1. 按照技术分为两种类型:

     

     

     

    1. 语义解析类型

     

    1. 转化为结构化语句,就可以直接通过检索知识图谱得到精简答案。

     

    1. 搜索排序类型

     

    1. 首先通过搜索与相关实体有路径联系的实体作为候选答案,利用从问句和候选答案提取出来的特征进行比对,进而对候选答案进行排序得到最优答案,例如屠呦呦,得到宁波市,中国,诺贝尔奖等实体,进行匹配和排序得到答案。

     

    1. 基于语义解析的方法

     

    1. 实质是语义解析。首先需要对问句中的词/短语与知识图谱中的资源项进行映射,然后对匹配到的资源项进行组合,最后对匹配和组合存在的歧义进行消解,得到结果。

     

    1. 语义解析分为:

     

    1. 基于训练数据的有监督方法

     

    1. 有哪些城市靠近大海?

     

    1. 哪些城市,靠近大海的语义和之间的组合关系

     

    1. 如何确定问句的字句(短语)和它们对应的形式化表示?

     

    1. 当已知各个子句的含义及其形式化表示,如何对它们进行语义组合?

     

    1. 语义组合模型

     

    1. 组合范畴语法的主要思想是把词的句法和语义信息组合在一起形成分析的基础词典,依据组合语法规则自底向上对自然语言句子进行解析。

     

    1. 语义辞典构造

     

    1. 逻辑表示语言

     

    1. 组合消歧模型

     

    1. 基于规则的无监督方法

     

    1. 语言分析工具模块

     

    1. 元素级匹配模块

     

    1. 三元组映射模块

     

    1. 融合和排序模块

     

    1. 基于搜索排序的方法

     

    1. 主题词,链接到实体库上。 从候选答案中选择正确的答案。或者排序。

     

     

     

    1. 基于特征工程的方法

     

    1. 对问句和候选答案定义特征,并使用特征工程的方法抽取它们,最后基于特征分配的分类模型对问题和答案匹配度进行建模。

     

    1. 问句特征抽取

     

    1. 依存句法分析,抽取

     

    1. 问题词,如谁,哪

     

    1. 问句焦点词,如名字、时间

     

    1. 主题词,多个选一个出来

     

    1. 中心动词,和答案相关的一些信息

     

    1. 把依存语法树转为特征树

     

    1. 候选答案特征抽取

     

    1. 问句-候选答案匹配

     

    1. 基于表示学习的神经网络方法

     

    1. 知识对话

     

    1. 知识对话,对话系统是更自然友好的知识服务模式,可以通过多轮人机交互满足用户的需求、完成具体的任务等。

     

    1. 对话系统有几大特征:

     

     

     

    1. 多角色切换

     

    1. 对话中通常有两个甚至多个角色,可以是提问者,也可以是问题回答者等,并且在对话中,各角色之间常常交替变化

     

    1. 连贯性

     

    1. 对话的前后内容是有关联的、有逻辑的

     

    1. 多模态

     

    1. 真正的对话中,包括语音、文字、图片等

     

    1. 知识对话技术概述

     

    1. 语音识别

     

    1. 接收用户的输入信息,把输入转为计算机方便表示和处理的文字形式。

     

    1. 对话理解

     

    1. 对用户的输入信息进行分析处理,获得对话的意图

     

    1. 对话管理

     

    1. 根据对话的意图做出合适的响应,控制整个对话过程,使用户和对话系统顺利交互,解决用户的问题

     

    1. 任务管理

     

    1. 根据具体的任务管理对话过程所涉及的实例型知识数据和领域知识

     

    1. 对话生成

     

    1. 负责将对话管理系统的决策信息转换成文本结构的自然语言

     

    1. 语音合成

     

    1. 负责将文本结果的信息转换成语音数据发送给用户

     

    1. 分为两类:

     

    1. 任务导向型系统

     

    1. 用户在使用系统时有确定的目标,一般为确定任务,如:订机票、查路线等

     

    1. 通用对话系统

     

    1. 用户没有具体目标,可能在多个任务之间切换

     

    1. 任务导向型对话模型

     

    1. 首先是系统引导对话,用户输入意图,通过用户输入和系统引导的方式交互地完善用户意图信息。

     

     

     

    1. 自然语言理解

     

    1. 目的是将文本数据表示的信息转换为可被机器处理的语义表示。

     

    1. 订机票有车次、类型、出发站、到达站、出发时间、到达时间、历时、票价

     

    1. 难度:

     

    1. 同样的意思有很多种不同的表达方式

     

    1. 自然语言表达常常存在不确定性

     

    1. 相同语言表达在不同语境下的语义可能完全不同

     

    1. 在自然语言中往往存在不规范、不流畅、重复、指代甚至是错误等情况 基于规则和模板,但是无法覆盖全。

     

    1. 槽抽取作为一个序列标注问题,通过对每个输入词的标注和分类找出各个槽对应的值。

     

    1. 对话管理

     

    1. 最重要的部分,也是体现其区别于问答系统的核心步骤。

     

    1. 用于控制对话的框架和结构,维护对话状态,通过与任务管理器的交互生成相应的动作。

     

    1. 方法有:

     

    1. 基于有限状态自动机的方法

     

    1. 最简答的对话管理方式。

     

    1. 把任务完成过程中系统向用户询问的各个问题表示为状态,而整个对话可以表示为状态之间的转移。

     

    1. 基于框架的方法

     

    1. 使用任务常常用框架表示,根据槽的情况控制对话的过程。由于可以一次获取框架中的多个槽值,因此,不需要重新询问用户已经提供过的信息。另外,填写各个槽值的时候也不需要按照固定的顺序进行,

     

    1. 基于概率模型的方法

     

    1. 以上两种均需要人工制定规则,耗费人力。基于概率统计的对话管理方法,使用数据驱动的方法自动学习对话模型。对话过程是个连续决策任务。

     

    1. 动作集合的目标是最大化完成任务回报等最小化损失。基于MDP求解的过程。

     

    1. 自然语言生成

     

    1. 得到具体的回复内容。

     

    1. 内容选择

     

    1. 管理模块决定

     

    1. 内容描述

     

    1. 生成模块

     

    1. 基于编码器和解码器的深度学习模型 + 知识检索

     

    1. 实体词 ,三元组

     

    1. 编码器

     

    1. 将问句和检索的知识实例编码成向量,以便后续深度生成模型利用。

     

    1. 解码器

     

    1. 根据答案和知识的编码向量生成自然答案。比如答案李连杰出生在北京

     

    1. 通用对话模型

     

    1. 基于模板的任务

     

    1. 处理和生成的句式简单,也比较固定,能处理的领域有限,不能处理复杂的对话,处理的自然度差。

     

    1. 输出关键词,和符合语法的输出。比较生硬,不够自然。

     

    1. 端到端的方法

     

    1. 深度学习从原始对话中学习对话模型,从而对各种各样的消息进行回复。

     

    1. 如果把句子(消息-回复)看出词的序列,那么对话的建模就是一个学习一个词序列X=[x1,x2,…,x3]到词序列Y=[y1,y2,…y3]转化的任务。

     

    1. 基于深度学习的seq2aeq模型。

     

    1. 采用的是编码器-解码器的框架。基于编码器得到抽象编码表示,另一个RNN用于解码。

     

    1. 评价方法

     

    1. 难以评价。人工评估和测试

     

    1. 用户满意度调查有几项:

     

     

     

    1. 文本识别模块的性能

     

    1. 任务易用度

     

    1. 交互速度

     

    1. 用户体验

     

    1. 系统范阔

     

    1. 期望行为

     

    1. 未来使用

     

    1. 评价指标基于以下两个准则:

     

    1. 最大化任务完成度

     

    1. 最小化成本开销

    知识图谱

     

    知识图谱 (Knowledge Graph)是一种基于图的数据结构,由节点(Point)和边(Edge)组成。在知识图谱里,每个节点表示现实世界中存在的“实体”,每条边为实体与实体之间的“关系”,实体和关系又有其自身的“属性”。实体、关系和属性构成知识图谱的核心三要素。

     

    概述

     

    知识图谱本质上是语义网络(Semantic Network)。目前知识图谱这个概念最早由Google在2012年提出,主要是用来优化现有的搜索引擎。最近,知识图谱慢慢地被泛指各种大规模的知识库。知识图谱的构建属于知识工程的范畴,其发展历程如图1所示。

     

     

     

     

     

    图1知识图谱的发展历程

     

    知识图谱从其知识的覆盖面来看可以分为开放域知识图谱和垂直领域知识图谱,前者主要是百科类和语义搜索引擎类的知识基础,后者在金融、教育、医疗、汽车等垂直领域积累行业内的数据而构成。

     

    知识图谱相关的关键技术包括构建和使用。知识图谱的构建有自顶向下和自底向上两种方法,现在大部分情况会混合使用这两种方法。知识图谱的构建应用了知识工程和自然语言处理的很多技术,包括知识抽取、知识融合、实体链接和知识推理。知识的获取是多源异构的,从非结构化数据中抽取知识是构建时的难点,包括实体、关系、属性及属性值的抽取。对不同来源的数据需要做去重、属性归一及关系补齐的融合操作。同时,根据图谱提供的信息可以推理得到更多隐含的知识,常用知识推理方法有基于逻辑的推理和基于图的推理。知识图谱的使用需要自然语言处理和图搜索算法的支持。

     

    知识图谱在语义搜索、百科知识及自动问答等方面有着很典型的应用。在语义搜索领域,基于知识图谱的语义搜索可以用自然语言的方式查询,通过对查询语句的语义理解,明确用户的真实意图,从知识图谱中获取精准的答案,并通过知识卡片等形式把结果结构化地展示给用户,目前具体应用有Google、百度知心、搜狗知立方等。在百科知识领域,知识图谱构建的知识库与传统的基于自然文本的百科相比,有高度结构化的优势。在自动问答和聊天机器人领域,知识图谱的应用包括开放域、特定领域的自动问答以及基于问答对(FAQ)的自动问答。比如IBM的Watson,Apple的Siri,Google Allo,Amazon Echo,百度度秘以及各种情感聊天机器人、客服机器人、教育机器人等。

     

    开源知识库

     

    Freebase是一个大规模链接数据库,是由硅谷创业公司MetaWeb于2005年启动的基于Creative Commons Attribution协议的语义网项目。Freebase主要采用社区成员协作方式构建,其数据源主要包括Wikipedia、NNDB、Fashion Model Directory、MusicBrainz和社区用户贡献等。Freebase基于RDF三元组模型,共有19亿条三元组,底层采用图数据库进行存储。2010年,Freebase被Google收购作为其知识图谱数据来源之一。2016年,Google宣布将Freebase的数据和API服务都迁移至Wikidata,并正式关闭了Freebase。

     

    WikiData是免费开放、多语言、任何人或机器都可以编辑修改的大规模链接知识库,是由维基百科于2012年启动的基于Creative Commons Attribution协议的项目。WikiData继承了Wikipedia的众包协作构建机制,但与Wikipedia不同,WikiData基于以三元组为基础的知识条目的自由编辑,目前已经有超过4667万条知识条目。

     

    DBPedia是由OpenLink Virtuoso托管和发布的基于GPL协议的开源知识库。DBpedia以互联网挖掘的方式从各种维基媒体项目创建的信息中提取结构化内容,以机器可读的形式存储知识,并提供信息收集、组织、共享、搜索和利用的手段。DBpedia 2014年发布的版本包含30亿条三元组。DBpedia知识库与现有的知识库相比有几个优点:涵盖领域多、代表真实的社区协议、会随着维基百科的变化而自动演变、多语言。DBpedia知识库的用例非常广泛,包括企业知识管理、Web搜索以及维基百科搜索的革命。

     

    YAGO是一种基于链接数据库的开放语义知识库,是由德国马普研究所与巴黎电讯科技大学于2007开始的基于Creative Commons Attribution协议的联合项目。YAGO主要集成了Wikipedia、WordNet和GeoNames三个来源的数据,包含1.2亿条三元组知识,其功能包括作为一个分类单元直接连接到DBpedia云知识库。目前YAGO在SUMO Ontology项目、DBpedia计划、UMBEL Ontology项目以及Freebase等项目中提供相关知识库支持,同时它也是IBM Watson的后端知识库之一。

     

    其他的开放知识图谱有:ConceptGraph、BabelNet、CN-DBPeidia、OpenKG等。

     

    开源构建工具

     

    Protege是基于Java语言开发的本体编辑和知识获取软件,是斯坦福大学医学院生物信息研究中心于1999年发布的基于BSD 2-clause协议的开源软件。Protege提供本体概念类、关系、属性和实例的构建,不基于具体的本体描述语言,因此用户可以在概念层次上构建领域本体模型。

     

    除了Protege,还有Stanford OpenIE、Tuffy、OpenKE、Grakn等应用于知识图谱构建的开源软件。但它们普遍受到的关注度不高,这在一定程度上体现出了知识图谱领域用于构建图谱的开源软件的匮乏。

     

    完整的知识图谱构建还包括知识的存储。知识图谱有两类存储方式,一类是传统的RDF结构存储,RDF 标准的结构化查询语言是SPARQL;另一类是图数据库,它可以弥补传统关系型数据库在存储知识图谱时查询复杂、缓慢的缺陷。目前常用的图数据库软件包括Neo4j、OrientDB、ArangoDB和AllegroGrap等。

     

    小结

     

    知识图谱提供了一种新的数据和知识组织方式,能够让多源异构的数据知识化,基于知识图谱能够建立各种知识服务和智能应用。知识图谱在金融、医疗、农业、法律等很多垂直领域的应用已经得到了迅速地展开,范围越来越广,程度由浅入深。但知识图谱的构建和应用具有很大的技术难度,需要自然语言处理、数据库和语义推理等多重技术的支持。

     

    展开全文
  • CISP V4.1 知识体系大纲 知识点梳理

    千次阅读 2018-11-28 17:10:44
    知识知识点 掌握要求 一、知识域:信息安全保障     1.1 知识子域:信息安全保障基础      1.1.1 信息安全概念  了解理解国际标准化组织、美国、欧盟等对信息安全的定义; 3 ...
  • JavaEE知识体系梳理

    万次阅读 多人点赞 2019-06-16 16:08:02
    Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程序。 Java SE 就是做电脑上...
  • 计算机视觉知识体系

    千次阅读 2018-08-25 16:28:29
    三方面知识点:图像处理、机器学习、基础数学与模型。 视频的三个场景:近距离(手机、智能硬件、PC等),室内中距离(室内,如办公室、商场、家内;卡口,门口等),室外远距离(道路、公共场所等) 二、系统工程...
  • 运维监控知识体系

    千次阅读 2019-02-04 12:58:57
    当然对监控不是很明白的朋友们,看了以下文章可能会对监控整个体系有比较深刻的认识。 0 监控目标 我们先来了解什么是监控,监控的重要性以及监控的目标,当然每个人所在的行业不同、公司不同、业务不...
  • 网络安全知识体系

    千次阅读 2020-03-13 12:58:49
    网络安全基础入门 1、网络安全当前大环境趋势 2、网络安全当前就业情况及课程内容概述 3、企业当前网络安全需求,从企业招聘开始 4、网络安全如何学习,该从那里入手,将来如何定位发展 5、网络信息安全基础知识 ...
  • 人工智能知识体系

    千次阅读 2018-12-13 15:54:39
    时间序列预测常应用于国民经济宏观控制、企业经营管理、市场潜力量预测、天气预报、水文预报等方面,是应用于金融行业的一种核心算法之一。 项目五:京东聊天机器人/智能客服 聊天...
  • java知识体系介绍

    万次阅读 2018-01-03 09:52:45
    本套课程体系为北京尚学堂科技集十年教学精华打造而成,并且是高端品牌“百战程序员”的主要教学体系之一(约占1/4课程,还有大数据、架构师、产品经理。4核课程让你挑战CTO职位)。“百战程序员”有“身经百战”含义...
  • 架构设计——架构知识体系

    万次阅读 多人点赞 2018-08-23 13:45:58
    架构设计——架构知识体系   1、什么是架构和架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。 此君说的架构和彼君理解的架构未必是一回事。 我们主要针对互联网服server系统...
  • DAMA数据管理知识体系指南pdf

    千次阅读 2018-07-06 23:15:00
    下载地址:网盘下载第1章 引论 1.1 数据:企业资产 1.2 数据、信息、知识 1.3 数据生命周期 1.4 数据管理职能 ...1.8 逐步完善的知识体系 1.9 DAMA--数据管理协会 1.10 本指南的目的 1.11 本指南...
  • 企业知识库管理系统

    千次阅读 2018-03-09 22:10:50
    在我看来,本系统就是两个核心点第一访问信息快速准确,第二安全科学合理的权限管理,其他还有知识分类,知识上传,下载等等。 本系统采取的后端的技术(本人负责后端):( 一、系统架构 SSM 三大框架。 通过...
  • 通过以上的步骤,目前我初步建立了自己的知识体系,这个体系能保证我在工作的时候该使用什么技能,该提高什么; 也保证了我实现“两小时高铁生活圈”的时候,我可以自带系统随时和大城市的人群、网络进行链接,...
  • BPM公共知识体系简介

    千次阅读 2010-01-24 23:07:00
    背景BPM专业协会(Association of BPM Professionals,ABPMP)于2008年2月初次发布BPM公共知识体系(CBOK™ V1.0),2009年3月发布了“BPM公共知识体系指南”(Guideto the Business Process Management Common Body ...
  • 前端工程师的知识体系

    千次阅读 2017-09-27 17:23:56
    下图是前端工程师图解:   前端开发的核心是HTML + CSS + JavaScript。本质上它们构成一个MVC框架,即HTML作为信息模型(Model),CSS控制样式...1.标签的分类 标签表示一个元素 按性质划分: Blo
  • ”团队知识管理的重要性正在被越来越多的企业和组织重视,戴尔、惠普、毕马威等众多知名公司早已搭建一套完善的团队知识管理体系。然而国内大部分公司在这方面还处于早期探索阶段。很多公司在搭建团毒知识管理体系...
  • 如何建立测试部门的知识体系

    千次阅读 2015-06-19 09:03:44
    领测软件测试网对于一个部门来说,如何积累项目经验,如何提高成员的知识水平是非常重要的,每个企业都有自己的企业文化,每个部门应该也要有自己的氛围,这里讨论下如何建立测试知识体系架构。下面是我的构思: ...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web2.0应用程序。2018年2月,Eclipse 宣布正式...
  • 数据科学之大数据知识体系大全

    千次阅读 2018-08-16 13:34:43
    原文链接:数据科学之大数据知识体系大全 1,浅谈数据科学 数据科学(数据科学)这一概念自大数据崛起也随之成为数据领域的讨论热点,从去年开始,“数据科学家”便成为了一个工作职位出现在各种招聘信息上。那么...
  • [转]PKM-个人知识体系建设

    千次阅读 2019-09-24 10:47:29
    这里集中了本站所有关于个人知识库、个人知识体系方面的文章,下面是展开的目录: PKM理论和方法 艾宾浩斯与他的遗忘曲线 记忆核系统 资料整理的方法 电子资料整理技巧 图书馆馆藏电子资料管理...
  • 产品知识体系之用户画像

    千次阅读 2018-08-29 17:05:58
    在产品设计阶段,用户画像主要是指通过市场调研等方式,将所收集的信息进行分类、聚类与关联分析,并输出几类具有典型特征的虚拟用户的过程。其目的主要是把握核心用户的需求。 在市场营销阶段,用户画像是指根据...
  • 前端知识体系及修炼攻略

    万次阅读 多人点赞 2013-03-15 10:29:12
    让我们先看看张克军绘制的前端知识体系结构: 前端开发的核心是HTML + CSS + JavaScript。本质上它们构成一个MVC框架,即HTML作为信息模型(Model),CSS控制样式(View),JavaScript负责调度数据和实现某种...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,452
精华内容 12,580
关键字:

企业知识知识分类体系