精华内容
下载资源
问答
  • 自然语言处理知识太庞大了,网上也都是一些零零散散的知识,比如单独讲某些模型,也没有来龙去脉,学习起来较为困难,于是我自己总结了一份知识体系结构,不足之处,欢迎指正。内容来源主要参考黄志洪老师的自然语言...
        自然语言处理知识太庞大了,网上也都是一些零零散散的知识,比如单独讲某些模型,也没有来龙去脉,学习起来较为困难,于是我自己总结了一份知识体系结构,不足之处,欢迎指正。内容来源主要参考黄志洪老师的自然语言处理课程。主要参考书为宗成庆老师的《统计自然语言处理》,虽然很多内容写的不清楚,但好像中文NLP书籍就这一本全一些,如果想看好的英文资料,可以到我的GitHub上下载:  
    

    http://github.com/lovesoft5/ml
    下面直接开始正文:
    一、自然语言处理概述
    1)自然语言处理:利用计算机为工具,对书面实行或者口头形式进行各种各样的处理和加工的技术,是研究人与人交际中以及人与计算机交际中的演员问题的一门学科,是人工智能的主要内容。
    2)自然语言处理是研究语言能力和语言应用的模型,建立计算机(算法)框架来实现这样的语言模型,并完善、评测、最终用于设计各种实用系统。
    3)研究问题(主要):
    信息检索
    机器翻译
    文档分类
    问答系统
    信息过滤
    自动文摘
    信息抽取
    文本挖掘
    舆情分析
    机器写作
    语音识别
    研究模式:自然语言场景问题,数学算法,算法如何应用到解决这些问题,预料训练,相关实际应用
    自然语言的困难:
    场景的困难:语言的多样性、多变性、歧义性
    学习的困难:艰难的数学模型(hmm,crf,EM,深度学习等)
    语料的困难:什么的语料?语料的作用?如何获取语料?
    二、形式语言与自动机
    语言:按照一定规律构成的句子或者字符串的有限或者无限的集合。
    描述语言的三种途径:
    穷举法
    文法(产生式系统)描述
    自动机
    自然语言不是人为设计而是自然进化的,形式语言比如:运算符号、化学分子式、编程语言
    形式语言理论朱啊哟研究的是内部结构模式这类语言的纯粹的语法领域,从语言学而来,作为一种理解自然语言的句法规律,在计算机科学中,形式语言通常作为定义编程和语法结构的基础
    形式语言与自动机基础知识:
    集合论
    图论
    自动机的应用:
    1,单词自动查错纠正
    2,词性消歧(什么是词性?什么的词性标注?为什么需要标注?如何标注?)
    形式语言的缺陷:
    1、对于像汉语,英语这样的大型自然语言系统,难以构造精确的文法
    2、不符合人类学习语言的习惯
    3、有些句子语法正确,但在语义上却不可能,形式语言无法排出这些句子
    4、解决方向:基于大量语料,采用统计学手段建立模型
    三、语言模型
    1)语言模型(重要):通过语料计算某个句子出现的概率(概率表示),常用的有2-元模型,3-元模型
    2)语言模型应用:
    语音识别歧义消除例如,给定拼音串:ta shi yan yan jiu saun fa de
    可能的汉字串:踏实烟酒算法的 他是研究酸法的 他是研究算法的,显然,最后一句才符合。
    3)语言模型的启示:
    1、开启自然语言处理的统计方法
    2、统计方法的一般步骤:
    收集大量语料
    对语料进行统计分析,得出知识
    针对场景建立算法模型
    解释和应用结果
    4) 语言模型性能评价,包括评价目标,评价的难点,常用指标(交叉熵,困惑度)
    5)数据平滑:
    数据平滑的概念,为什么需要平滑
    平滑的方法,加一法,加法平滑法,古德-图灵法,J-M法,Katz平滑法等
    6)语言模型的缺陷:
    语料来自不同的领域,而语言模型对文本类型、主题等十分敏感
    n与相邻的n-1个词相关,假设不是很成立。
    四、概率图模型,生成模型与判别模型,贝叶斯网络,马尔科夫链与隐马尔科夫模型(HMM)
    1)概率图模型概述(什么的概率图模型,参考清华大学教材《概率图模型》)
    2)马尔科夫过程(定义,理解)
    3)隐马尔科夫过程(定义,理解)
    HMM的三个基本问题(定义,解法,应用)
    注:第一个问题,涉及最大似然估计法,第二个问题涉及EM算法,第三个问题涉及维特比算 法,内容很多,要重点理解,(参考书李航《统计学习方法》,网上博客,笔者github)
    五、马尔科夫网,最大熵模型,条件随机场(CRF)
    1)HMM的三个基本问题的参数估计与计算
    2)什么是熵
    3)EM算法(应用十分广泛,好好理解)
    4)HMM的应用
    5)层次化马尔科夫模型与马尔科夫网络
    提出原因,HMM存在两个问题
    6)最大熵马尔科夫模型
    优点:与HMM相比,允许使用特征刻画观察序列,训练高效
    缺点: 存在标记偏置问题
    7)条件随机场及其应用(概念,模型过程,与HMM关系)
    参数估计方法(GIS算法,改进IIS算法)
    CRF基本问题:特征选取(特征模板)、概率计算、参数训练、解码(维特比)
    应用场景:
    词性标注类问题(现在一般用RNN+CRF)
    中文分词(发展过程,经典算法,了解开源工具jieba分词)
    中文人名,地名识别
    8) CRF++
    六、命名实体 识别,词性标注,内容挖掘、语义分析与篇章分析(大量用到前面的算法)
    1)命名实体识别问题
    相关概率,定义
    相关任务类型
    方法(基于规程->基于大规模语料库)
    2)未登录词的解决方法(搜索引擎,基于语料)
    3)CRF解决命名实体识别(NER)流程总结:
    训练阶段:确定特征模板,不同场景(人名,地名等)所使用的特征模板不同,对现有语料进行分词,在分词结果基础上进行词性标注(可能手工),NER对应的标注问题是基于词的,然后训练CRF模型,得到对应权值参数值
    识别过程:将待识别文档分词,然后送入CRF模型进行识别计算(维特比算法),得到标注序列,然后根据标注划分出命名实体
    4)词性标注(理解含义,意义)及其一致性检查方法(位置属性向量,词性标注序列向量,聚类或者分类算法)
    七、句法分析
    1)句法分析理解以及意义
    1、句法结构分析
    完全句法分析
    浅层分析(这里有很多方法。。。)
    2、 依存关系分析
    2)句法分析方法
    1、基于规则的句法结构分析
    2、基于统计的语法结构分析
    八、文本分类,情感分析
    1)文本分类,文本排重
    文本分类:在预定义的分类体系下,根据文本的特征,将给定的文本与一个或者多个类别相关联
    典型应用:垃圾邮件判定,网页自动分类
    2)文本表示,特征选取与权重计算,词向量
    文本特征选择常用方法:
    1、基于本文频率的特征提取法
    2、信息增量法
    3、X2(卡方)统计量
    4、互信息法
    3)分类器设计
    SVM,贝叶斯,决策树等
    4)分类器性能评测
    1、召回率
    2、正确率
    3、F1值
    5)主题模型(LDA)与PLSA
    LDA模型十分强大,基于贝叶斯改进了PLSA,可以提取出本章的主题词和关键词,建模过程复杂,难以理解。
    6)情感分析
    借助计算机帮助用户快速获取,整理和分析相关评论信息,对带有感情色彩的主观文本进行分析,处理和归纳例如,评论自动分析,水军识别。
    某种意义上看,情感分析也是一种特殊的分类问题
    7)应用案例
    九、信息检索,搜索引擎及其原理
    1)信息检索起源于图书馆资料查询检索,引入计算机技术后,从单纯的文本查询扩展到包含图片,音视频等多媒体信息检索,检索对象由数据库扩展到互联网。
    1、点对点检索
    2、精确匹配模型与相关匹配模型
    3、检索系统关键技术:标引,相关度计算
    2)常见模型:布尔模型,向量空间模型,概率模型
    3)常用技术:倒排索引,隐语义分析(LDA等)
    4)评测指标
    十、自动文摘与信息抽取,机器翻译,问答系统
    1)统计机器翻译的的思路,过程,难点,以及解决
    2)问答系统
    基本组成:问题分析,信息检索,答案抽取
    类型:基于问题-答案, 基于自由文本
    典型的解决思路
    3)自动文摘的意义,常用方法
    4)信息抽取模型(LDA等)
    十一、深度学习在自然语言中的应用
    1)单词表示,比如词向量的训练(wordvoc)
    2)自动写文本
    写新闻等
    3)机器翻译
    4)基于CNN、RNN的文本分类
    5)深度学习与CRF结合用于词性标注

    展开全文
  • 文章目录论述自然语言处理的技术范畴(基本全貌) 一、前言二、主要技术范畴1、语音合成(Speech Synthesis)2、语音识别(Speech Recognition)3、中文自动分词4、词性标注5、句法分析7、文本分类7、文本挖掘8、信息抽取9...

    论述自然语言处理的技术范畴

    一、前言

           本片博文主要是介绍说明自然语言处理的全貌,一些主要的技术范畴。
           自然语言处理(NLP)这个是一个很大的话题,,它是一个人机交互的一个过程,它涉及的学科比较广泛譬如如下所示:

        1:语言学
        2:计算机科学(提供模型表示,算法设计,计算机实现):
        3:当然还有数学以此来提供数学模型
        4:心理学(人类言语心理模型和理论)
        5:哲学(提供人类思维和语言的更高层次理论)
        6:统计学(提供样本数据的预测统计技术)
        7:电子工程(信息论基础和语言型号处理技术)
        8:生物学(人类言语行为机制理论)

           总之那涉及的学科范围广泛。不言而喻在自然语言处理研究工作中是十分艰难的,博主现在也只是学习它的一个小小的分支罢了,看到此篇博文的小伙伴希望能抛出你们的建议和意见,要是如此博主甚是感激,开心呀!!!


    二、主要技术范畴

    1、语音合成(Speech Synthesis)

           所谓的语音合成就是指用人工的方式产生人类语音。语音合成器,就是利用计算机系统作用在语音合成上。而语音合成器可以用软/硬件实现。
           文字转语音(Text-To-Speech,TTS)系统则是将一般语言的文字转换为语音,其他系统可以描绘语言符号的表示方式,就像音标转换至语音一样。
           语音合成器的质量: 通常取决于人声的相似度及语义是否能被了解。举个例子,对于个瞎子看不到文字,只能通过语音合成器很清楚的听到文字转换成语音的效果。
           语音合成的应用包括智能仪表、智能玩具、电子地图、电子导游、电子词典等。

           总结:用大白话来讲使用语音合成器可以实现文字转换为语音,音标转化为语音,并且效果如同非瞎看文字,瞎子听语音同一个效果为最好。

    2、语音识别(Speech Recognition)

           语音识别(Speech Recognition)技术也被称为语音转文本识别(Speech to Text,STT)目标是让计算机自动将人类的语音内容转换为相应的文字。
           语音识别技术的应用包括语音拨号、语音导航、室内设备控制、语音文档检索、简单的听写数据录入等。语音识别技术与其他自然语言处理技术如机器翻译及语音合成技术相结合,可以构建出更加复杂的应用,例如,语音到语音的翻译。
           总结:用大白话来讲语音识别就是借助计算机工具来识别人类说的话转化为可视化的东东(也就是文字啦)。

    3、中文自动分词

           中文自动分词指的是----->使用计算机----->自动对中文文本----->进行词语的切分。就像英文那样使得中文句子中的词之间有空格以标识。中文自动分词也是中文自然语言处理中的 最底层的一个环节。
    现有的方法:
           ⊚ 基于词典的匹配:前向最大匹配、后向最大匹配。
           ⊚ 基于字的标注:最大熵模型、条件随机场模型、感知器模型。
           ⊚ 其他方法:与词性标注结合、与句法分析结合。

           例如以下是博主写的一个简单的测试
           代码

    """
     author:jjk
     datetime:2018/11/1
     coding:utf-8
     project name:Pycharm_workstation
     Program function: 中文分词
                       结巴分词
     
    """
    import jieba # 导入结巴分词包
    import jieba.posseg as pseg
    import time #  时间
    
    time_Start = time.time()
    
    #f=open("t_with_splitter.txt","r")#读取文本  
    #string=f.read().decode("utf-8")
    
    string = '中文自动分词指的是使用计算机自动对中文文本进行词语的切分,' + \
             '即像英文那样使得中文句子中的词之间有空格以标识。' + \
             '中文自动分词被认为是中文自然语言处理中的一个最基本的环节'
    
    words = pseg.cut(string) # 进行分词
    result = "" #记录最终结果的变量 
    for w in words:
        result += str(w.word) + "/" + str(w.flag) # 加词性标注  
    print(result) # 输出结果
    f = open("result.txt","w") #将结果保存到另一个文档中 
    f.write(result)
    f.close()
    time_Stop = time.time()
    print("分词及词性标注完成,耗时:"+str(time_Stop-time_Start)+"秒。")# 输出结果
    

           结果
    在这里插入图片描述

    4、词性标注

           词性标注(Part-of-Speech tagging 或POS tagging) 又称词类标注或者简称标注,是指在词性标记集已确定,并且词典中每个词都有确定词性的基础上,将一个输入词串转换成相应词性标记串的过程。如上 3、中文自动分词 中举的例子的结果所示。
           在汉语中,因为汉语词汇词性多变的情况比较少见,大多词语只有一个词性,或者出现次最高的词性远远高于第二位的词性,相对比较简单。同时,它也受到一些条件约束。比如:兼类词在具体语境中的词性判定问题、未登录词即新词词性问题、兼类词问题等。
           词性标注方法包括概率方法、隐马尔可夫模型的词性标注方法、机器学习规则的方法等。

    5、句法分析

    • 句法分析

           句法分析(Parsing)就是指对句子中的词语语法功能进行分析。比如“欢迎大家使用演示平台”就可以表示为"欢迎\VV 大家\PN 使用\VV 演示\NN 平台\NN"。
           句法分析在中文信息处理中的主要应用包括机器翻译、命名实体识别等。

    • 自然语言生成

           自然语言生成研究使计算机具有人一样的表达和写作功能,即能够根据一些关键信息及其在机器内部的表达形式,经过一个规划过程,自动生成一段高质量的自然语言文本。自然语言处理包括自然语言理解和自然语言生成自然语言生成是人工智能和计算语言学的分支,相应的语言生成系统是基于语言信息处理的计算机模型,其工作过程与自然语言分析相反,从抽象的概念层次开始,通过选择并执行一定的语义和语法规则来生成文本。

    6、文本分类

           文本分类用计算机对文本集按照一定的分类器模型进行自动分类标记。文本分类的总体过程如下(引用自 NLPIR 汉语分词系统)。

    (1) 预处理:将原始语料格式化为同一格式,便于后续的统一处理。
    (2) 索引:将文档分解为基本处理单元,同时降低后续处理的开销。
    (3) 统计:词频统计,项(单词、概念)与分类的相关概率。
    (4) 特征抽取:从文档中抽取出反映文档主题的特征。
    (5) 分类器:分类器的训练。
    (6) 评价:分类器的测试结果分析。

           文本分类常用算法包括决策树、朴素贝叶斯、神经网络、支持向量机、线性最小平方拟合、KNN、遗传算法、最大熵等,广泛应用于垃圾过滤、新闻分类、词性标注等。

    7、文本挖掘

           文本挖掘一般指在文本处理过程中产生高质量的信息。高质量的信息通常通过分类和预测来产生,如模式识别。文本挖掘通常涉及输入文本的处理过程,产生结构化数据,并最终评价和解释输出。
           例如博主的这篇文章中对微信朋友圈个性签名生成词云的分析,就是一个文本挖掘。
           典型的文本挖掘方法包括文本分类、文本聚类、信息抽取、概念/实体挖掘、情感分析和观点分析等。

    8、信息抽取

           信息抽取(Information Extraction)是从大量文字数据中自动为访问数据库而抽取特定消息的技术
           简单点来说从给定文本中抽取重要的信息,比如时间、地点、人物、事件、原因、结果、数字、日期、货币、专有名词等。大白话就是,就是要了解谁在什么时候、什么原因、对谁、做了什么事、有什么结果,涉及实体识别、时间抽取、因果关系抽取等关键技术。

    9、 问答系统

           问答系统(Question Answering)是当下自然语言处理研究的热点,也是未来自然语言处理的重点问题。从问答系统的外部行为来看,其与目前主流资讯检索技术有两点不同:首先是查询方式为完整而口语化的问句,再者是其回传的为高精准度网页结果或明确的答案字串。
           至此不知道小伙伴你有没有想到聊天机器人呀!!!

    10、机器翻译

           机器翻译(Machine Translation,经常简写为MT)属于计算语言学的范畴,是计算机程序将文字或演说从一种自然语言翻译成另一种自然语言 。简单来说,机器翻译是通过将一个自然语言的字辞取代成另一个语言的字辞来实现的。借由使用语料库的技术,可达成更加复杂的自动翻译,包阔可更佳地处理不同的文法结构、辞汇辨识、惯用语的对应等。
           这里用博主自己的大白话的理解就是:将一种语言(比如中文) 翻译成

    11、文本情感分析

           文本情感分析(也称为意见挖掘)是指用自然语言处理、文本挖掘及计算机语言学等方法来识别和提取原素材中的主观信息 。通常来说,情感分析的目的是为了找出说话者/作者在某些话题上或者针对一个文本两极的观点的态度。这个态度或许是他的个人判断或评估,或许是他当时的情感状态(也就是说,作者在做出这个言论时的情绪状态),或是作者有意向的情感交流(就是作者想要读者所体验的情绪)等。
           总结:就是作者规定一些代表文本的态度词,然后使用可视化进行表现出来从而达到客户情感交流。

    12、自动摘要

           所谓自动摘要就是利用计算机自动地从原始文献中提取文摘,文摘是全面准确地反映某一文献中心内容的连贯短文。常用方法是自动摘要将文本作为句子的线性序列,将句子视为词的线性序列。
           自动摘要可以按照技术类型和信息提取分类。
           ⊚ 技术应用类型:自动提取给定文章的摘要信息,自动计算文章中词的权重,自动计算
    文章中句子的权重。
           ⊚ 信息提取:单篇文章的摘要自动提取,大规模文档的摘要自动提取,基于分类的摘要
    自动提取。
           举例如下所示:

    """
     author:jjk
     datetime:2018/10/15
     coding:utf-8
     project name:Pycharm_workstation
     Program function: 查找关键词
        思路:
    	     1:加载已有的文档数据集
    		 2:加载停用词表
    		 3:对数据集中的文档进行分词
    		 4:根据停用词表,过来干扰词
    		 5:根据数据集训练算法
    
    
    """
    
    import math
    import jieba
    import jieba.posseg as psg
    from gensim import corpora, models
    from jieba import analyse
    import functools
    import numpy as np
    
    
    # 停用词加载方法
    def get_stopword_list():
        stop_word_path = './data/stopword.txt'
        # 遍历txt文档,剔除''
        stopword_list = [sw.replace('\n', '') for sw in open(stop_word_path, encoding='utf-8').readlines()]
        return stopword_list
    
    
    # 分词方法,调用结巴接口
    # pos是判断是否采用词性标注的参数
    def seg_to_list(sentence, pos=False):
        if not pos:
            # 不进行词性标注的分词方法
            seg_list = jieba.cut(sentence)
        else:
            # 进行词性标注的分词方法
            seg_list = psg.cut(sentence)
        return seg_list
    
    
    # 去除干扰词,根据pos判断是否过滤除名词外的其他词性,再判断词是否在停用词表中,长度是否大于等于2等。
    def word_filter(seg_list, pos=False):
        stopword_list = get_stopword_list()
        filter_list = []
        # 根据pos参数选择是否词性过滤
        # 不进行词性过滤,则将词性都标记为n,表示全部保留
        for seg in seg_list:
            if not pos:
                word = seg
                flag = 'n'
            else:
                word = seg.word
                flag = seg.flag
            if not flag.startswith('n'):
                continue
            # 过滤高停用词表中的词,以及长度为<2的词
            if not word in stopword_list and len(word) > 1:
                filter_list.append(word)
        return filter_list
    
    
    # 数据加载
    # corpus.txt为数据集
    def load_data(pos=False, corpus_path='./data/corpus.txt'):
        # 调用上面 方式对数据集进行处理,处理之后的数据集仅保留非干扰词
        doc_list = []
        for line in open(corpus_path, 'rb'):
            content = line.strip()
            seg_list = seg_to_list(content, pos)
            filter_list = word_filter(seg_list, pos)
            doc_list.append(filter_list)
        return doc_list
    
    
    # idf值统计方法
    def train_idf(doc_list):
        idf_dic = {}
        # 总文档数
        tt_count = len(doc_list)
        # 每个词出现的文档数
        for doc in doc_list:
            for word in set(doc):
                idf_dic[word] = idf_dic.get(word, 0.0) + 1.0
    
        # 按公式转换为idf值,分母加1进行平滑处理
        for k, v in idf_dic.items():
            idf_dic[k] = math.log(tt_count / (1.0 + v))
        # 对于没有在字典中的词,默认其尽在一个文档出现,得到默认idf值
        default_idf = math.log(tt_count / (1.0))
        return idf_dic, default_idf
    
    
    # topK
    # cmp()函数是为了输出top关键词时,先按照关键词的计算分值排序,在得分相同时,根据关键词进行排序时
    def cmp(e1, e2):
        # import numpy as np
        res = np.sign(e1[1] - e2[1])
        if res != 0:
            return res
        else:
            a = e1[0] + e2[0]
            b = e2[0] + e1[0]
            if a > b:
                return 1
            elif a == b:
                return 0
            else:
                return -1
    
    
    # TF-IDF类
    class TfIdf(object):
        # 训练好的idf字典,默认idf值,处理后的待提取文本,关键词数量
        def __init__(self, idf_dic, default_idf, word_list, keyword_num):
            self.word_list = word_list
            self.idf_dic, self.default_idf = idf_dic, default_idf
            self.tf_dic = self.get_tf_dic()
            self.keyword_num = keyword_num
    
        # 统计tf值
        def get_tf_dic(self):
            tf_dic = {}
            for word in self.word_list:
                tf_dic[word] = tf_dic.get(word, 0.0) + 1.0
            tt_count = len(self.word_list)
            for k, v in tf_dic.items():
                tf_dic[k] = float(v) / tt_count
            return tf_dic
    
        # 按公式计算tf-idf
        def get_tfidf(self):
            tfidf_dic = {}
            for word in self.word_list:
                idf = self.idf_dic.get(word, self.default_idf)
                tf = self.tf_dic.get(word, 0)
                tfidf = tf * idf
                tfidf_dic[word] = tfidf
            # 根据tf-idf排序,取排名前keyword_num的词作为关键词
            for k, v in sorted(tfidf_dic.items(), key=functools.cmp_to_key(cmp), reverse=True)[:self.keyword_num]:
                print(k + "/", end='')
            print()
    
    
    # 主题模型
    class TopicModel(object):
        #
        def __init__(self, doc_list, keyword_num, model="LSI", num_topics=4):
            # 使用gensim接口,将文本转为向量化表示
            self.dictionary = corpora.Dictionary(doc_list)
            # 使用BOW模型向量化
            corpus = [self.dictionary.doc2bow(doc) for doc in doc_list]
            # 对每个词,根据tf-idf进行加权,得到加权后的向量表示
            self.tfidf_model = models.TfidfModel(corpus)
            self.corpus_tfidf = self.tfidf_model[corpus]
    
            self.keyword_num = keyword_num
            self.num_topics = num_topics
            # 选择加载的模型
            if model == 'LSI':
                self.model = self.train_lsi()
            else:
                self.model = self.train_lda()
            # 得到数据集的主题-词分布
            word_dic = self.word_dictionary(doc_list)
            self.wordtopic_dic = self.get_wordtopic(word_dic)
    
        def train_lsi(self):
            lsi = models.LsiModel(self.corpus_tfidf, id2word=self.dictionary, num_topics=self.num_topics)
            return lsi
    
        def train_lda(self):
            lda = models.LdaModel(self.corpus_tfidf, id2word=self.dictionary, num_topics=self.num_topics)
            return lda
    
        def get_wordtopic(self, word_dic):
            wordtopic_dic = {}
            for word in word_dic:
                single_list = [word]
                wordcorpus = self.tfidf_model[self.dictionary.doc2bow(single_list)]
                wordtopic = self.model[wordcorpus]
                wordtopic_dic[word] = wordtopic
            return wordtopic_dic
    
        # 词空间构建方法和向量化方法,在没有gensim接口时的一般处理方法
        def word_dictionary(self, doc_list):
            dictionary = []
            for doc in doc_list:
                dictionary.extend(doc)
    
            dictionary = list(set(dictionary))
    
            return dictionary
    
        def doc2bowvec(self, word_list):
            vec_list = [1 if word in word_list else 0 for word in self.dictionary]
            return vec_list
    
        # 计算词的分布和文档的分布的相似度,取相似度最高的keyword_num个词作为关键词
        def get_simword(self, word_list):
            sentcorpus = self.tfidf_model[self.dictionary.doc2bow(word_list)]
            senttopic = self.model[sentcorpus]
    
            # 余弦相似度计算
            def calsim(l1, l2):
                a, b, c = 0.0, 0.0, 0.0
                for t1, t2 in zip(l1, l2):
                    x1 = t1[1]
                    x2 = t2[1]
                    a += x1 * x1
                    b += x1 * x1
                    c += x2 * x2
                sim = a / math.sqrt(b * c) if not (b * c) == 0.0 else 0.0
                return sim
    
            # 计算输入文本和每个词的主题分布相似度
            sim_dic = {}
            for k, v in self.wordtopic_dic.items():
                if k not in word_list:
                    continue
                sim = calsim(v, senttopic)
                sim_dic[k] = sim
    
            for k, v in sorted(sim_dic.items(), key=functools.cmp_to_key(cmp), reverse=True)[:self.keyword_num]:
                print(k + "/ ", end='')
            print()
    
    
    def tfidf_extract(word_list, pos=False, keyword_num=10):
        doc_list = load_data(pos)
        idf_dic, default_idf = train_idf(doc_list)
        tfidf_model = TfIdf(idf_dic, default_idf, word_list, keyword_num)
        tfidf_model.get_tfidf()
    
    
    def textrank_extract(text, pos=False, keyword_num=10):
        textrank = analyse.textrank
        keywords = textrank(text, keyword_num)
        # 输出抽取出的关键词
        for keyword in keywords:
            print(keyword + "/")
    
    
    # print()
    
    def topic_extract(word_list, model, pos=False, keyword_num=10):
        doc_list = load_data(pos)
        topic_model = TopicModel(doc_list, keyword_num, model=model)
        topic_model.get_simword(word_list)
    
    
    if __name__ == '__main__':
        # 获取测试文本
        text1 = 'test.txt'
        text = open(text1, encoding='utf-8').read()
        print(text)
    
        pos = True
        seg_list = seg_to_list(text, pos)
        filter_list = word_filter(seg_list, pos)
    
        print('\nTF-IDF模型结果:')
        tfidf_extract(filter_list)
    
        print('\nTextRank模型结果:')
        textrank_extract(text)
    
        print('\nLSI模型结果:')
        topic_extract(filter_list, 'LSI', pos)
    
        print('\nLDA模型结果:')
        topic_extract(filter_list, 'LDA', pos)
    
    

           结果
    在这里插入图片描述

    13、文字蕴涵

           文字蕴涵(Textual Entailment,TE)
           文字蕴涵在自然语言处理中主要指一个文字片段之间的定向关系。
           ⊚ 正向蕴涵
           文本T:日本时间2011 年3 日11 日,日本宫城县发生里氏震级9.0 震,造成死伤失踪约3 万多人。
           假设H:日本时间2011 年3 日11 日,日本宫城县发生里氏震级9.0 强震。
           ⊚ 矛盾蕴涵
           文本T:张学友在1961 年7 月10 日,生于香港,祖籍天津。
           假设H:张学友生于1960 年。
           ⊚ 独立蕴涵
           文本T:黎姿与“残障富豪”马廷强结婚。
           假设H:马廷强为香港“东方报业集团”创办人之一马惜如之子。

    三、自然语言处理的难点

    1、语言环境复杂

           自然语言处理的语言环境较为复杂,以命名实体识别进行分析,对于同一个汉字某些情况下可以看作实体处理,某些情况则不能看作实体。
           例如,天龙八部中的“竹剑”小姐姐 在有些情况下可能就是指的是竹子做得剑。还有“湖北” 有可能指定是地点 “湖北”,也有可能指定是“湖的北边”。可见字自然语言处理过程中语言环境(根据上下文才能究其表达的意思)的复杂。

    2、文本结构形式多样

           文本内部结构形式多样。还是以自然语言处理中的命名实体识别任务为例子,例如:
           ⊚ 人名,人名由姓和名构成。其中姓氏包括单姓和复姓(如赵、钱、孙、李、慕容、东方、西门等),名由若干个汉字组成。姓氏的用字范围相对有限,比较容易识别。然而名就比较灵活,既可以用名、字、号表示,也可以使用职务名和用典。比如:“李白、李十二、李翰林、李供奉、李拾遗、李太白、青莲居士,谪仙人”都是同一个人。
           ⊚ 地名一般由若干个字组成地名,可以为作为后缀关键字或者别名,都是指代一个地方。比如:“成都、蓉城、锦城、芙蓉城、锦官城、天府之国”,其中“蓉城、锦城、芙蓉城、锦官城、天府之国”为别名。除了全称的名称,还有地理位置代表地名的。比如:“河南、河南省、豫”都是指的一个省份,其中“豫”是简称。
           ⊚ 组织机构名,组织机构命名方式比较复杂,有些是修饰性的命名,有些表示历史典故,有些表示地理方位,有些表示地名,有些表示风俗习惯和关键字等。例如:组织名“广州恒大淘宝足球俱乐部”中,“广州”表示地名的成分,“恒大”“淘宝”表示公司名称成分,“足球”是一项体育赛事成分,“俱乐部”是关键字的成分。比如:“四川大学附属中学”(四川省成都市第十二中学)中包括另一个机构名“四川大学”。机构名还可以以简称形式表示,比如:“四川大学附属中学”简称“川大附中”,“成都信息工程大学”简称“成信大"。

    3、边界识别限制

           在自然语言处理任务中,边界识别最广泛应用于命名识别当中。边界识别可以分解为两大任务:如何去识别实体的边界;如何去判定实体的类别(诸如人名、地名、机构名)。中文命名实体识别要比英文命名实体识别更为复杂,一是受中文自身语言特性的限制,不同于英语文本中词间有空格界定;二是英文中的实体一般首字母大写容易区分,例如:‘Jobs wasadopted at birth in San Francisco,and raised in a hotbed of counterculture’ 中,人名乔布斯Jobs的首字母大写,地名旧金山San Francisco 的首字母也是大写,而中文不具备这样的特征。

    4、词义消岐

    • 词义消歧
             词义消歧是一个自然语言处理和本体论的开放问题。歧义与消歧是自然语言理解中最核心的问题,在词义、句义、篇章含义层次都会出现语言根据上下文语义而产生不同含义的现象。消歧即指根据上下文确定对象语义的过程词义消歧即在词语层次上的语义消歧。语义消歧/词义消歧是自然语言处理任务的一个核心与难点,影响了几乎所有任务的性能,比如搜索引擎、意见挖掘、文本理解与产生、推理等。
    • 词性标注和词义消岐
             词性标注与词义消歧是相互关联的两个问题,在语言使用者身上它们往往同时能得到满足。但是目前的计算机系统一般并不能让二者共用参数并同时输出。语义理解包括分词、词性标注、词义消歧、句法解析、语义解析等。它们并不是前馈的,是相互依赖并存在反馈的。词性标注与语义消歧都要依赖上下文来标注但是词性标注比语义消歧处理起来要更简单,最终结果也往往较好。主要原因是词性标注的标注集合是确定的,而语义消歧并没有,并且量级上词性标注要大得多;词性标注的上下文依赖比语义消歧要短。
      举例说明
             许多字词不单只有一个意思,因而我们必须选出使句意最为通顺的解释。看下面歧义的句子,词义消歧就是要分析出特定上下文的词被赋予的到底是哪个意思。
             (1) 川大学生上网成瘾如患绝症。歧义在于“川大学生”——四川大学的学生;四川的大学生。
             (2) 两代教授,人格不同。歧义:“两代”——两位代理教授;两个时代的教授。
             (3) 被控私分国有资产,专家总经理成了被告人。歧义:“专家总经理”——专家和总经理;有专家身份的总经理。
             (4) 新生市场苦熬淡季。歧义:“新生”——新学生的市场;新产生的市场。
             (5) 朝鲜十年走近国际社会一步。歧义:“十年走近国际社会一步”——每十年就向国际社会走近一步;最近十年间向国际社会走近了一步
             (6) 新汽车牌照。歧义:“新”——新的汽车;新的牌照。
             (7) 咬死了猎人的狗。歧义:——猎人的狗被咬死了;把猎人咬死了的那条狗。
             (8) 菜不热了。歧义:“热”——指菜凉了;指菜不加热了。
             (9) 还欠款四万元。歧义:“还”——读huai;读hai。
             (10) 北京人多。歧义:——北京/人多;北京人/多。

    5、指代消解

    • 定义
             指代消解(Anaphora Resolution)是自然语言处理的重要内容,在信息抽取时就用到了指代消解技术

    • 中文的三种典型指代
             (1) 人称代词:李明怕高妈妈一个人呆在家里寂寞,【他】便将家里的电视搬了过来。
             (2) 指示代词:很多人都想创造一个美好的世界留给孩子,【这】可以理解,但不完全正确。
             (3) 有定描述:贸易制裁似乎成了美国政府在对华关系中惯用的大棒。然而,这【大棒】果真如美国政府所希望的那样灵验吗?

    • 典型指代消解
             ⊚ 显性代词消解
             所谓显性代词消解,就是指在篇章中确定显性代词指向哪个名词短语的问题,代词称为指示语或照应语(Anaphor),其所指向的名词短语一般被称为先行语(Antecedent)。根据二者之间的先后位置,可分为回指(Anaphora)与预指(Cataphora),其中:如果先行语出现在指示语之前,则称为回指,反之则称为预指。
             ⊚ 零代词消解
             所谓零代词消解,是代词消解中针对零指代(Zero Anaphora)现象的一类特殊的消解。
             ⊚ 共指消解
             所谓共指消解,是将篇章中指向同一现实世界客观实体(Entity)的词语划分到同一个等价集的过程,其中被划分的词语称为表述或指称语(Mention),形成的等价集称为共指链(Coreference Chain)。在共指消解中,指称语包含普通名词、专有名词和代词,因此可以将显性代词消解看作共指消解针对代词的子问题。共指消解与显性代词消解不同,它更关注在指称语集合上进行的等价划分,评测方法与显性代词消解也不尽相同,通常使用 MUC、 B-CUBED、CEAF 和 BLANC 等评价方法。
             指代消解的研究方法大致可以分为基于启发式规则的、基于统计的和基于深度学习的方法。目前看来,基于有监督统计机器学习的消解算法仍然是主流算法。

    • 典型例子

           指代消解是解决“谁对谁做了什么”,处理如上所述的自然语言的问题,下面看看例子:
           (1) 美国政府表示仍然支持强势美元,但这到底只是嘴上说说还是要采取果断措施,经济学家对此的看法是否定的。
           (2) 今天老师又在班会上表扬了自己,但是我觉得还需要继续努力。
           (3) 三妹拉着葛姐的手说,她老家在偏远的山区,因为和家里赌气才跑到北京打工的,接着她又哭泣起自己的遭遇来。
           (4) 当他把证书发给小钱时,他对他笑了。
           (5) 小明和肖华去公园玩,他摔了一跤,他急忙把他扶起来。
           (6) 星期天, 小雨和小英到田老师家补习功课,她一早就打电话给她约好在红旗饭店吃早餐。

    四、展望自然语言处理

           关于在2017年第三届中国人工智能大会上来自哈尔滨工业大学的刘挺教授对自然语言处理的一个发展趋势的一个总结归纳。
           归纳链接:http://www.sohu.com/a/163742617_610522

    展开全文
  • 自然语言处理概述

    千次阅读 2019-03-20 14:00:53
    【NLP】十分钟快览自然语言处理学习总结 阅读目录 17 特征工程 20、推荐算法 十分钟学习自然语言处理概述 作者:白宁超 2016年9月23日00:24:12 摘要:近来自然语言处理行业发展朝气蓬勃,市场应用广泛。...

    转载:http://www.cnblogs.com/baiboy/p/learnnlp.html

     

    【NLP】十分钟快览自然语言处理学习总结

    阅读目录

    十分钟学习自然语言处理概述

    作者:白宁超

    2016年9月23日00:24:12

    摘要:近来自然语言处理行业发展朝气蓬勃,市场应用广泛。笔者学习以来写了不少文章,文章深度层次不一,今天因为某种需要,将文章全部看了一遍做个整理,也可以称之为概述。关于这些问题,博客里面都有详细的文章去介绍,本文只是对其各个部分高度概括梳理。本文原创,转载注明出处十分钟学习自然语言处理概述  )

    1 什么是文本挖掘?

    文本挖掘是信息挖掘的一个研究分支,用于基于文本信息的知识发现。文本挖掘的准备工作由文本收集、文本分析和特征修剪三个步骤组成。目前研究和应用最多的几种文本挖掘技术有:文档聚类、文档分类和摘要抽取。

    2 什么是自然语言处理?

    自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究人与计算机之间用自然语言进行有效通信的理论和方法。融语言学、计算机科学、数学等于一体的科学。
    自然语言处理原理:形式化描述-数学模型算法化-程序化-实用化
    语音的自动合成与识别、机器翻译、自然语言理解、人机对话、信息检索、文本分类、自动文摘等。

    3 常用中文分词?

    中文文本词与词之间没有像英文那样有空格分隔,因此很多时候中文文本操作都涉及切词,这里整理了一些中文分词工具。
    StanfordNLP(直接使用CRF 的方法,特征窗口为5。)汉语分词工具(个人推荐)

    哈工大语言云

    庖丁解牛分词

    盘古分词  ICTCLAS(中科院)汉语词法分析系统 

    IKAnalyzer(Luence项目下,基于java的) 

    FudanNLP(复旦大学)

    4 词性标注方法?句法分析方法?

    原理描述:标注一篇文章中的句子,即语句标注,使用标注方法BIO标注。则观察序列X就是一个语料库(此处假设一篇文章,x代表文章中的每一句,X是x的集合),标识序列Y是BIO,即对应X序列的识别,从而可以根据条件概率P(标注|句子),推测出正确的句子标注。  

    显然,这里针对的是序列状态,即CRF是用来标注或划分序列结构数据的概率化结构模型,CRF可以看作无向图模型或者马尔科夫随机场。   用过CRF的都知道,CRF是一个序列标注模型,指的是把一个词序列的每个词打上一个标记。一般通过,在词的左右开一个小窗口,根据窗口里面的词,和待标注词语来实现特征模板的提取。最后通过特征的组合决定需要打的tag是什么。

    5 命名实体识别?三种主流算法,CRF,字典法和混合方法  

    1 CRF:在CRF for Chinese NER这个任务中,提取的特征大多是该词是否为中国人名姓氏用字,该词是否为中国人名名字用字之类的,True or false的特征。所以一个可靠的百家姓的表就十分重要啦~在国内学者做的诸多实验中,效果最好的人名可以F1测度达到90%,最差的机构名达到85%。  

    2 字典法:在NER中就是把每个字都当开头的字放到trie-tree中查一遍,查到了就是NE。中文的trie-tree需要进行哈希,因为中文字符太多了,不像英文就26个。  

    3 对六类不同的命名实体采取不一样的手段进行处理,例如对于人名,进行字级别的条件概率计算。   中文:哈工大(语言云)上海交大    英文:stanfordNER等

    6 基于主动学习的中医文献句法识别研究  

    6.1 语料库知识?       

    语料库作为一个或者多个应用目标而专门收集的,有一定结构的、有代表的、可被计算机程序检索的、具有一定规模的语料的集合。    

    语料库划分:① 时间划分② 加工深度划分:标注语料库和非标注语料库③ 结构划分⑤ 语种划分⑥ 动态更新程度划分:参考语料库和监控语料库    

    语料库构建原则:①   代表性②   结构性③   平衡性④   规模性⑤   元数据:元数据对       

    语料标注的优缺点

    ①   优点: 研究方便。可重用、功能多样性、分析清晰。

    ②   缺点: 语料不客观(手工标注准确率高而一致性差,自动或者半自动标注一致性高而准确率差)、标注不一致、准确率低

    6.2 条件随机场解决标注问题?      

    条件随机场用于序列标注,中文分词、中文人名识别和歧义消解等自然语言处理中,表现出很好的效果。原理是:对给定的观察序列和标注序列,建立条件概率模型。条件随机场可用于不同预测问题,其学习方法通常是极大似然估计。      

    我爱中国,进行序列标注案例讲解条件随机场。(规则模型和统计模型问题)   

    条件随机场模型也需要解决三个基本问题:特征的选择(表示第i个观察值为“爱”时,相对yi,yi-1的标记分别是B,I),参数训练和解码。     

    6.3 隐马尔可夫模型      

    应用:词类标注、语音识别、局部句法剖析、语块分析、命名实体识别、信息抽取等。应用于自然科学、工程技术、生物科技、公用事业、信道编码等多个领域。   

    马尔可夫链:在随机过程中,每个语言符号的出现概率不相互独立,每个随机试验的当前状态依赖于此前状态,这种链就是马尔可夫链。   

    多元马尔科夫链:考虑前一个语言符号对后一个语言符号出现概率的影响,这样得出的语言成分的链叫做一重马尔可夫链,也是二元语法。二重马尔可夫链,也是三元语法,三重马尔可夫链,也是四元语法      

    隐马尔可夫模型思想的三个问题 

    问题1(似然度问题):给一个HMM λ=(A,B) 和一个观察序列O,确定观察序列的似然度问题 P(O|λ) 。(向前算法解决)          

    问题2(解码问题):给定一个观察序列O和一个HMM λ=(A,B),找出最好的隐藏状态序列Q。(维特比算法解决)          

    问题3(学习问题):给定一个观察序列O和一个HMM中的状态集合,自动学习HMM的参数A和B。(向前向后算法解决)

    6.4 Viterbi算法解码      

    思路:

    1 计算时间步1的维特比概率

    2 计算时间步2的维特比概率,在(1) 基础计算

    3 计算时间步3的维特比概率,在(2) 基础计算

    4 维特比反向追踪路径         

    维特比算法与向前算法的区别:     

    (1)维特比算法要在前面路径的概率中选择最大值,而向前算法则计算其总和,除此之外,维特比算法和向前算法一样。     

    (2)维特比算法有反向指针,寻找隐藏状态路径,而向前算法没有反向指针。      

    HMM和维特比算法解决随机词类标注问题,利用Viterbi算法的中文句法标注  

    6.5 序列标注方法       参照上面词性标注    

    6.6 模型评价方法      

    模型:方法=模型+策略+算法   

    模型问题涉及:训练误差、测试误差、过拟合等问题。通常将学习方法对未知数据的预测能力称为泛化能力。

    模型评价参数:      

    准确率P=识别正确的数量/全部识别出的数量   

    错误率 =识别错误的数量/全部识别出的数量   

    精度=识别正确正的数量/识别正确的数量      

    召回率R=识别正确的数量/全部正确的总量(识别出+识别不出的)   

    F度量=2PR/(P+R)      

    数据正负均衡适合准确率    数据不均适合召回率,精度,F度量   

    几种模型评估的方法:

    K-折交叉验证、随机二次抽样评估等    ROC曲线评价两个模型好坏  

    7 基于文本处理技术的研究生英语等级考试词汇表构建系统  

    完成对2002--2010年17套GET真题的核心单词抽取。其中包括数据清洗,停用词处理,分词,词频统计,排序等常用方法。真题算是结构化数据,有一定规则,比较容易处理。此过程其实就是数据清洗过程)最后把所有单词集中汇总,再去除如:a/an/of/on/frist等停用词(中文文本处理也需要对停用词处理,诸如:的,地,是等)。处理好的单词进行去重和词频统计,最后再利用网络工具对英语翻译。然后根据词频排序。    

    7.1 Apache Tika?      

    Apache Tika内容抽取工具,其强大之处在于可以处理各种文件,另外节约您更多的时间用来做重要的事情。   

    Tika是一个内容分析工具,自带全面的parser工具类,能解析基本所有常见格式的文件   

    Tika的功能:•文档类型检测   •内容提取  •元数据提取  •语言检测

    7.2 文本词频统计?词频排序方法?      

    算法思想:

    1 历年(2002—2010年)GET考试真题,文档格式不一。网上收集                

    2 对所有格式不一的文档进行统计处理成txt文档,格式化(去除汉字/标点/空格等非英文单词)和去除停用词(去除891个停用词)处理。                

    3 对清洗后的单词进行去重和词频统计,通过Map统计词频,实体存储:单词-词频。(数组也可以,只是面对特别大的数据,数组存在越界问题)。排序:根据词频或者字母

    4 提取核心词汇,大于5的和小于25次的数据,可以自己制定阈值。遍历list<实体>列表时候,通过获取实体的词频属性控制选取词汇表尺寸。                

    5 最后一步,中英文翻译。     

    8 朴素贝叶斯模型的文本分类器的设计与实现  

    8.1 朴素贝叶斯公式  

    0:喜悦  1:愤怒 2:厌恶 3:低落  

    8.2 朴素贝叶斯原理  

    -->训练文本预处理,构造分类器。(即对贝叶斯公式实现文本分类参数值的求解,暂时不理解没关系,下文详解)  

    -->构造预测分类函数  

    -->对测试数据预处理  

    -->使用分类器分类    

    对于一个新的训练文档d,究竟属于如上四个类别的哪个类别?我们可以根据贝叶斯公式,只是此刻变化成具体的对象。    

    > P( Category | Document):测试文档属于某类的概率    

    > P( Category)):从文档空间中随机抽取一个文档d,它属于类别c的概率。(某类文档数目/总文档数目)    

    > (P ( Document | Category ):文档d对于给定类c的概率(某类下文档中单词数/某类中总的单词数)    

    > P(Document):从文档空间中随机抽取一个文档d的概率(对于每个类别都一样,可以忽略不计算。此时为求最大似然概率)    

    >  C(d)=argmax {P(C_i)*P(d|c_i)}:求出近似的贝叶斯每个类别的概率,比较获取最大的概率,此时文档归为最大概率的一类,分类成功。  

    综述

    1.  事先收集处理数据集(涉及网络爬虫和中文切词,特征选取)      

    2.  预处理:(去掉停用词,移除频数过小的词汇【根据具体情况】)      

    3.  实验过程:

    数据集分两部分(3:7):30%作为测试集,70%作为训练集         

    增加置信度:10-折交叉验证(整个数据集分为10等份,9份合并为训练集,余下1份作为测试集。一共运行10遍,取平均值作为分类结果)优缺点对比分析      

    4. 评价标准:          

    宏评价&微评价          

    平滑因子

    8.3 生产模型与判别模型区别       

    1)生产式模型:直接对联合分布进行建模,如:隐马尔科夫模型、马尔科夫随机场等       

    2)判别式模型:对条件分布进行建模,如:条件随机场、支持向量机、逻辑回归等。          

    生成模型优点:1)由联合分布2)收敛速度比较快。3)能够应付隐变量。 缺点:为了估算准确,样本量和计算量大,样本数目较多时候不建议使用。          

    判别模型优点:1)计算和样本数量少。2)准确率高。缺点:收敛慢,不能针对隐变量。  

    8.4 

    ROC曲线      

    ROC曲线又叫接受者操作特征曲线,比较学习器模型好坏可视化工具,横坐标参数假正例率,纵坐标参数是真正例率。曲线越靠近对角线(随机猜测线)模型越不好。      

    好的模型,真正比例比较多,曲线应是陡峭的从0开始上升,后来遇到真正比例越来越少,假正比例元组越来越多,曲线平缓变的更加水平。完全正确的模型面积为1

    9 统计学知识

    信息图形化(饼图,线形图等)

    集中趋势度量(平均值 中位数 众数 方差等)

    概率

    排列组合

    分布(几何二项泊松正态卡方)

    统计抽样

    样本估计

    假设检验

    回归

    10 stanfordNLP

    句子理解、自动问答系统、机器翻译、句法分析、标注、情感分析、文本和视觉场景和模型, 以及自然语言处理数字人文社会科学中的应用和计算。

    11 APache OpenNLP

    Apache的OpenNLP库是自然语言文本的处理基于机器学习的工具包。它支持最常见的NLP任务,如断词,句子切分,部分词性标注,命名实体提取,分块,解析和指代消解。

    句子探测器:句子检测器是用于检测句子边界

    标记生成器:该OpenNLP断词段输入字符序列为标记。常是这是由空格分隔的单词,但也有例外。

    名称搜索:名称查找器可检测文本命名实体和数字。

    POS标注器:该OpenNLP POS标注器使用的概率模型来预测正确的POS标记出了标签组。

    细节化:文本分块由除以单词句法相关部分,如名词基,动词基的文字,但没有指定其内部结构,也没有其在主句作用。

    分析器:尝试解析器最简单的方法是在命令行工具。该工具仅用于演示和测试。请从我们网站上的英文分块

    12 Lucene

    Lucene是一个基于Java的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta(雅加达) 家族中的一个 开源项目。也是目前最为流行的基于Java开源全文检索工具包。

    目前已经有很多应用程序的搜索功能是基于 Lucene ,比如Eclipse 帮助系统的搜索功能。Lucene能够为文本类型的数 据建立索引,所以你只要把你要索引的数据格式转化的文本格式,Lucene 就能对你的文档进行索引和搜索。

    13 Apache Solr

    Solr它是一种开放源码的、基于 Lucene Java 的搜索服务器。Solr 提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式。它易于安装和配置, 而且附带了一个基于HTTP 的管理界面。可以使用 Solr 的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。

    Solr的特性包括:

    •高级的全文搜索功能

    •专为高通量的网络流量进行的优化

    •基于开放接口(XML和HTTP)的标准

    •综合的HTML管理界面

    •可伸缩性-能够有效地复制到另外一个Solr搜索服务器

    •使用XML配置达到灵活性和适配性

    •可扩展的插件体系 solr中文分词

    14 机器学习降维

    主要特征选取、随机森林、主成分分析、线性降维

    15 领域本体构建方法   

    1 确定领域本体的专业领域和范畴

    2 考虑复用现有的本体

    3 列出本体涉及领域中的重要术语

    4 定义分类概念和概念分类层次

    5 定义概念之间的关系

    16 构建领域本体的知识工程方法:

    主要特点:本体更强调共享、重用,可以为不同系统提供一种统一的语言,因此本体构建的工程性更为明显。

    方法:目前为止,本体工程中比较有名的几种方法包括TOVE 法、Methontology方法、骨架法、IDEF-5法和七步法等。(大多是手工构建领域本体)

    现状: 由于本体工程到目前为止仍处于相对不成熟的阶段,领域本体的建设还处于探索期,因此构建过程中还存在着很多问题。

    方法成熟度: 以上常用方法的依次为:七步法、Methontology方法、IDEF-5法、TOVE法、骨架法。

    17 特征工程


     

    1 特征工程是什么?

    数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。特征工程本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。通过总结和归纳,人们认为特征工程包括以下方面:

    特征处理是特征工程的核心部分,特征处理方法包括数据预处理,特征选择,降维等。

    2 特征提取:特征提取是指将机器学习算法不能识别的原始数据转化为算法可以识别的特征的过程。

    实例解析:文本是由一系列文字组成的,这些文字在经过分词后会形成一个词语集合,对于这些词语集合(原始数据),机器学习算法是不能直接使用的,我们需要将它们转化成机器学习算法可以识别的数值特征(固定长度的向量表示),然后再交给机器学习的算法进行操作。再比如说,图片是由一系列像素点构(原始数据)成的,这些像素点本身无法被机器学习算法直接使用,但是如果将这些像素点转化成矩阵的形式(数值特征),那么机器学习算法就可以使用了。特征提取实际上是把原始数据转化为机器学习算法可以识别的数值特征的过程,不存在降维的概念,特征提取不需要理会这些特征是否是有用的;而特征选择是在提取出来的特征中选择最优的一个特征子集。

    文本分类特征提取步骤:

    假设一个语料库里包含了很多文章,在对每篇文章作了分词之后,可以把每篇文章看作词语的集合。然后将每篇文章作为数据来训练分类模型,但是这些原始数据是一些词语并且每篇文章词语个数不一样,无法直接被机器学习算法所使用,机器学习算法需要的是定长的数值化的特征。因此,我们要做的就是把这些原始数据数值化,这就对应了特征提取。如何做呢?

    1. 对训练数据集的每篇文章,我们进行词语的统计,以形成一个词典向量。词典向量里包含了训练数据里的所有词语(假设停用词已去除),且每个词语代表词典向量中的一个元素。
    2. 在经过第一步的处理后,每篇文章都可以用词典向量来表示。这样一来,每篇文章都可以被看作是元素相同且长度相同的向量,不同的文章具有不同的向量值。这也就是表示文本的词袋模型(bag of words)。
    3. 针对于特定的文章,如何给表示它的向量的每一个元素赋值呢?最简单直接的办法就是0-1法了。简单来说,对于每一篇文章,我们扫描它的词语集合,如果某一个词语出现在了词典中,那么该词语在词典向量中对应的元素置为1,否则为0。

    在经过上面三步之后,特征提取就完成了。对于每一篇文章,其中必然包含了大量无关的特征,而如何去除这些无关的特征,就是特征选择要做的事情了。

    3 数据预处理:未经处理的特征,这时的特征可能有以下问题:(标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布)

    • 特征的规格不一样。无量纲化可以解决。
    • 信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。
    • 定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。
    • 存在缺失值:缺失值需要补充。
    • 信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的。

    使用sklearn中的preproccessing库来进行数据预处理,可以覆盖以上问题的解决方案。

    4 特征选择:当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。特征选择是指去掉无关特征,保留相关特征的过程,也可以认为是从所有的特征中选择一个最好的特征子集。特征选择本质上可以认为是降维的过程。

    1)Filter(过滤法):按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。如:方差选择法、相关系数法、卡方检验法、互信息法

    方差选择法:使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。
    相关系数法:使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。
    卡方检验法:经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量。
    互信息法:   经典的互信息也是评价定性自变量对定性因变量的相关性的。

    2)Wrapper(包装法):根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。如:递归特征消除法

    递归特征消除法:递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。

    3)Embedded(嵌入法):先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

    基于惩罚项的特征选择法:使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型。如:基于惩罚项的特征选择法、基于树模型的特征选择法

    基于树模型的特征选择法:树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型。

    4)深度学习方法:从深度学习模型中选择某一神经层的特征后就可以用来进行最终目标模型的训练了。

    5 降维:当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法:L1惩罚项的模型、主成分分析法(PCA)、线性判别分析(LDA)。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。
    1)主成分分析法(PCA):使用decomposition库的PCA类选择特征。
    2)线性判别分析法(LDA):使用lda库的LDA类选择特征。

    18 模型评估之交叉验证

    k折交叉验证(k-fold cross-validation)用一部分数据来训练模型,然后用另一部分数据来测试模型的泛化误差。该算法的具体步骤如下:

    1. 随机将训练样本等分成k份。
    2. 对于每一份验证数据Sj,算法在S1, …, SJ-1, SJ+1, …, Sk上进行特征选择,并且构造文本分类器。把得到的文本分类器在验证集Sj上求泛化误差。
    3. 把k个泛化误差求平均,得到最后的泛化误差。

    19 EM算法

    EM算法:当模型里含有隐变量的时候,直接求解参数的极大似然估计就会失效。这时就需要用到来对参数进行迭代求解。EM算法说白了也是求含有隐变量的参数的极大似然估计。常用于混合模型(高斯混合模型,伯努利混合模型),训练推理主题模型(topic model)时的pSLA等等。

    EM算法步骤:给定可观测变量的集合为X,隐藏变量的集合为Z,模型参数用W的联合概率分布,即,p(X,Z|W),目标是要最大化似然函数p(X|W),也就是要求出W使得p(X|W)最大。

    1. 选择参数W的初始值,Wold即隐变量Z的后验概率,即p(Z|X,Wold)
    2. E步:利用初始值Wold计算隐变量Z的后验概率分布,p(Z|X,Wold),进而找出logp(X,Z|W)在Z的后验概率下的期望Q(W,Wold)。
    3. M步:极大化Q(W,Wold),以求出W。
    4. 检查收敛条件,如果满足收敛条件则停止;否则,令Wold= Wnew,然后跳转到第2步,继续迭代执行。

    20、推荐算法

    推荐算法通常是在推荐模型中实现的,而推荐模型会负责收集诸如用户偏好、物品描述这些可用作推荐凭借的数据,据此预测特定用户组可能感兴趣的物品。

    1、基于协同过滤算法:
    原理:用户行为中寻找特定模式,创建用户专属的推荐内容。
    例子:你的朋友喜欢电影哈利波特I,那么就会推荐给你,这是最简单的基于用户的协同过滤算法,还有一种是基于Item的协同过滤算法,这种方法训练过程比较长,但是训练完成后,推荐过程比较快。
    输入内容:只取决于使用数据(评价、购买、下载、用户偏好)
    类型:基于相似类型的协同
    过滤(比如基于兴趣类似的用户或者基于类似的物品) 基于模型的协同过滤
    <-----基于用户的协同过滤案例--->
    假设我们有一些用户已经表达了他们对某些书籍的偏好,他们越喜欢某本书,对这本书的评分也越高(评分范围是1分到5分)。我们可以在一个矩阵中重现他们的这种偏好,用行代表用户,用列代表书籍。
    在基于用户的协同过滤算法中,我们要做的第一件事就是根据用户对书籍的偏好,计算出他们彼此间的相似度。我们从某个单独用户的角度来看一下这个问题,以图一中第一行的用户为例。通常我们会将每个用户都作为向量(或者数组),其中包含了用户对物品的偏好 
    。通过多种类似的指标对用户进行对比是相当直接的。在本例中,我们会使用余弦相似点。我们将第一位用户与其他五位相对比,可以发现第一位与其他用户的相似度有多少(第一位用户与其他用户的相似性。可以在一个单独的维度中绘制用户间的余弦相似性。)。就 
    像大多相似度指标一样,向量之间的相似度越高,彼此也就越相似。在本例中,第一位用户与其中两位有两本相同的书籍,相似度较高;与另两位只有一本相同书籍,相似度较低;与最后一位没有相同书籍,相似度为零。
    更常见的情况下,我们可以计算出每名用户与所有用户的相似程度,并在相似性矩阵中表现出来(用户间的相似矩阵,每个用户的相似度是基于用户阅读书籍间的相似性。)。这是一个对称矩阵,也就是说其中一些有用的属性是可以执行数学函数运算的。单元格的背景 
    色表明了用户彼此间的相似程度,红色越深则相似度越高。
    现在,我们准备使用基于用户的协同过滤来生成给用户的推荐。对于特定的用户来说,这代表着找出与其相似性最高的用户,并根据这些类似用户喜爱的物品进行推荐,具体要参照用户相似程度来加权。我们先以第一个用户为例,为其生成一些推荐。首先我们找到与这 
    名用户相似程度最高的n名用户,删除这名用户已经喜欢过的书籍,再对最相似用户阅读过的书籍进行加权,之后将所有结果加在一起。在本例中,我们假设n=2,也就是说取两名与第一位用户最相似的用户,以生成推荐结果,这两名用户分别是用户2及用户3(图四)。 
    由于第一名用户已经对书籍1和书籍5做出了评分,推荐结果生成书籍3(分数4.5)及书籍4(分数3)。
    基于用户的CF:
    1、分析各个用户对item的评价(通过浏览记录、购买记录等); 
    2、依据用户对item的评价计算得出所有用户之间的相似度; 
    3、选出与当前用户最相似的N个用户; 
    4、将这N个用户评价最高并且当前用户又没有浏览过的item推荐给当前用户。 
    最后,我们要为用户1推荐物品,则找出与用户1相似度最高的N名用户(设N=2)评价的物品,去掉用户1评价过的物品,则是推荐结果。

    <-------基于物品的协同过滤的案例------>
    我们还是用同一组用户(图一)为例。在基于物品的协同过滤中,与基于用户的协同过滤类似,我们要做的第一件事就是计算相似度矩阵。但这一回,我们想要针对物品而非用户来看看它们之间的相似性。与之前类似,我们以书籍作为喜爱者的向量(或数组),将其与 
    余弦相似度函数相对比,从而揭示出某本书籍与其他书籍之间的相似程度。由于同一组用户给出的评分大致类似,位于列1的第一本书与位于列5的第五本书相似度是最高的(图五)。其次是相似度排名第三的书籍,有两位相同的用户喜爱;排名第四和第二的书籍只有一 
    位共同读者;而排名最后的书籍由于没有共同读者,相似度为零。
    我们还可以在相似矩阵中展示出所有书籍彼此间的相似程度(图六)。同样以背景颜色区分了两本书彼此间的相似程度,红色越深相似程度也越高。
    现在我们知道每本书彼此间的相似程度了,可以为用户生成推荐结果。在基于物品的协同过滤中,我们根据用户此前曾评过分的物品,推荐与其最为相似的物品。在案例中,第一位用户获得的推荐结果为第三本书籍,然后是第六本(图七)。同样地,我们只取与用户之 
    前评论过的书籍最相似的两本书。
    根据上述描述,基于用户与基于物品的协同过滤似乎非常类似,因此能得出不同的结果这一点确实很有意思。即便在上例中,这两种方式都能为同一名用户得出不同的推荐结果,尽管两者的输入内容是相同的。在构建推荐时,这两种形式的协同过滤方式都是值得考虑的 
    。尽管在向外行描述时,这两种方法看起来非常类似,但实际上它们能得出非常不同的推荐结果,从而为用户带来完全不同的体验。
    根据上述核心思想,可以有如下算法步骤:
    建立用户-物品的倒排表
    物品与物品之间的共现矩阵 C[i][j],表示物品 i 与 j 共同被多少用户所喜欢。
    用户与用户之间的相似度矩阵 W[i][j] , 根据余弦相似度计算公式计算。
    用上面的相似度矩阵来给用户推荐与他所喜欢的物品相似的其他物品。用户 u 对物品 j 的兴趣程度可以估计为


    UserCF 和 ItemCF 的区别和应用
    UserCF 算法的特点是:

    用户较少的场合,否则用户相似度矩阵计算代价很大
    适合时效性较强,用户个性化兴趣不太明显的领域
    对新用户不友好,对新物品友好,因为用户相似度矩阵不能实时计算
    很难提供令用户信服的推荐解释
    对应地,ItemCF 算法的特点:

    适用于物品数明显小于用户数的场合,否则物品相似度矩阵计算代价很大
    适合长尾物品丰富,用户个性化需求强的领域
    对新用户友好,对新物品不友好,因为物品相似度矩阵不需要很强的实时性(cosα=(A*B)/(||A||*||B||))
    利用用户历史行为做推荐解释,比较令用户信服
    因此,可以看出 UserCF 适用于物品增长很快,实时性较高的场合,比如新闻推荐。而在图书、电子商务和电影领域,比如京东、天猫、优酷中,ItemCF 则能极大地发挥优势。在这些网站中,用户的兴趣是比较固定和持久的,而且这些网站的物品更新速度不会特别快, 
    一天一更新是在忍受范围内的。


    模型评价指标:准确率、召回率、覆盖率、新颖性、惊喜度、实时性

    2、基于内容过滤的推荐算法
    原理:用户喜欢和自己关注过的Item在内容上类似的Item。
    例子:你看了哈利波特I,基于内容的推荐算法发现哈利波特II-VI,与你以前观看的在内容上面(共有很多关键词)有很大关联性,就把后者推荐给你,这种方法可以避免Item的冷启动问题(冷启动:如果一个Item从没有被关注过,其他推荐算法则很少会去推荐,但是 
    基于内容的推荐算法可以分析Item之间的关系,实现推荐),
    缺点:①推荐的Item可能会重复,典型的就是新闻推荐,如果你看了一则关于MH370的新闻,很可能推荐的新闻和你浏览过的,内容一致;②对于一些多媒体的推荐(比如音乐、电影、图片等)由于很难提内容特征,则很难进行推荐,一种解决方式则是人工给这些Item打 
    标签。
    输入内容:取决于物品及用户的内容/描述

    3、混合型推荐算法
    原理:结合协同过滤和基于内容两种方式,以利用某个算法优点解决另一个的缺点
    输入内容:通过用户/物品内容特征及使用数据以借助两类数据的优势

    4、流行度推荐算法
    原理:根据流行度来推荐物品的算法(比如下载、观看、影响度较高的)
    输入内容:通过使用数据与物品内容(比如分类)

     

     

     数据挖掘十大算法详解

    数据挖掘150道题目

    数据挖掘基础知识

     

     

     

     

    作者:白宁超,工学硕士,现工作于四川省计算机研究院,研究方向是自然语言处理和机器学习。曾参与国家自然基金项目和四川省科技支撑计划等多个省级项目。著有《自然语言处理理论与实战》一书。 自然语言处理与机器学习技术交流群号:436303759 。 出处:http://www.cnblogs.com/baiboy/ 

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    分类: NLP

    展开全文
  • 自然语言处理入门新手上路

    千次阅读 多人点赞 2019-10-29 17:40:42
    自然语言处理 (Natural Language Processing,NLP)是一门融合了计算机科学、人工智能以及语言学的交叉学科,它们的关系如图 1-1 所示。这门学科研究的是如何通过机器学习等技术,让计算机学会处理人类语言,乃至...

    自然语言处理 (Natural Language Processing,NLP)是一门融合了计算机科学、人工智能以及语言学的交叉学科,它们的关系如图 1-1 所示。这门学科研究的是如何通过机器学习等技术,让计算机学会处理人类语言,乃至实现终极目标——理解人类语言或人工智能①。

    图像说明文字

    事实上,自然语言处理这个术语并没有被广泛接受的定义②。注重语言学结构的学者喜欢使用 计算语言学 (Computational Linguistics,CL)这个表达,而强调最终目的的学者则更偏好 自然语言理解 (Natural Language Understanding,NLU)这个术语。由于 NLP 听上去含有更多工程意味,所以本书将一直使用该术语,而不去细究它们的异同。

    如同其本身的复杂性一样,自然语言处理一直是一个艰深的课题。虽然语言只是人工智能的一部分(人工智能还包括计算机视觉等),但它非常独特。这个星球上有许多生物拥有超过人类的视觉系统,但只有人类才拥有这么高级的语言。自然语言处理的目标是让计算机处理或 “理解”自然语言,以完成有意义的任务,比如订机票、购物或同声传译等。完全理解和表达语言是极其困难的,完美的语言理解等价于实现人工智能。

    在这一章中,我们将围绕自然语言处理的缩略图,了解一些基本概念。

    ① 著名的图灵测试就是根据机器是否能像人类一样理解语言来判断它是否具备人工智能。
    ② Smith N. A. Linguistic structure prediction[J]. Synthesis lectures on human language technologies, 2011, 4(2): 1-274.

    1.1 自然语言与编程语言

    作为我们将要处理的对象,自然语言具备高度灵活的特点。我们太熟悉自己的语言,就像水对鱼来讲是透明的一样,我们很难体会到语言的复杂程度。不如拿自然语言与人工语言做一番比较,看看计算机理解我们的语言是多么困难。

    1.1.1 词汇量

    自然语言中的词汇比编程语言中的关键词丰富。在我们熟悉的编程语言中,能使用的关键词数量是有限且确定的。比如,C 语言一共有 32 个关键字,Java 语言则有 50 个。虽然我们可以自由地取变量名、函数名和类名,但这些名称在编译器看来只是区别符号,不含语义信息,也不影响程序的运行结果。但在自然语言中,我们可以使用的词汇量是无穷无尽的,几乎没有意义完全相同的词语。以汉语为例,由国家语言文字工作委员会发布的《现代汉语常用词表(草案)》一共收录了 56 008 个词条。除此之外,我们还可以随时创造各种类型的新词,而不仅限于名词。

    1.1.2 结构化

    自然语言是非结构化的,而编程语言是结构化的。所谓结构化,指的是信息具有明确的结构关系,比如编程语言中的类与成员、数据库中的表与字段,都可以通过明确的机制来读写。举个例子,我们来看看两种语言对同一事实的表述,一些面向对象的编程语言可以如此书写:

    class Company(object):
        def __init__(self, founder, logo) -> None:
            self.founder = founder 
            self.logo = logo
    

    apple = Company(founder=‘乔布斯’, logo=‘apple’)

    于是,程序员可以通过 apple.founder和 apple.logo来获取苹果公司的创始人和标志。像这样,程序语言通过 class Company这个结构为信息提供了层次化的模板,而在自然语言中则不存在这样的显式结构。人类语言是线性的字符串,给定一句话“苹果的创始人是乔布斯,它的 logo 是苹果”,计算机需要分析出如下结论:

    ●这句汉语转换为单词序列后,应该是“苹果 的 创始人 是 乔布斯 , 它 的 logo 是 苹果”;

    ●第一个“苹果”指的是苹果公司,而第二个“苹果”指的是带缺口的苹果 logo ;

    ● “乔布斯”是一个人名;

    ● “它”指代的是苹果公司;

    ●苹果公司与乔布斯之间的关系是“的创始人是”,与带缺口的苹果 logo 之间的关系为“的logo 是”。

    这些结论的得出分别涉及中文分词、命名实体识别、指代消解和关系抽取等自然语言处理任务。这些任务目前的准确率都达不到人类水平。可见,人类觉得很简单的一句话,要让计算机理解起来并不简单。

    1.1.3 歧义性

    自然语言含有大量歧义,这些歧义根据语境的不同而表现为特定的义项。比如汉语中的多义词,只有在特定的上下文中才能确定其含义,甚至存在故意利用无法确定的歧义营造幽默效果的用法。除了上文“苹果”的两种意思之外,“意思”这个词也有多种意义。比如,下面这则经典的笑话。

    他说:“她这个人真有意思(funny)。”她说:“他这个人怪有意思的(funny)。”于是人们以为他们有了意思(wish),并让他向她意思意思(express)。他火了:“我根本没有那个意思(thought)!”她也生气了:“你们这么说是什么意思(intention)?”事后有人说:“真有意思(funny)。”也有人说:“真没意思(nonsense)。”(原文见《生活报》1994.11.13. 第六版)[吴尉天,1999]①

    这个例子中特地用英文注解“意思”的不同义项,从侧面体现了处理中文比处理英文更难。

    但在编程语言中,则不存在歧义性②。如果程序员无意中写了有歧义的代码,比如两个函数的签名一样,则会触发编译错误。

    1.1.4 容错性

    书刊中的语言即使经过编辑的多次校对,也仍然无法完全避免错误。而互联网上的文本则更加随性,错别字或病句、不规范的标点符号等随处可见。不过,哪怕一句话错得再离谱,人们还是可以猜出它想表达的意思。而在编程语言中,程序员必须保证拼写绝对正确、语法绝对规范,否则要么得到编译器无情的警告,要么造成潜在的 bug。

    事实上,区别于规范的新闻领域,如何处理不规范的社交媒体文本也成为了一个新的课题。

    ① 摘自宗成庆《统计自然语言处理》。
    ② 编程语言被特意设计为无歧义的确定上下文无关文法,并且能在 O(n) 时间内分析完毕,其中 n 为文本长度。

    1.1.5 易变性

    任何语言都是不断发展变化的,不同的是,编程语言的变化要缓慢温和得多,而自然语言则相对迅速嘈杂一些。

    编程语言由某个个人或组织发明并且负责维护。以 C++ 为例,它的发明者是 Bjarne Stroustrup,它现在由 C++ 标准委员会维护。从 C++ 98 到 C++ 03,再到 C++ 11 和 C++ 14,语言标准的变化是以年为单位的迁越过程,且新版本大致做到了对旧版本的前向兼容,只有少数废弃掉的特性。

    而自然语言不是由某个个人或组织发明或制定标准的。或者说,任何一门自然语言都是由全人类共同约定俗成的。虽然存在普通话、简体字等规范,但我们每个人都可以自由创造和传播新词汇和新用法,也在不停地赋予旧词汇以新含义,导致古代汉语和现代汉语相差巨大。此外,汉语不断吸收英语和日语等外语中的词汇,并且也在输出 niubility 等中式英语。这些变化是连续的,每时每刻都在进行,给自然语言处理带来了不小的挑战。这也是自然语言明明是人类发明的,却还要称作“自然”的原因。

    1.1.6 简略性

    由于说话速度和听话速度、书写速度和阅读速度的限制,人类语言往往简洁、干练。我们经常省略大量背景知识或常识,比如我们会对朋友说“老地方见”,而不必指出“老地方”在哪里。对于机构名称,我们经常使用简称,比如“工行”“地税局”,假定对方熟悉该简称。如果上文提出一个对象作为话题,则下文经常使用代词。在连续的新闻报道或者一本书的某一页中,并不需要重复前面的事实,而假定读者已经熟知。这些省略掉的常识,是交流双方共有而计算机不一定拥有的,这也给自然语言处理带来了障碍。

    1.2 自然语言处理的层次

    按照处理对象的颗粒度,自然语言处理大致可以分为图 1-2 所示的几个层次。

    图像说明文字

    本节逐一介绍这些自然语言处理任务的定义,为读者提供一个概览。

    1.2.1 语音、图像和文本

    自然语言处理系统的输入源一共有 3 个,即语音、图像与文本。其中,语音和图像虽然正引起越来越大的关注,但受制于存储容量和传输速度,它们的信息总量还是没有文本多。另外,这两种形式一般经过识别后转化为文本,再进行接下来的处理,分别称为语音识别(Speech Recognition)和光学字符识别(Optical Character Recognition)。一旦转化为文本,就可以进行后续的 NLP 任务。所以,文本处理是重中之重。

    1.2.2 中文分词、词性标注和命名实体识别

    这 3 个任务都是围绕词语进行的分析,所以统称词法分析。词法分析的主要任务是将文本分隔为有意义的词语(中文分词),确定每个词语的类别和浅层的歧义消除(词性标注),并且识别出一些较长的专有名词(命名实体识别)。对中文而言,词法分析常常是后续高级任务的基础。在流水线式① 的系统中,如果词法分析出错,则会波及后续任务。所幸的是,中文词法分析已经比较成熟,基本达到了工业使用的水准。

    ① 指的是前一个系统的输出是后一个系统的输入,并且前一个系统不依赖于后续系统。

    作为一个初级且资源丰富的任务,词法分析将在本书后续章节中详细阐述。另外,由于这是读者接触的第一个 NLP 任务,它将引出许多有趣的模型、算法和思想。因此,词法分析不仅是自然语言处理的基础任务,它所属的章节也会成为读者知识体系的基础。

    1.2.3 信息抽取

    词法分析之后,文本已经呈现出部分结构化的趋势。至少,计算机看到的不再是一个超长的字符串,而是有意义的单词列表,并且每个单词还附有自己的词性以及其他标签。

    根据这些单词与标签,我们可以抽取出一部分有用的信息,从简单的高频词到高级算法提取出的关键词,从公司名称到专业术语,其中词语级别的信息已经可以抽取不少。我们还可以根据词语之间的统计学信息抽取出关键短语乃至句子,更大颗粒度的文本对用户更加友好。

    值得一提的是,一些信息抽取算法用到的统计量可以复用到其他任务中,会在相应章节中详细介绍。  

    1.2.4 文本分类与文本聚类

    将文本拆分为一系列词语之后,我们还可以在文章级别做一系列分析。

    有时我们想知道一段话是褒义还是贬义的,判断一封邮件是否是垃圾邮件,想把许多文档分门别类地整理一下,此时的 NLP 任务称作文本分类。

    另一些时候,我们只想把相似的文本归档到一起,或者排除重复的文档,而不关心具体类别,此时进行的任务称作文本聚类。

    这两类任务看上去挺相似,实际上分属两种截然不同的算法流派,我们会在单独的章节中分别讲解。

    1.2.5 句法分析

    词法分析只能得到零散的词汇信息,计算机不知道词语之间的关系。在一些问答系统中,需要得到句子的主谓宾结构。比如“查询刘医生主治的内科病人”这句话,用户真正想要查询的不是“刘医生”,也不是“内科”,而是“病人”。虽然这三个词语都是名词,甚至“刘医生” 离表示意图的动词“查询”最近,但只有“病人”才是“查询”的宾语。通过句法分析,可以得到如图 1-3 所示的语法信息。

    图像说明文字

    我们发现图 1-3 中果然有根长长的箭头将“查询”与“病人”联系起来,并且注明了它们之间的动宾关系。后续章节会详细介绍上面这种树形结构,以及句法分析器的实现方法。

    不仅是问答系统或搜索引擎,句法分析还经常应用于基于短语的机器翻译,给译文的词语重新排序。比如,中文“我吃苹果”翻译为日文后则是“私は(我)林檎を(苹果)食べる(吃)”,两者词序不同,但句法结构一致。

    1.2.6 语义分析与篇章分析

    相较于句法分析,语义分析侧重语义而非语法。它包括词义消歧(确定一个词在语境中的含义,而不是简单的词性)、语义角色标注(标注句子中的谓语与其他成分的关系)乃至语义依存分析(分析句子中词语之间的语义关系)。

    随着任务的递进,它们的难度也逐步上升,属于较为高级的课题。即便是最前沿的研究,也尚未达到能够实用的精确程度。另外,相应的研究资源比较稀缺,大众难以获取,所以本书不会涉及。

    1.2.7 其他高级任务

    除了上述“工具类”的任务外,还有许多综合性的任务,与终端应用级产品联系更紧密。比如:

    ● 自动问答,根据知识库或文本中的信息直接回答一个问题,比如微软的Cortana和苹果的Siri;

    ● 自动摘要,为一篇长文档生成简短的摘要;

    ● 机器翻译,将一句话从一种语言翻译到另一种语言。

    注意,一般认为信息检索(Information Retrieve,IR)是区别于自然语言处理的独立学科。虽然两者具有密切的联系,但 IR 的目标是查询信息,而 NLP 的目标是理解语言。此外,IR 检索的未必是语言,还可以是以图搜图、听曲搜曲、商品搜索乃至任何信息的搜索。现实中还存在大量不需要理解语言即可完成检索任务的场景,比如 SQL 中的 LIKE。

    本书作为入门读物,不会讨论这些高级任务,但了解自然语言处理的整个宏观图景有助于我们开拓视野,找准定位与方向。

    1.3 自然语言处理的流派

    上一节比较了自然语言与人工语言的异同,展示了自然语言处理的困难所在,介绍了一些常见的 NLP 任务。这一节简要介绍进行自然语言处理的几种不同手法。

    1.3.1 基于规则的专家系统

    规则,指的是由专家手工制定的确定性流程。小到程序员日常使用的正则表达式,大到飞机的自动驾驶仪①,都是固定的规则系统。

    在自然语言处理的语境下,比较成功的案例有波特词干算法(Porter stemming algorithm),它由马丁•波特在 1980 年提出,广泛用于英文词干提取。该算法由多条规则构成,每个规则都是一系列固定的 if then条件分支。当词语满足条件则执行固定的工序,输出固定的结果。摘录其中一部分规则为例,收录于表 1-1 中。

    图像说明文字

    专家系统要求设计者对所处理的问题具备深入的理解,并且尽量以人力全面考虑所有可能的情况。它最大的弱点是难以拓展。当规则数量增加或者多个专家维护同一个系统时,就容易出现冲突。比如表 1-1 这个仅有 3 条规则的简单系统,规则 1 和规则 2 其实有冲突,类似 feed这样的单词会同时满足这两个规则的条件,从而引起矛盾。此时,专家系统通常依靠规则的优先级来解决。比如定义规则 1 优先于规则 2,当满足规则 1 的条件时,则忽略其他规则。几十条规则尚可接受,随着规则数量与团队人数的增加,需要考虑的兼容问题也越来越多、越来越复杂,系统维护成本也越来越高,无法拓展。

    大多数语言现象比英文词干复杂得多,我们已经在上文了解了不少。这些语言现象没有必然遵循的规则,也在时刻变化,使得规则系统显得僵硬、死板与不稳定。

    ① 区别于汽车的无人驾驶技术,飞机的自动驾驶系统只能处理预定情况,在异常情况下会报警或切换到手动驾驶。 
    ② 下面的例子中,feed 为特殊情况,不是过去式,不执行替换。bled 是 bleed 的过去式,不应执行“去 ed”。sing 不是现在进行时,不应执行“去 ing”。

    1.3.2 基于统计的学习方法

    为了降低对专家的依赖,自适应灵活的语言问题,人们使用统计方法让计算机自动学习语言。所谓“统计”,指的是在语料库上进行的统计。所谓语料库,指的是人工标注的结构化文本,我们会在接下来的小节中详细阐述。

    由于自然语言灵活多变,即便是语言学专家,也无法总结出完整的规则。哪怕真的存在完美的规则集,也难以随着语言的不停发展而逐步升级。由于无法用程序语言描述自然语言,所以聪明的人们决定以举例子的方式让机器自动学习这些规律。然后机器将这些规律应用到新的、未知的例子上去。在自然语言处理的语境下,“举例子”就是“制作语料库”。

    统计学习方法其实是机器学习的别称,而机器学习则是当代实现人工智能的主流途径。机器学习在自然语言处理中的重要性非常之大,可以说自然语言处理只是机器学习的一种应用。此处我们仅仅用“举例学习”来简单理解,后续章节将浓墨重彩地系统学习。

    1.3.3 历史

    既然自然语言处理是机器学习的应用层,那么如同人工智能的历史一样,自然语言处理也经历了从逻辑规则到统计模型的发展之路。图 1-4 列出了历史上几个重要的时间段。

    图像说明文字

    20 世纪 50 年代是人工智能与自然语言处理的萌芽期,出现了许多奠基性的工作。其中最具代表性的是数学家阿兰•图灵在论文 Computing Machinery and Intelligence 提出的人工智能的充分条件——图灵测试,以及语言学家乔姆斯基的《句法结构》——认为句子是按某种与语境无关的普遍语法规则生成的。有趣的是,先驱们的早期估计或理论都过于乐观。图灵曾预言在2014 年一台 1 GB 内存的计算机就能以 70% 的概率在 5 分钟内不被识破机器的身份,然而这个乐观的预言截至今日也没有实现。而乔姆斯基的“普遍语法”则因为对语义的忽视而备受争议,并在后续理论中做了相应修正。无论是人工智能还是自然语言处理,都是任重道远的课题。

    20 世纪 80 年代之前的主流方法都是规则系统,由专家手工编写领域相关的规则集。那时候计算机和计算机语言刚刚发明,从事编程的都是精英学者。他们雄心勃勃,认为只要通过编程就能赋予计算机智能。代表性工作有 MIT AI 实验室的 BASEBALL 以及 Sun 公司(2009 年被甲骨文公司收购)的 LUNAR,分别专门回答北美棒球赛事的问题和阿波罗探月带回来的岩石样本问题。这一时期还有很多类似的问答系统,都是主要依赖手写规则的专家系统。以BASEBALL 为例,其中的词性标注模块是这样判断 score 的词性的:“如果句子中不含其他动词,则 score 是一个动词,否则是名词。”接着该系统依靠词性上的规则合并名词短语、介词短语以及副词短语。语法模块则根据“若最后一个动词是主要动词并位于 to be 之后”之类的规则判断被动句、主语和谓语。然后该系统利用词典上的规则来将这些信息转化为“属性名 = 属性值”或“属性名 = ?”的键值对,用来表示知识库中的文档以及问句。最后利用类似“若除了问号之外所有属性名都匹配,则输出该文档中问句所求的属性”的规则匹配问句与答案。如此僵硬严格的规则导致该系统只能处理固定的问句,无法处理与或非逻辑、比较级与时间段。于是,这些规则系统被称为“玩具”。为了方便表述这样的规则逻辑,1972 年人们还特意发明了 Prolog(Programming in Logic)语言来构建知识库以及专家系统。

    20 世纪 80 年代之后,统计模型给人工智能和自然语言处理领域带来了革命性的进展——人们开始标注语料库用于开发和测试 NLP 模块:1988 年隐马尔可夫模型被用于词性标注,1990年 IBM 公布了第一个统计机器翻译系统,1995 年出现第一个健壮的句法分析器(基于统计)。为了追求更高的准确率,人们继续标注更大的语料库(TREC 问答语料库、CoNLL 命名实体识别、语义角色标注与依存句法语料库)。而更大的语料库与硬件的发展又吸引人们应用更复杂的模型。到了 2000 年,大量机器学习模型被广泛使用,比如感知机和条件随机场。人们不再依赖死板的规则系统,而是期望机器自动学习语言规律。要提高系统的准确率,要么换用更高级的模型,要么多标注一些语料。从此 NLP 系统可以健壮地拓展,而不再依赖专家们手写的规则。但专家们依然有用武之地,根据语言学知识为统计模型设计特征模板(将语料表示为方便计算机理解的形式)成为立竿见影的方法,这道工序被称为“特征工程”。2010 年基于 SVM 的Turbo 依存句法分析器在英语宾州树库(Penn Treebank)上取得了 92.3% 的准确率①,是当时最先进的系统。本书将着重介绍一些实用的统计模型及实现,它们并非高不可攀的技术,完全可以实现,且在普通的硬件资源下运行起来。

    2010 年之后语料库规模、硬件计算力都得到了很大提升,为神经网络的复兴创造了条件。但随着标注数据的增加,传统模型的准确率提升越来越不明显,人们需要更复杂的模型,于是深层的神经网络重新回归研究者的视野。神经网络依然是统计模型的一种,其理论奠基于 20世纪 50 年代左右。 1951 年,Marvin Lee Minsky 设计了首台模拟神经网络的机器。1958 年, Rosenblatt 首次提出能够模拟人类感知能力的神经网络模型——著名的感知机。1989 年,Yann LeCun 在贝尔实验室利用美国邮政数据集训练了首个深度卷积神经网络,用于识别手写数字。只不过限于计算力和数据量,神经网络一直到 2010 年前后才被广泛应用,并被冠以“深度学习”的新术语,以区别于之前的浅层模型。深度学习的魅力在于,它不再依赖专家制定特征模板,而能够自动学习原始数据的抽象表示,所以它主要用于表示学习。作为入门书,我们仅仅在最后一章介绍一些概念与应用,作为衔接传统方法与深度学习的桥梁。

    ① 准确来讲,是斯坦福标准下忽略标点符号的 Unlabeled Attachment Score,将会在第12 章中详细介绍。

    1.3.4 规则与统计

    纯粹的规则系统已经日渐式微,除了一些简单的任务外,专家系统已经落伍了。20 世纪 70年代,美国工程院院士贾里尼克在 IBM 实验室开发语音识别系统时,曾经评论道:“我每开除一名语言学家,我的语音识别系统的准确率就提高一点。”① 这句广为流传的快人快语未免有些刻薄,但公正地讲,随着机器学习的日渐成熟,领域专家的作用越来越小了。

    实际工程中,语言学知识的作用有两方面:一是帮助我们设计更简洁、高效的特征模板,二是在语料库建设中发挥作用。事实上,实际运行的系统在预处理和后处理的部分依然会用到一些手写规则。当然,也存在一些特殊案例更方便用规则特殊处理。

    本书尊重工程实践,以统计为主、规则为辅的方式介绍实用型 NLP 系统的搭建。

    1.3.5 传统方法与深度学习

    虽然深度学习在计算机视觉领域取得了耀眼的成绩,但在自然语言处理领域中的基础任务上发力并不大。这个结论或许有点意外,作为数据科学从业者,用数据说明问题最合适。表 1-2收录了《华尔街日报》语料库上的词性标注任务的前沿准确率。

    图像说明文字

    ① 原话是“Every time I fire a linguist, the performance of the speech recognizer goes up”。
    ② “作者姓 ( 年份 )”是一种常见的论文引用格式,可通过该信息(必要时加入主题关键词)搜索到论文。

    截止 2015 年,除了 Bi-LSTM-CRF 以外,其他系统都是传统模型,最高准确率为 97.36%,而 Bi-LSTM-CRF 深度学习模型为 97.55%,仅仅提高了 0.19%。2016 年,传统系统 NLP4J 通过使用额外数据与动态特征提取算法,准确率可以达到 97.64%。

    类似的情形也在句法分析任务上重演,以斯坦福标准下宾州树库的准确率为例,如表 1-3所示。

    图像说明文字

    2014 年首个神经网络驱动的句法分析器还不如传统系统 TurboParser 准确,经过几年的发展准确率终于达到 95.7%,比传统算法提高 3.4%。这个成绩在学术界是非常显著的,但在实际使用中并不明显。

    另一方面,深度学习涉及大量矩阵运算,需要特殊计算硬件(GPU、TPU 等)的加速。目前,一台入门级塔式服务器的价格在 3000 元左右,一台虚拟服务器每月仅需 50 元左右,但仅一块入门级计算显卡就需要 5000 元。从性价比来看,反而是传统的机器学习方法更适合中小企业。

    此外,从传统方法到深度学习的迁移不可能一蹴而就。两者是基础和进阶的关系,许多基础知识和基本概念用传统方法讲解会更简单、易懂,它们也会在深度学习中反复用到(比如 CRF与神经网络的结合)。无论是传统模型还是神经网络,它们都属于机器学习的范畴。掌握传统方法,不仅可以解决计算资源受限时的工程问题,还可以为将来挑战深度学习打下坚实的基础。

    1.4 机器学习

    在前面的小节中,我们邂逅了一些机器学习的术语。按照递归学习的思路,现在我们来递归了解一下机器学习的基本概念。

    本书虽然主要面向自然语言处理,不会专门设立章节详谈机器学习,但仍然会在合适的时候介绍引擎盖下的机器学习算法。机器学习是自然语言处理的基石,一些基本概念依然需要预先掌握。熟练掌握这些术语,还方便我们与其他人流畅交流。

    1.4.1 什么是机器学习

    人工智能领域的先驱 Arthur Samuel 在 1959 年给出的机器学习定义是:不直接编程却能赋予计算机提高能力的方法。

    聪明的读者或许都曾经思考过,计算机是否只能执行人类设计好的步骤?机器学习给了这个问题积极的答复,机器可以通过学习提高自身能力,而不需要程序员硬编码该项能力。美国工程院院士 Tom Mitchell 给过一个更明确的定义,机器学习指的是计算机通过某项任务的经验数据提高了在该项任务上的能力。

    简而言之,机器学习是让机器学会算法的算法。这个说法有些绕口,不如拿我们熟悉的数据库做类比:数据库中的“元数据”指的是描述数据的数据(表名、字段等),而其中的一行则是普通数据。类比过来,机器学习算法则可以称作“元算法”,它指导机器自动学习出另一个算法,这个算法被用来解决实际问题。为了避免混淆,人们通常称被学习的算法为模型。

    1.4.2 模型

    模型是对现实问题的数学抽象,由一个假设函数以及一系列参数构成。举个简单的例子,我们要预测中国人名对应的性别。假设中国人名由函数 f x()输出的符号决定,负数表示女性,非负数表示男性。

    我们选取的 f x()的定义如下:

    图像说明文字

    其中, w 和 b 是函数的参数,而 x 是函数的自变量。那么,模型指的就是包括参数在内的整个函数。不过模型并不包括具体的自变量 x ,因为自变量是由用户输入的。自变量 x 是一个特征向量,用来表示一个对象的特征。

    读者可以将式 (1.1) 理解为初中的直线方程,也可以理解为高中的平面方程,或者高维空间中的超平面方程。总之,不必担心问题的抽象性,我们将在第 5 章中用代码完整地实现这个案例。

    1.4.3 特征

    特征指的是事物的特点转化的数值,比如牛的特征是 4 条腿、0 双翅膀,而鸟的特征是 2条腿、1 双翅膀。那么在性别识别问题中,中国人名的特征是什么呢?

    首先,对于一个中国人名,姓氏与性别无关,真正起作用的是名字。而计算机不知道哪部分是姓,哪部分是名。姓氏属于无用的特征,不应被提取。另外,有一些特殊的字(壮、雁、健、强)是男性常用的,而另一些(丽、燕、冰、雪)则是女性常用的,还有一些(文、海、宝、玉)则是男女通用的。让我们把人名表示为计算机可以理解的形式,一个名字是否含有这些字就成了最容易想到的特征。在专家系统中,我们显式编程:

    图像说明文字

    如果有人叫“沈雁冰”① 怎么办?“雁”听上去像男性,而“冰”听上去像女性,而这个名字其实是男性用的。看来,每个字与男女的相关程度是不一样的,“雁”与男性的相关程度似乎大于“冰”与女性的相关程度。这个冲突似乎可以通过“优先级”解决,不过这种机械的工作交给机器好了。在机器学习中,“优先级”可以看作特征权重或模型参数。我们只需要定义一系列特征,让算法根据数据自动决定它们的权重就行了。为了方便计算机处理,我们将它们表示为数值类型的特征,这个过程称为特征提取。以“沈雁冰”的特征提取为例,如表 1-4 所示。

    图像说明文字

    特征的数量是因问题而定的,2 个特征显然不足以推断名字的性别,我们可以增加到 4 个,如表 1-5 所示。

    ① 作家茅盾原名沈德鸿,字雁冰,以字行于世,因此“沈雁冰”同样为人熟知。

    图像说明文字

    有时候,我们还可以将位置信息也加入特征中,比如“是否以雪字结尾”。我们还可以组合两个特征得到新的特征,比如“是否以雪字结尾并且倒数第二个字是吹”,这样就可以让“西门吹雪”这个特殊名字得到特殊处理,而不至于同“小雪”“陆雪琪”混为一谈。

    工程上,我们并不需要逐个字地写特征,而是定义一套模板来提取特征。比如姓名为 name的话,则定义特征模板为 name[1] + name[2]之类,只要我们遍历一些姓名,则 name[1] + name[2]可能组合而成的特征就基本覆盖了。这种自动提取特征的模板称作特征模板。

    如何挑选特征,如何设计特征模板,这称作特征工程。特征越多,参数就越多;参数越多,模型就越复杂。模型的复杂程度应当与数据集匹配,按照递归学习的思路,数据集的概念将在下一节中介绍。

    1.4.4 数据集

    如何让机器自动学习,以得到模型的参数呢?首先得有一本习题集。有许多问题无法直接编写算法(规则)解决(比如人名性别识别,我们说不清楚什么样的名字是男性),所以我们准备了大量例子(人名 x 及其对应的性别 y)作为习题集,希望机器自动从习题集中学习中国人名的规律。其中,“例子”一般称作样本。

    这本习题集在机器学习领域称作数据集,在自然语言处理领域称作语料库,会在 1.5 节详细介绍。数据集的种类非常多,根据任务的不同而不同。表 1-6 收录了一些常用的数据集。

    图像说明文字

    在使用数据集时,我们不光要考虑它的规模、标注质量,还必须考虑它的授权。大部分数据集都不可商用,许多冷门领域的数据集也比较匮乏,此时我们可以考虑自行标注。

    1.4.5 监督学习

    如果这本习题集附带标准答案 y ,则此时的学习算法称作监督学习。监督学习算法让机器先做一遍题,然后与标准答案作比较,最后根据误差纠正模型的错误。大多数情况下,学习一遍误差还不够小,需要反复学习、反复调整。此时的算法是一种迭代式的算法,每一遍学习都称作一次迭代。监督学习在日语中被称作“教師あり学習”,意思是“有老师的学习”。通过提供标准答案,人类指出了模型的错误,充当了老师的角色。

    图像说明文字

    这种在有标签的数据集上迭代学习的过程称为训练,训练用到的数据集称作训练集。训练的结果是一系列参数(特征权重)或模型。利用模型,我们可以为任意一个姓名计算一个值,如果非负则给出男性的结论,否则给出女性的结论。这个过程称为预测。

    总结一下,监督学习的流程如图 1-5 所示。

    图像说明文字

    在性别识别的例子中:

    ● 非结构化数据是许多个类似“沈雁冰”“丁玲”的人名;

    ● 经过人工标注后得到含有许多个类似“沈雁冰=男”“丁玲=女”样本的标注数据集;

    ● 然后通过训练算法得到一个模型;

    ● 最后利用这个模型,我们可以预测任何名字(如“陆雪琪”)的性别。

    待预测的名字不一定出现在数据集中,但只要样本数量充足且男女均衡、特征模板设计得当、算法实现正确,我们依然可以预期一个较高的准确率。

    另外,图 1-5 中的标注数据其实也是结构化数据。但由于它含有人工标注的成本,有时被称作“黄金数据”(gold data),与模型预测的、有一定误差的结果还是有很大区别的。

    本书将从第 3 章开始详细介绍一些 NLP 中实用的监督学习方法。

    1.4.6 无监督学习

    如果我们只给机器做题,却不告诉它参考答案,机器仍然可以学到知识吗?

    可以,此时的学习称作无监督学习,而不含标准答案的习题集被称作无标注(unlabeled)的数据集。无监督学习在日语中被称作“教師なし学習”,意为“没有老师的学习”。没有老师的指导,机器只能说发现样本之间的联系,而无法学习样本与答案之间的关联。

    无监督学习一般用于聚类和降维,两者都不需要标注数据。

    聚类已经在 1.2 节中介绍过了,我们不再赘述。在性别识别的例子中,如果我们选择将一系列人名聚成 2 个簇的话,“周树人”“周立人”很可能在一个簇里面,“陆雪琪”和“曹雪芹” 在另一个簇里面。这是由样本之间的相似性和簇的颗粒度决定的,但我们并不知道哪个簇代表男性哪个簇代表女性,它们也未必能通过肉眼区分。

    降维指的是将样本点从高维空间变换到低维空间的过程。机器学习中的高维数据比比皆是,比如在性别识别的例子中,以常用汉字为特征的话,特征数量轻易就突破了 2000。如果样本具有 n 个特征,则样本对应着 n +1 维空间中的一个点,多出来的维度是给假设函数的因变量用的。如果我们想要让这些样本点可视化,则必须将其降维到二维或三维空间。有一些降维算法的中心思想是,降维后尽量不损失信息,或者说让样本在低维空间中每个维度上的方差都尽量大。试想一下这样的极端案例:平地上竖直地插着一些等长的钢管,将这些钢管的顶端降维到二维平面上,就是拔掉钢管后留下来的孔洞。垂直维度上钢管长度都是一样的,没有有用信息,于是被舍弃掉了。

    有一些无监督方法也可以用来驱动中文分词、词性标注、句法分析等任务。由于互联网上存储了丰富的非结构化数据,所以无监督学习十分诱人。然而无监督学习时,模型与用户之间没有发生任何信息交换,这种缺乏监督信号的学习导致模型无法捕捉用户的标准,最终预测的结果往往与用户心目中的理想答案相去甚远。目前,无监督学习的 NLP 任务的准确率总比监督学习低十几个到几十个百分点,无法达到生产要求。

    本书将在第 10 章详细介绍聚类算法的原理和实现。

    1.4.7 其他类型的机器学习算法

    如果我们训练多个模型,然后对同一个实例执行预测,会得到多个结果。如果这些结果多数一致,则可以将该实例和结果放到一起作为新的训练样本,用来扩充训练集。这样的算法①被称为半监督学习。由于半监督学习可以综合利用标注数据和丰富的未标注数据,所以正在成为热门的研究课题。

    现实世界中的事物之间往往有很长的因果链:我们要正确地执行一系列彼此关联的决策,才能得到最终的成果。这类问题往往需要一边预测,一边根据环境的反馈规划下次决策。这类算法被称为强化学习。强化学习在一些涉及人机交互的问题上成果斐然,比如自动驾驶、电子竞技和问答系统。

    本书作为入门读物,不会深入这些前沿课题。但了解这些分支的存在,有助于构建完整的知识体系。

    ① 称作启发式半监督学习,是所有半监督学习方法中最容易理解的一种。

    1.5 语料库

    语料库作为自然语言处理领域中的数据集,是我们教机器理解语言不可或缺的习题集。在这一节中,我们来了解一下中文处理中的常见语料库,以及语料库建设的话题。

    1.5.1 中文分词语料库

    中文分词语料库指的是,由人工正确切分后的句子集合。

    以著名的 1998 年《人民日报》语料库为例,该语料库由北京大学计算语言学研究所联合富士通研究开发中心有限公司,在人民日报社新闻信息中心的许可下,从 1999 年 4 月起到 2002年 4 月底,共同标注完成。语料规模达到 2600 万汉字,市售为 1998 年上半年的语料部分(约1300 万字=约 730 万词)。

    在 2005 年的第二届国际中文分词比赛中,曾经公开过约 1 个月份的语料。其中的一句样例为:

    先有通货膨胀干扰,后有通货紧缩叫板。

    从这句简单的标注语料中,无须语言学知识,我们也能发现一个问题:为何“通货膨胀”是一个词,而“通货 紧缩”却分为两个词呢?这涉及语料标注规范和标注员内部一致性的问题。我们将在后续章节中详细介绍这些话题,现在只需留个印象:语料规范很难制定,规范很难执行。

    事实上,中文分词语料库虽然总量不多,但派别却不少。我们将在第 3 章中了解这些语料的授权、下载与使用。

    1.5.2 词性标注语料库

    它指的是切分并为每个词语指定一个词性的语料。总之,我们要教机器干什么,我们就得给机器示范什么。依然以《人民日报》语料库为例,1998 年的《人民日报》一共含有 43 种词性,这个集合称作词性标注集。这份语料库中的一句样例为:

    迈向/v 充满/v 希望/n 的/u 新/a 世纪/n ——/w 一九九八年/t 新年/t 讲话/n (/w 附/v 图片/n 1/m 张/q )/w

    这里每个单词后面用斜杠隔开的就是词性标签,关于每种词性的意思将会在第 7 章详细介绍。这句话中值得注意的是,“希望”的词性是“名词”(n)。在另一些句子中,“希望”还可以作为动词。

    1.5.3 命名实体识别语料库

    这种语料库人工标注了文本内部制作者关心的实体名词以及实体类别。比如《人民日报》语料库中一共含有人名、地名和机构名 3 种命名实体:

    萨哈夫/nr 说/v ,/w 伊拉克/ns 将/d 同/p [联合国/nt 销毁/v 伊拉克/ns 大规模/b 杀伤性/n 武器/n 特别/a 委员会/n] /nt 继续/v 保持/v 合作/v 。/w

    这个句子中的加粗词语分别是人名、地名和机构名。中括号括起来的是复合词,我们可以观察到:有时候机构名和地名复合起来会构成更长的机构名,这种构词法上的嵌套现象增加了命名实体识别的难度。

    命名实体类型有什么取决于语料库制作者关心什么。在本书第 8 章中,我们将演示如何标注一份语料库用来实现对战斗机名称的识别。

    1.5.4 句法分析语料库

    汉语中常用的句法分析语料库有 CTB(Chinese Treebank,中文树库),这份语料库的建设工作始于 1998 年,历经宾夕法尼亚大学、科罗拉多大学和布兰迪斯大学的贡献,一直在发布多个改进版本。以 CTB 8.0 版为例,一共含有来自新闻、广播和互联网的 3007 篇文章,共计 71 369个句子、1 620 561 个单词和 2 589 848 个字符。每个句子都经过了分词、词性标注和句法标注。其中一个句子可视化后如图 1-6 所示。

    图像说明文字

    图 1-6 中,中文单词上面的英文标签表示词性,而箭头表示有语法联系的两个单词,具体是何种联系由箭头上的标签表示。关于句法分析语料库的可视化和利用,将会在第 12 章中介绍。

    1.5.5 文本分类语料库

    它指的是人工标注了所属分类的文章构成的语料库。相较于上面介绍的 4 种语料库,文本分类语料库的数据量明显要大很多。以著名的搜狗文本分类语料库为例,一共包含汽车、财经、 IT、健康、体育、旅游、教育、招聘、文化、军事 10 个类别,每个类别下含有 8000 篇新闻,每篇新闻大约数百字。

    另外,一些新闻网站上的栏目经过了编辑的手工整理,相互之间的区分度较高,也可作为文本分类语料库使用。情感分类语料库则是文本分类语料库的一个子集,无非是类别限定为 “正面”“负面”等而已。

    如果这些语料库中的类目、规模不满足实际需求,我们还可以按需自行标注。标注的过程实际上就是把许多文档整理后放到不同的文件夹中。

    1.5.6 语料库建设

    语料库建设指的是构建一份语料库的过程,分为规范制定、人员培训与人工标注这 3 个阶段。

    规范制定指的是由语言学专家分析并制定一套标注规范,这份规范包括标注集定义、样例和实施方法。在中文分词和词性标注领域,比较著名的规范有北京大学计算语言学研究所发布的《现代汉语语料库加工规范——词语切分与词性标注》和中国国家标准化管理委员会发布的《信息处理用现代汉语词类标记规范》。

    人员培训指的是对标注员的培训。由于人力资源的限制,制定规范与执行规范的未必是同一批人。大型语料库往往需要多人协同标注,这些标注员对规范的理解必须达到一致,否则会导致标注员内部冲突,影响语料库的质量。

    针对不同类型的任务,人们开发出许多标注软件,其中比较成熟的一款是 brat(brat rapid annotation tool) ①,它支持词性标注、命名实体识别和句法分析等任务。brat 是典型的 B/S 架构,服务端用 Python 编写,客户端运行于浏览器。相较于其他标注软件,brat 最大的亮点是多人协同标注功能。此外,拖曳式的操作体验也为 brat 增色不少。

    ① 详见 http://brat.nlplab.org/。

    1.6 开源工具

    目前开源界贡献了许多优秀的 NLP 工具,它们为我们提供了多种选择,比如教学常用的NLTK(Natural Language Toolkit)、斯坦福大学开发的 CoreNLP,以及国内哈工大开发的 LTP (Language Technology Platform)、我开发的 HanLP(Han Language Processing)。

    1.6.1 主流 NLP 工具比较

    选择一个工具包,我们需要考虑的问题有:功能、精度、运行效率、内存效率、可拓展性、商业授权和社区活跃程度。表 1-7 比较了 4 款主流的开源 NLP 工具包。

    图像说明文字

    关于这些开源工具的发展速度,根据 GitHub 上 Star 数量的趋势,HanLP 是发展最迅猛的,如图 1-7 所示。

    图像说明文字

    ① 关于 HanLP 与 LTP 的具体性能对比,请参考 @zongwu233 的第三方开源评测:https://github.com/zongwu233/ HanLPvsLTP。关于 HanLP 与包括结巴、IK、Stanford、Ansj、word 在内的其他 Java 开源分词器的性能对比,可参考阿里巴巴架构师杨尚川的第三方开源评测:https://github.com/ysc/cws_evaluation。我不保证第三方开源评测的准确与公正,更不采信任何闭源评测。本书将在相关章节中详细介绍如何规范地评估常见 NLP 任务的精度。
    

    ② 截至 2019 年 8 月份在 GitHub 上的 Star 数量。

    另外,我也研究过其他开源项目的原理,借鉴了其中优秀的设计。但毕竟还是自己写的代码讲得最清楚,所以综合以上各种考虑,最后选取了 HanLP 作为本书的实现。

    1.6.2 Python 接口

    得益于 Python 简洁的设计,使用这门动态语言调用 HanLP 会省下不少时间。无论用户是否常用 Python,都推荐一试。

    HanLP 的 Python 接口由 pyhanlp 包提供,其安装只需一句命令:

    $ pip install pyhanlp

    这个包依赖 Java 和 JPype。Windows 用户如果遇到如下错误:

    building '_jpype' extension
    error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual
    C++ Build Tools": http://visualstudio.microsoft.com/visual-cpp-build-tools/

    既可以按提示安装 Visual C++,也可以安装更轻量级的 Miniconda。Miniconda 是 Python 语言的开源发行版,提供更方便的包管理。安装时请勾选如图 1-8 所示的两个复选框。

    图像说明文字

    然后执行如下命令:

    $ conda install -c conda-forge jpype1
    $ pip install pyhanlp

    如果遇到 Java 相关的问题:

    jpype._jvmfinder.JVMNotFoundException: No JVM shared library file (jvm.dll) found. Try setting up the JAVA_HOME environment variable properly.

    请安装 Java 运行环境①。HanLP 主项目采用 Java 开发,所以需要 JDK 或 JRE。如果发生其他错误,欢迎前往项目讨论区② 汇报问题。

    一切顺利的话,在命令行中键入如下命令,可以验证安装结果:

    图像说明文字

    如果 Linux 用户遇到权限问题,则需要执行 sudo hanlp。因为在第一次运行时,pyhanlp 会自动下载 HanLP 的 jar 包(包含许多算法)和数据包(包含许多模型)到 pyhanlp 的系统路径。

    通过命令行,我们可以在不写代码的前提下轻松调用 HanLP 提供的常见功能。

    ① 官网(http://www.oracle.com/technetwork/java/javase/downloads/index.html)推荐选择 JDK 8 以上版本。 
    

    ② 详见 https://github.com/hankcs/HanLP/issues,我大约每周末回复一次。

    使用命令 hanlp segment进入交互分词模式;输入一个句子并回车,HanLP 会输出分词结果:

    $ hanlp segment
    商品和服务
    商品/n 和/cc 服务/vn
    当下雨天地面积水分外严重
    当/p 下雨天/n 地面/n 积水/n 分外/d 严重/a王总和小丽结婚了
    王总/nr 和/cc 小丽/nr 结婚/vi 了/ule

    在 Linux 下还可以重定向字符串作为输入:

    $ hanlp segment <<< '欢迎新老师生前来就餐'
    欢迎/v 新/a 老/a 师生/n 前来/vi 就餐/vi

    注意 Windows 不支持字符串的 <<< 定向,只能手动输入。

    这里默认执行了词性标注,我们可以禁用它:

    $ hanlp segment --no-tag <<< ' 欢迎新老师生前来就餐'
    欢迎 新 老 师生 前来 就餐

    任何平台都支持重定向文件输入 / 输出,比如我们将一本小说存储为 input.txt :

    $ head input.txt 
    第一章 隐忧
    张小凡看着前方那个中年文士,也就是当今正道的心腹大患“鬼王”,脑海中一片混乱。
    这些日子以来,他在深心处不时对自己往日的信仰有小小的疑惑,其实都根源于当日空桑山下茶摊里的一番对话。如今,又见故人,这份心情当真复杂,几乎让他一时间忘了此时此地的处境。
    不过就算他忘了,旁边的人可不会忘。
    小周伸手擦去了嘴边的鲜血,勉强站了起来,低声对张小凡、田灵儿二人道:“此人道行太高,不可力敌,我来拖住他,你们二人快走!”
    说罢,他伸手一招,倒插在岩壁中到现在兀自在轻微振动的“七星剑”,似受他召唤,“铮”的一声破壁而出,飞回到他手上。
    鬼王看了看小周,点了点头,脸上依然带着一丝微笑,道:“以你的道行,看来青云门门下年轻弟子一辈里,要以你为首。
    想不到青云门除了这个张小凡,居然还有你这样的人才,不错,不错!”
    张小凡吓了一跳,却发觉师姐田灵儿与那小周的眼光都瞄了过来,一时脸上有些发热,却不知道该说什么才好。

    通过重定向,只需一条命令就可以给小说分词:

    $ hanlp segment < input.txt > output.txt -a crf --no-tag

    此处通过 -a参数指定分词算法为 CRF。关于该算法,我们会在第 6 章中详细介绍。现在,我们先来感性观察一下 CRF 分词的效果:

    $ head output.txt 
    第一 章   隐忧
    张小凡 看着 前方 那个 中年 文士 , 也 就是 当今 正道 的 心腹大患 “ 鬼王 ” , 脑海中 一片 混乱。这些 日子 以来 , 他 在 深心 处 不时 对 自己 往日 的 信仰 有 小小 的 疑惑 , 其实 都 根源 于 当日 空桑山 下 茶摊 里 的 一番 对话 。
    如今 , 又 见 故人 , 这 份 心情 当真 复杂 , 几乎 让 他 一 时间 忘 了 此时此地 的 处境 。不过 就算 他 忘 了 , 旁边 的 人 可 不会 忘 。
    小周 伸手 擦去 了 嘴边 的 鲜血 , 勉强 站 了 起来 , 低声 对 张小凡 、 田灵儿 二 人 道 :
    “ 此人 道行 太 高 , 不可力敌 , 我 来 拖住 他 , 你们 二 人 快走 !”
    说罢 , 他 伸手 一 招 , 倒 插 在 岩壁 中 到 现在 兀自 在 轻微 振动 的 “ 七星剑 ” , 似 受 他 召唤 , “ 铮 ” 的 一 声 破壁 而 出 , 飞 回到 他 手上 。
    鬼王 看 了 看 小周 , 点 了 点头 , 脸上 依然 带 着 一 丝 微笑 , 道 : “ 以 你 的 道行 , 看来 青云门 门下 年轻 弟子 一 辈 里 , 要以 你 为首 。
    想不到 青云门 除了 这个 张小凡 , 居然 还有 你 这样 的 人才 , 不错 , 不错 ! ”
    张小凡 吓了一跳 , 却 发觉 师姐 田灵儿 与 那 小周 的 眼光 都 瞄 了 过来 , 一时 脸上 有些 发热 , 却 不 知道 该 说 什么 才 好 。

    效果似乎还行,“鬼王”“空桑山”“七星剑”“青云门”等词语都正确切分出来了。但仍然有不尽如人意的地方。比如“此时此地”“吓了一跳”为什么被当作一个词?这些分词标准是由分词器作者定的吗?这些问题我们将会在后续章节中逐个讨论。

    句法分析功能也是一样的道理,一句命令即可:

    图像说明文字

    这些命令还支持许多其他参数,这可以通过 --help参数来查看最新的帮助手册:

    图像说明文字

    在初步体验 HanLP 后,来看看如何在 Python 中调用 HanLP 的常用接口。这里给出一个大而不全的例子:

    图像说明文字

    HanLP 的常用功能可以通过工具类 HanLP来调用,而不需要创建实例。对于其他更全面的功能介绍,可参考 GitHub 上的 demos 目录:https://github.com/hankcs/pyhanlp/tree/master/tests/demos。

    1.6.3 Java 接口

    Java 用户可以通过 Maven 方便地引入 HanLP 库,只需在项目的 pom.xml 中添加如下依赖项即可:

    图像说明文字

    此外,可以访问发布页https://github.com/hankcs/HanLP/releases 获取其最新的版本号。

    然后就可以用一句话调用HanLP 了:

    System.out.println(HanLP.segment("你好,欢迎使用HanLP汉语处理包!"));

    常用的 API 依然封装在工具类 HanLP中,你可通过 https://github.com/hankcs/HanLP 了解接口的用法。当然,你也可以随着本书的讲解,逐步熟悉这些功能。

    HanLP 的数据与程序是分离的。为了减小 jar 包的体积,portable 版只含有少量数据。对于一些高级功能(CRF 分词、句法分析等),则需要下载额外的数据包,并通过配置文件将数据包的位置告诉给 HanLP。

    如果读者安装过 pyhanlp 的话,则数据包和配置文件已经安装就绪。我们可以通过如下命令获取它们的路径:

    图像说明文字

    最后一行 hanlp.properties 就是所需的配置文件,我们只需将它复制到项目的资源目录src/main/resources 即可(没有该目录的话,手动创建一个)。此时 HanLP 就会从 /usr/local/lib/python3.6/site-packages/pyhanlp/static 加载 data,也就是说与 pyhanlp 共用同一套数据包。

    如果读者没有安装过 pyhanlp,或者希望使用独立的 data,也并不困难。只需访问项目主页https://github.com/hankcs/HanLP,下载 data.zip 并将其解压到一个目录,比如 D:/hanlp。然后下载并解压 hanlp-1.7.5-release.zip,将得到的 hanlp.properties 中的第一行 root 设为 data 文件夹的父目录:

    root=D:/hanlp

    注意 Windows 用户请注意,路径分隔符统一使用斜杠“/”。Windows 默认的“\”与绝大多数编程语言的转义符冲突,比如“D:\nlp”中的“\n”实际上会被Java 和Python 理解为换行符,引发问题。

    最后,将 hanlp.properties 移动到项目的 resources 目录中即可。

    由于本书将深入讲解 HanLP 的内部实现,所以还推荐读者去 GitHub 上创建分支(fork)并克隆(clone)一份源码。版本库中的文件结构如下:

    图像说明文字

    限于文件体积,版本库中依然不含完整的 model 文件夹,需要用户下载数据包和配置文件。下载方式有自动与手动两种,本书 Java 配套代码在运行时会自动下载并解压,另外用户也可以自行下载解压。按照前面提到的方法,创建 resources 目录并将 hanlp.properties 放入其中。然后将下载到的 data/model 放入版本库的相应目录即可。完成后的路径示意图如下:

    图像说明文字

    接下来,我们就可以运行本书配套的代码了(配套代码位于 src/test/java/com/hankcs/book)。现在我们来运行一个 Hello Word(详见 ch01/HelloWord.java):

    HanLP.Config.enableDebug(); // 为了避免你等得无聊,开启调试模式说点什么
    System.out.println(HanLP.segment("王国维和服务员"));

    运行一下,会得到类似如下的输出:

    图像说明文字

    相较于上一个例子,它们有以下两个区别。

    ● 我们打开了调试模式,此时会将运行过程的中间结果输出到控制台。

    ● 我们运行的是GitHub仓库版,该版本中的词典和模型都是文本形式。HanLP中的词典一般有文本和二进制两种形式,它们的关系类似于源码和程序。当二进制不存在时,HanLP会加载文本词典并自动缓存为同名的二进制。二进制的加载比文本要快很多,通常是5 倍的加速比。比如在上面的例子中,加载文本花了341 ms,但再次运行时加载相应的二进制只花了64 ms。通过缓存机制和内部重写的IO 接口,HanLP 可以将系统的冷启动控制在几百毫秒内。这为程序员反复调试提供了极大的便利。

    再来看看调试输出,里面分为两个过程:粗分过程和细分过程。粗分过程的结果是 [王国 /n, 维和 /vn, 服务员 /nnt],这显然是不合理① 的,这个句子不应该这样理解。于是在细分过程中,算法进行了人名识别,召回了“王国维”这个词语。接着算法觉得 [王国维 /nr, 和 /cc, 服务员 /nnt]通顺多了,于是将其作为最终结果。

    算法内部还有许多细节,但我们已经有了趁手的武器。具体武器的基本骨架、锻造过程和使用场景,将以递归的形式逐步讲解。

    1.7 总结

    本章给出了人工智能、机器学习与自然语言处理的宏观缩略图与发展时间线。机器学习是人工智能的子集,而自然语言处理则是人工智能与语言学、计算机科学的交集。这个交集虽然小,它的难度却很大。为了实现理解自然语言这个宏伟目标,人们尝试了规则系统,并最终发展到基于大规模语料库的统计学习系统。

    在接下来的章节中,就让我们按照这种由易到难的发展规律去解决第一个 NLP 问题——中文分词。我们将先从规则系统入手,介绍一些快而不准的算法,然后逐步进化到更加准确的统计模型。

    ① 称其“不合理”而非“不正确”的原因是,我们无法排除在某个奇幻世界里存在一个特立独行的王国,里面养着一只维和部队,部队的成员却不是战士而是服务员。但这种可能性非常低,几乎不可能发生。

    本文摘自《自然语言处理入门》
    在这里插入图片描述

    展开全文
  • 自然语言处理

    2020-01-09 16:40:05
    自然语言处理,英文Natural Language Processing,简写NLP。NLP这个概念本身过于庞大,很难通过简短的几句定义就能明白它是什么。不妨把它分成“自然语言”和“处理”两部分。先来看自然语言。区分于计算机语言,...
  • 自然语言处理(NLP)知识结构总结

    万次阅读 多人点赞 2018-03-17 18:04:35
    自然语言处理知识太庞大了,网上也都是一些零零散散的知识,比如单独讲某些模型,也没有来龙去脉,学习起来较为困难,于是我自己总结了一份知识体系结构,不足之处,欢迎指正。内容来源主要参考黄志洪老师的自然语言...
  • 这是一系列自然语言处理的介绍,本文不会涉及公式推导,主要是一些算法思想的随笔记录。 适用人群:自然语言处理初学者,转AI的开发人员。 编程语言:Python 参考书籍:《数学之美》 《统计自然语言处理》 --宗成庆 ...
  • 写给小白的自然语言处理入门简介

    千次阅读 多人点赞 2020-06-18 20:02:43
    自然语言处理简介 什么是自然语言 自然语言是人类社会发展过程中自然产生的语言,是最能体现人类智慧和文明的产物。 它是一种人与人交流的载体,我们使用语言传递知识。这个星球上许多生物都拥有超过人类的视觉系统,但...
  • 什么是自然语言处理NLP 用通俗的话来讲,自然语言处理NLP的目标是让机器能够理解人类的语言,NLP就是人和机器进行交流的技术。用专业语言来讲,自然语言处理有狭义和广义之分。狭义的自然语言处理是使用计算机来完成...
  • 自然语言处理讲义

    万次阅读 2004-06-27 15:41:00
    1.综述.1.1. 绪论.1.1.1. 背景,目标.1.1.1.1. 研究自然语言的动力1. 语言是思维的裁体,是人际交流的重要工具。...在这样的社会需求下,自然语言理解作为语言信息处理技术的一个高层次的重要方向,
  • 自然语言处理在电商的技术实践

    千次阅读 2017-09-25 17:18:44
    GitChat 作者:李睿 关注微信公众号:「GitChat 技术杂谈」 一本正经的讲...作为一个在美国主要的电商网站之一的eBay混了n年的“数据科学家”,我给大家分享一下自然语言处理(Natural Langrage Processing,缩写为N
  • 入坑NLP - 自然语言处理领域概述

    万次阅读 2017-11-17 21:08:18
    自然语言处理研究的内容包括但不限于如下分支:文本分类、信息抽取、自动摘要、智能问答、话题推荐、机器翻译、主题词识别、知识库构建、深度文本表示、命名实体识别、文本生成、文本分析(词法、句法、语法)、语音...
  • 自然语言处理实战:新闻文本分类(附代码)

    千次阅读 多人点赞 2020-08-13 18:06:15
    目录自然语言处理实战:新闻文本分类一、赛题理解1、学习目标2、赛题数据3、数据标签4、评测指标5、数据读取6、解题思路二、数据读取与数据分析1、学习目标2、数据读取3、数据分析3.1句子长度分析3.2新闻类别分布3.3...
  • 自然语言处理NLP知识结构

    千次阅读 2018-11-08 15:18:08
    自然语言处理NLP知识结构 文|秦陇纪,数据简化DataSimp 自然语言处理(计算机语言学、自然语言理解)涉及:字处理,词处理,语句处理,篇章处理词处理分词、词性标注、实体识别、词义消歧语句处理句法分析...
  • 从知识产业角度来看,自然语言处理软件占有重要的地位,专家系统、数据库、知识库,计算机辅助设计系统(CAD)、计算机辅助教学系统(Cal)、计算机辅助决策系统、办公室自动化管理系统、智能...
  • 一文读懂自然语言处理NLP(图解+学习资料)数据派THU发表于数据派THU订阅905前言自然语言处理是文本挖掘的研究领域之一,是人工智能和语言学领域的分支学科。在此领域中探讨如何处理及运用自然语言。对于自然语言...
  • 自然语言处理中CNN模型几种常见的Max Pooling操作

    万次阅读 多人点赞 2016-04-07 19:00:02
    /* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/    author: 张俊林    (想更系统地学习深度学习知识?请参考:深度学习枕边书...CNN是目前自然语言处理中和RNN并驾齐驱的两种最...
  • 自然语言处理之知识图谱

    万次阅读 多人点赞 2018-07-12 10:38:29
     收集数据之后需要对数据进行处理,这里面最有价值的首先是文本数据,因此要用到自然语言处理基本的过程是:语言分词、词性标注、命名实体识别、句法分析,更高级写的应用还包括语义依存分析。对于构建知识库而言...
  • 统计自然语言处理(第2版)目录

    千次阅读 2020-07-02 16:21:02
    1.3 自然语言处理基本方法及其发展 1.3.1 自然语言处理基本方法 1.3.2 自然语言处理的发展 1.4 自然语言处理的研究现状 1.5 本书的内容安排 第2章 预备知识 2.1 概率论基本概念 2.1.1 概率 2.1
  • 目录 1.前言 2. 什么是N-Gram模型 3.利用N-Gram模型评估语句是否合理 4.N-Gram模型评估语句合理性的例子 ...自然语言(Natural Language)其实就是人类的语言,自然语言处理(NLP)就是对人类语言的...
  • NLP【自然语言处理】技术路线

    千次阅读 2019-10-22 12:41:33
    自然语言处理 NLP 1. 数学基础........................................................................................................... 3 1.1. 线性代数..............................
  • 一文读懂自然语言处理NLP

    万次阅读 多人点赞 2017-11-30 09:44:32
    前言 ...基于统计的自然语言处理是哲学中的经验主义,基于规则的自然语言处理是哲学中的理性主义。在哲学领域中经验主义与理性主义的斗争一直是此消彼长,这种矛盾与斗争也反映在具体科学上,如自然
  • 自然语言处理面试基础

    千次阅读 2020-01-01 23:30:03
    因为本课程是关于深度学习在自然语言处理中的应用,所以课程开始部分我们会概括性地介绍什么是深度学习项目的一般流程和所需基本概念,深度学习在自然语言处理领域主要有哪些热门应用,还会介绍本课程项目所需的 ...
  • 如果让你破译“三体”人文字你会怎么办?我们试着开一下脑洞:假如你有一个优盘,里面存了大量“三体”人(刘慈欣小说中的高智能外星人)的网络文本信息... ...这是传说中自然语言处理的经验主义视角。
  • 自然语言处理怎么最快入门?

    万次阅读 2017-07-31 11:47:40
    自然语言处理怎么最快入门? 关注问题写回答 自然语言处理 自然语言处理怎么最快入门? 最好是方法与教程 关注者 5651
  • 本文的主题是自然语言处理中的预训练过程,会大致说下NLP中的预训练技术是一步一步如何发展到Bert模型的,从中可以很自然地看到Bert的思路是如何逐渐形成的,Bert的历史沿革是什么,继承了什么,创新了什么,为什么...
  • 文章目录 神经网络知识大串联 1:第一代的神经元模型 3 2:从M-P模型到感知器模型 3 3:前馈神经网络 3 4:后向传播与BP算法神经网络 4 ...自然语言处理知识大串联 1:one-hot 11 2:Word-embeding 词嵌入 11 3:Word2V...
  • [深度学习] 自然语言处理 --- NLP入门指南

    千次阅读 多人点赞 2019-12-15 11:01:55
    NLP的全称是Natuarl Language Processing,中文意思是自然语言处理,是人工智能领域的一个重要方向 自然语言处理(NLP)的一个最伟大的方面是跨越多个领域的计算研究,从人工智能到计算语言学的多个计算研究领域都...
  • 自然语言处理中/英文对比

    千次阅读 2019-03-19 21:55:24
    相应的自然语言处理(Natural Language Processing,NLP)技术因而被称为是“人工智能皇冠上的明珠”。 中国和美国作为AI应用的两个世界大国,在各自语言的自动化处理方面有一些独特之处。接下来笔者对...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,767
精华内容 14,306
关键字:

典型自然语言处理的基本思路