精华内容
下载资源
问答
  • NLP自然语言处理的经典题目,简单,基础,面试经常考的问题。
  • 停词库,包含一般性常用词。可用于R语言与python的自然语言处理中的词频、关键词分析。绘制词云效果也是比较不错的。
  • 本资源为tanxinxueyuan的NLP自然语言处理培训视频,及供大家学习交流使用。
  • 本书是一本全面系统地讲述计算机自然语言处理的优秀教材。本书英文版出版之后好评如潮,国外许多著名大学纷纷把本书选为自然语言处理和计算语言学课程的主要教材,该书被誉为该领域教材的“黄金标准”。本书包含的...
  • 自然语言处理的ppt,内容全,大家可自行下载
  • Stanza:斯坦福NLP自然语言处理Python工具包,NER有很大改进(支持中文) Stanza:适用于多种人类语言的 Python NLP 库 斯坦福 NLP 集团的官方 Python NLP 库。 它支持在 60 多种语言上运行各种准确的自然语言处理...
  • NLP自然语言处理

    2018-09-18 12:00:42
    自然语言处理的比较详细的教程了,本人看过了一遍,挺好。
  • spark-nlp:面向Spark的自然语言处理(NLP)库
  • NLP入门+实战必读,一文可以教会你最常见的10种自然语言处理技术(附代码)电子版
  • 自然语言处理NLP英文论文参考源
  • 在开发和生产中,最受欢迎的NLP库列表如下: Spark NLP spaCy NLTK OpenNLP Stanford CoreNLP 显然,NLP领域还有更多的库。但是,这些库更通用,涵盖更多功能,而不只是专注于特定用例。例如,gen
  • 包括地名词库/电视剧名/歌曲曲库/歌手/古今中外各界名人/国外明星/历史名人/流星网络小说/热门电影/政府机关团体机构/综艺等领域词库txt文件.
  • nlp自然语言处理论文精读
  • Python自然语言处理-BERT模型实战课程旨在帮助同学们快速掌握当下NLP领域最核心的算法模型BERT的原理构造与应用实例。通俗讲解BERT模型中所涉及的核心知识点(Transformer,self-attention等),基于google开源BERT...
  • 如何训练词向量_CBOW_算法_#3.2_(莫烦Python_NLP_自然语言处理教学)
  • 2016年国科大NLP自然语言处理)期末考试题,重点包括汉语分词的歧义问题,文法与自动机转换,机器翻译评价指标,Chart算法进行句法分析,朴素贝叶斯文本分类等等。
  • 1.1_NLP课程目标_#_(NLP自然语言处理教学)
  • Parsing-CFG(自然语言处理 NLP
  • 本章节主要研究内容:基于PyTorch 深度学习工具来完成短文本分类 知识点 业务需求 文本分类应用场景、技术方案以及挑战 技术架构 文本分析 词向量 CNN 原理 tensorboardX 可视化 项目实战: 基于TextCNN短文本分类,...
  • Techniques for building machine learning and neural network models for NLP.
  • ,精选的资源用于知识提炼,推荐系统,尤其是自然语言处理NLP)的资源清单 :small_blue_diamond: :small_blue_diamond: :small_blue_diamond: :small_blue_diamond: :small_blue_diamond: :small_blue...
  • 自然语言处理 用于golang中自然语言处理的选定机器学习算法的实现。 该软件包的主要重点是纯文本文档的统计语义,支持语义分析和语义相似文档的检索。 建立在软件包上,该软件包用于线性代数和科学计算,并从...
  • Spark NLP自然语言处理学习资料,包括分词、TF-IDF、文本聚类等。
  • NLP自然语言处理常用的Python库 及安装方法

    万次阅读 多人点赞 2018-12-14 14:59:31
    Natural Language Toolkit,自然语言处理工具包,在NLP领域中,最常使用的一个Python库。 安装:pip install nltk 2、Gensim 可以用来从文档中自劢提取语义主题。它包含了很多非监督学习算法如:TF/IDF,潜在语义...

    注意:以下pip命令都是在Anaconda prompt中运行的。因为使用anaconda来安装pyhon库时,它会自动解决各种依赖问题,方便快捷

    1、NLTK

    Natural Language Toolkit,自然语言处理工具包,在NLP领域中,最常使用的一个Python库。
    安装:pip install nltk

    2、Gensim

    可以用来从文档中自劢提取语义主题。它包含了很多非监督学习算法如:TF/IDF,潜在语义分析(Latent Semantic Analysis,LSA)、隐含狄利克雷分配(Latent Dirichlet Allocation,LDA),层次狄利克雷过程
    ( Hierarchical Dirichlet Processes ,HDP )等。它还支持Word2Vec,Doc2Vec等模型。
    安装:
    方法一: pip install gensim
    方法二:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载对应版本的whl文件,然后在命令行进入文件所在目录,输入:pip install **.whl 其中 ** 要替换为你的文件的文件名。

    3、Tensorflow

    这个东西是Google研发的,广泛用于深度学习领域。
    安装:pip install tensorflow

    或者先新建一个环境,然后再安装:
    第一步:创建一个名为 tensorflow 的新环境,并安装pip,python3.6,以及anaconda的基础包(包括numpy,pandas等)

    conda create -n tensorflow pip python=3.6 anaconda
    

    第二步:进入新建的环境(想要退回基础环境base时,输入:deactivate

    activate tensorflow
    

    第三步:输入以下命令安装tensorflow cpu版本:

    pip install --ignore-installed --upgrade tensorflow
    

    第四部(optional):在pycharm中想使用tensorflow时,需要将项目的interpreter修改为该环境中的python.exe,一般在安装目录下的envs文件夹中可以找到新建的环境,点进去就可以找到这个python.exe
    在这里插入图片描述

    4、Jieba

    广泛使用的中文分词工具,也可以用来做词性标注。
    项目地址:https://github.com/fxsjy/jieba
    安装:

    pip install jieba
    

    5、Stanford NLP

    支持中文、英文、阿拉伯语、法语、德语、西班牙语等多种语言
    Stanford NLP提供了一系列自然语言分析工具。它能够给出基本的词形,词性,不管是公司名还是人名等,格式化的日期,时间,量词,并且能够标记句子的结构,语法形式和字词依赖,指明那些名字指向同样的实体,指明情绪,提取发言中的开放关系等。

    安装:

    1. 安装stanford nlp自然语言处理包:pip install stanfordcorenlp

    2. 下载Stanford CoreNLP文件:https://stanfordnlp.github.io/CoreNLP/download.html
      在这里插入图片描述

    3. 下载中文模型jar包,https://stanfordnlp.github.io/CoreNLP/download.html
      在这里插入图片描述
      按图中Chinese 右边的那个链接。

    4. 将第二步中的zip文件解压(直接选择 “解压到当前文件夹”),然后将第三步中的jar包放到该文件夹中。这个文件夹随便放到什么地方都可以。
      在这里插入图片描述

    5. 现在第一步中安装的stanfordcorenlp就派上用场了。
      在python中要使用stanford nlp时,先写下面的语句:

    from stanfordcorenlp import StanfordCoreNLP
    nlp = StanfordCoreNLP(r'H:\stanford-corenlp-full-2018-10-05', lang='zh')
    

    需要将第二行中的路径换成你的文件夹路径。(我是直接将第四步中的文件夹放在了H盘中)
    听说stanfordcorenlp是用JAVA写的,所以可能要先配置JDK

    6、Hanlp

    Han Language Processing,汉语言处理包

    HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。

    功能:中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 新词发现 短语提取 自动摘要 文本分类 拼音简繁

    项目地址:https://github.com/hankcs/HanLP

    Hanlp环境安装

    • 安装Java和Visual C++:我装的是JDK 11.0.1(Java™ SE Development Kit 11.0.1)和Visual C++ 2015。
      安装方法请自行百度,各种教程多到不行
      附JDK 11.0.1下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html
      多说一句:网上某些地方说的JDK 1.8,其实就是JDK 8;安装完JDK后需要配置环境变量
    • 安裝Jpype,在anaconda promt中输入:conda install -c conda-forge jpype1
      Jpype是一个让我们可以通过python来运行Java代码的工具包
    • 测试是否按照成功:
    from jpype import *
    startJVM(getDefaultJVMPath(), "-ea")
    java.lang.System.out.println("Hello World")
    shutdownJVM()
    

    Hanlp安装

    • 下载hanlp-release.zip包: https://github.com/hankcs/HanLP
      在这里插入图片描述

    • 下载data.zip
      在这里插入图片描述

    • 对两个zip文件解压后,将第一个zip包中的三个文件放在data文件夹的同级目录中:
      在这里插入图片描述

    • 用Notepad++或其他编辑器,打开hanlp.properties,修改第一行,然后保存:
      在这里插入图片描述
      改为data文件夹的父目录。注意:该路径中最好不要有中文。如果你头铁,你就去试试咯
      注意斜杠方向!!!

    示例程序:
    将第三行代码中的两个路径换成你自己的路径,注意斜杠的方向

    # -*- coding:utf-8 -*-
    # 引入java的执行环境;Jpype是一个让我们可以通过python来运行Java代码的工具包
    from jpype import *
    
    # 启动JVM,Linux需替换分号;为冒号:
    startJVM(getDefaultJVMPath(), "-Djava.class.path=H:\software\hanlp\hanlp-1.7.0.jar;H:\software\hanlp",
             "-Xms1g",
             "-Xmx1g")  
    # 启动了JVM以后,就可以运行Java语句了
    
    print("=" * 30 + "HanLP分词" + "=" * 30)
    # 初始化一个Java类
    HanLP = JClass('com.hankcs.hanlp.HanLP')
    # 中文分词
    print(HanLP.segment('你好,欢迎在Python中调用HanLP的API'))
    print("-" * 70)
    
    print("=" * 30 + "标准分词" + "=" * 30)
    StandardTokenizer = JClass('com.hankcs.hanlp.tokenizer.StandardTokenizer')
    print(StandardTokenizer.segment('你好,欢迎在Python中调用HanLP的API'))
    print("-" * 70)
    
    # NLP分词NLPTokenizer会执行全部命名实体识别和词性标注
    print("=" * 30 + "NLP分词" + "=" * 30)
    NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
    print(NLPTokenizer.segment('中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程'))
    print("-" * 70)
    
    print("=" * 30 + "索引分词" + "=" * 30)
    IndexTokenizer = JClass('com.hankcs.hanlp.tokenizer.IndexTokenizer')
    termList = IndexTokenizer.segment("主副食品");
    for term in termList:
        print(str(term) + " [" + str(term.offset) + ":" + str(term.offset + len(term.word)) + "]")
    print("-" * 70)
    
    print("=" * 30 + " CRF分词" + "=" * 30)
    print("-" * 70)
    
    print("=" * 30 + " 极速词典分词" + "=" * 30)
    SpeedTokenizer = JClass('com.hankcs.hanlp.tokenizer.SpeedTokenizer')
    print(NLPTokenizer.segment('江西鄱阳湖干枯,中国最大淡水湖变成大草原'))
    print("-" * 70)
    
    print("=" * 30 + " 自定义分词" + "=" * 30)
    CustomDictionary = JClass('com.hankcs.hanlp.dictionary.CustomDictionary')
    CustomDictionary.add('攻城狮')
    CustomDictionary.add('单身狗')
    HanLP = JClass('com.hankcs.hanlp.HanLP')
    print(HanLP.segment('攻城狮逆袭单身狗,迎娶白富美,走上人生巅峰'))
    print("-" * 70)
    
    print("=" * 20 + "命名实体识别与词性标注" + "=" * 30)
    NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
    print(NLPTokenizer.segment('中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程'))
    print("-" * 70)
    
    document = "水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露," \
        "根据刚刚完成了水资源管理制度的考核,有部分省接近了红线的指标," \
               "有部分省超过红线的指标。对一些超过红线的地方,陈明忠表示,对一些取用水项目进行区域的限批," \
               "严格地进行水资源论证和取水许可的批准。"
    print("=" * 30 + "关键词提取" + "=" * 30)
    print(HanLP.extractKeyword(document, 8))
    print("-" * 70)
    
    print("=" * 30 + "自动摘要" + "=" * 30)
    print(HanLP.extractSummary(document, 3))
    print("-" * 70)
    
    
    text = r"算法工程师\n 算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法工程师就是利用算法处理事物的人。\n \n 1职位简介\n 算法工程师是一个非常高端的职位;\n 专业要求:计算机、电子、通信、数学等相关专业;\n 学历要求:本科及其以上的学历,大多数是硕士学历及其以上;\n 语言要求:英语要求是熟练,基本上能阅读国外专业书刊;\n 必须掌握计算机相关知识,熟练使用仿真工具MATLAB等,必须会一门编程语言。\n\n2研究方向\n 视频算法工程师、图像处理算法工程师、音频算法工程师 通信基带算法工程师\n \n 3目前国内外状况\n 目前国内从事算法研究的工程师不少,但是高级算法工程师却很少,是一个非常紧缺的专业工程师。算法工程师根据研究领域来分主要有音频/视频算法处理、图像技术方面的二维信息算法处理和通信物理层、雷达信号处理、生物医学信号处理等领域的一维信息算法处理。\n 在计算机音视频和图形图像技术等二维信息算法处理方面目前比较先进的视频处理算法:机器视觉成为此类算法研究的核心;另外还有2D转3D算法(2D-to-3D conversion),去隔行算法(de-interlacing),运动估计运动补偿算法(Motion estimation/Motion Compensation),去噪算法(Noise Reduction),缩放算法(scaling),锐化处理算法(Sharpness),超分辨率算法(Super Resolution),手势识别(gesture recognition),人脸识别(face recognition)。\n 在通信物理层等一维信息领域目前常用的算法:无线领域的RRM、RTT,传送领域的调制解调、信道均衡、信号检测、网络优化、信号分解等。\n 另外数据挖掘、互联网搜索算法也成为当今的热门方向。\n"
    print("=" * 30 + "短语提取" + "=" * 30)
    
    print(HanLP.extractPhrase(text, 10))
    print("-" * 70)
    
    shutdownJVM()
    

    输出:

    ==============================HanLP分词==============================
    [你好/vl, ,/w, 欢迎/v, 在/p, Python/nx, 中/f, 调用/v, HanLP/nx, 的/ude1, API/nx]
    ----------------------------------------------------------------------
    ==============================标准分词==============================
    [你好/vl, ,/w, 欢迎/v, 在/p, Python/nx, 中/f, 调用/v, HanLP/nx, 的/ude1, API/nx]
    ----------------------------------------------------------------------
    ==============================NLP分词==============================
    [中国科学院计算技术研究所/n, 的/u, 宗/n, 成庆/nr, 教授/n, 正在/d, 教授/n, 自然语言处理/v, 课程/n]
    ----------------------------------------------------------------------
    ==============================索引分词==============================
    主副食品/n [0:4]
    主副食/j [0:3]
    副食品/n [1:4]
    副食/n [1:3]
    食品/n [2:4]
    ----------------------------------------------------------------------
    ============================== CRF分词==============================
    ----------------------------------------------------------------------
    ============================== 极速词典分词==============================
    [江西/ns, 鄱阳湖/ns, 干枯/v, ,/w, 中国/ns, 最大/d, 淡水湖/Vg, 变成/v, 大/a, 草原/n]
    ----------------------------------------------------------------------
    ============================== 自定义分词==============================
    [攻城狮/nz, 逆袭/nz, 单身狗/nz, ,/w, 迎娶/v, 白富美/nr, ,/w, 走上/v, 人生/n, 巅峰/n]
    ----------------------------------------------------------------------
    ====================命名实体识别与词性标注==============================
    [中国科学院计算技术研究所/n, 的/u, 宗/n, 成庆/nr, 教授/n, 正在/d, 教授/n, 自然语言处理/v, 课程/n]
    ----------------------------------------------------------------------
    ==============================关键词提取==============================
    [水资源, 陈明忠, 进行, 红线, 部分, 项目, 用水, 国务院新闻办]
    ----------------------------------------------------------------------
    ==============================自动摘要==============================
    [严格地进行水资源论证和取水许可的批准, 水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露, 有部分省超过红线的指标]
    ----------------------------------------------------------------------
    ==============================短语提取==============================
    [算法工程师, 算法处理, 一维信息, 算法研究, 信号处理, 信息算法, 通信物理层, 处理算法, 视频算法, 互联网搜索算法]
    ----------------------------------------------------------------------
    JVM has been shutdown
    
    Process finished with exit code 0
    
    展开全文
  • jieba.NET是jieba中文分词的.NET版本(C#实现)。 当前版本为0.39.1,基于jieba 0.39,提供与jieba一致的功能与接口,以后可能会在jieba基础上提供其它扩展功能。
  • NLP自然语言处理简介

    千次阅读 2019-09-05 23:41:46
    作者:刘知远。清华大学计算机系副教授、博士生导师。...承担多项国家自然科学基金。曾获清华大学优秀博士学位论文、中国人工智能学会优秀博士学位论文、清华大学优秀博士后、中文信息学会青年创新奖...

    作者:刘知远。清华大学计算机系副教授、博士生导师。主要研究方向为表示学习、知识图谱和社会计算。2011年获得清华大学博士学位,已在ACL、IJCAI、AAAI等人工智能领域的著名国际期刊和会议发表相关论文60余篇,Google Scholar统计引用超过2700次。承担多项国家自然科学基金。曾获清华大学优秀博士学位论文、中国人工智能学会优秀博士学位论文、清华大学优秀博士后、中文信息学会青年创新奖,入选中国科学青年人才托举工程、CCF-Intel青年学者提升计划。担任中文信息学会青年工作委员会执委、副主任,中文信息学会社会媒体处理专委会委员、秘书,SCI期刊Frontiers of Computer Science青年编委,ACL、COLING、IJCNLP领域主席。

    自然语言处理(NLP)相关推荐书目:https://blog.csdn.net/sinat_26811377/article/details/100569632

    什么是自然语言处理

    简单地说,自然语言处理(Natural Language Processing,简称NLP)就是用计算机来处理、理解以及运用人类语言(如中文、英文等),它属于人工智能的一个分支,是计算机科学与语言学的交叉学科,又常被称为计算语言学。由于自然语言是人类区别于其他动物的根本标志。没有语言,人类的思维也就无从谈起,所以自然语言处理体现了人工智能的最高任务与境界,也就是说,只有当计算机具备了处理自然语言的能力时,机器才算实现了真正的智能。

    从研究内容来看,自然语言处理包括语法分析、语义分析、篇章理解等。从应用角度来看,自然语言处理具有广泛的应用前景。特别是在信息时代,自然语言处理的应用包罗万象,例如:机器翻译、手写体和印刷体字符识别、语音识别及文语转换、信息检索、信息抽取与过滤、文本分类与聚类、舆情分析和观点挖掘等,它涉及与语言处理相关的数据挖掘、机器学习、知识获取、知识工程、人工智能研究和与语言计算相关的语言学研究等。

    值得一提的是,自然语言处理的兴起与机器翻译这一具体任务有着密切联系。机器翻译指的是利用计算机自动地将一种自然语言翻译为另外一种自然语言。例如自动将英文“I like Beijing Tiananmen Square”翻译为“我爱北京天安门”,或者反过来将“我爱北京天安门”翻译为“I like Beijing Tiananmen Square”。由于人工进行翻译需要训练有素的双语专家,翻译工作非常耗时耗力。更不用说需要翻译一些专业领域文献时,还需要翻译者了解该领域的基本知识。世界上有超过几千种语言,而仅联合国的工作语言就有六种之多。如果能够通过机器翻译准确地进行语言间的翻译,将大大提高人类沟通和了解的效率。

    《圣经》里有一个故事说巴比伦人想建造一座塔直通天堂。建塔的人都说着同一种语言,心意相通、齐心协力。上帝看到人类竟然敢做这种事情,就让他们的语言变得不一样。因为人们听不懂对方在讲什么,于是大家整天吵吵闹闹,无法继续建塔。后来人们把这座塔叫作巴别塔,而“巴别”的意思就是“分歧”。虽然巴别塔停建了,但一个梦想却始终萦绕在人们心中:人类什么时候才能拥有相通的语言,重建巴别塔呢?机器翻译被视为“重建巴别塔”的伟大创举。假如能够实现不同语言之间的机器翻译,我们就可以理解世界上任何人说的话,与他们进行交流和沟通,再也不必为相互不能理解而困扰。

    事实上,“人工智能”被作为一个研究问题正式提出来的时候,创始人把计算机国际象棋和机器翻译作为两个标志性的任务,认为只要国际象棋系统能够打败人类世界冠军,机器翻译系统达到人类翻译水平,就可以宣告人工智能的胜利。四十年后的1997年,IBM公司的深蓝超级计算机已经能够打败国际象棋世界冠军卡斯帕罗夫。而机器翻译到现在仍无法与人类翻译水平相比,从此可以看出自然语言处理有多么困难!

    自然语言处理兴起于美国。第二次世界大战之后,二十世纪五十年代,当电子计算机还在襁褓之中时,利用计算机处理人类语言的想法就已经出现。当时,美国希望能够利用计算机将大量俄语材料自动翻译成英语,以窥探苏联科技的最新发展。研究者从破译军事密码中得到启示,认为不同的语言只不过是对“同一语义”的不同编码而已,从而想当然地认为可以采用译码技术像破译密码一样“破译”这些语言。

    1954年1月7日,美国乔治敦大学和IBM公司合作实验成功地将超过60句俄语自动翻译成英语。虽然当时的这个机器翻译系统非常简单,仅仅包含6个语法规则和250个词,但由于媒体的广泛报道,纷纷认为这是一个巨大的进步,导致美国政府备受鼓舞,加大了对自然语言处理研究的投资。实验完成者也当即自信地撰文称,在三到五年之内就能够完全解决从一种语言到另一种语言的自动翻译问题。他们认为只要制定好各种翻译规则,通过大量规则的堆砌就能够完美地实现语言间的自动翻译。

    然而,事实是理解人类语言远比破译密码要复杂得多,因此研究进展非常缓慢。1966年的一份研究报告总结发现,经过十年之久的研究,结果远远未能达到预期,因此支持资金急剧下降,使自然语言处理(特别是机器翻译)的研究陷入长达二十年的低潮。直到二十世纪八十年代,随着电子计算机的计算能力的飞速提高和制造成本的大幅下降,研究者又开始重新关注自然语言处理这个极富挑战的研究领域。三十年沧海桑田,此时研究者已经认识到简单的语言规则的堆砌无法实现对人类语言的真正理解。研究发现,通过对大量的文本数据的自动学习和统计,能够更好地解决自然语言处理问题,如语言的自动翻译。这一思想被称为自然语言处理的统计学习模型,至今方兴未艾。

    那么,自然语言处理到底存在哪些主要困难或挑战,吸引那么多研究者几十年如一日孜孜不倦地探索解决之道呢?

     

    自然语言处理的主要困难

    自然语言处理的困难可以罗列出来很多,不过关键在于消除歧义问题,如词法分析、句法分析、语义分析等过程中存在的歧义问题,简称为消歧。而正确的消歧需要大量的知识,包括语言学知识(如词法、句法、语义、上下文等)和世界知识(与语言无关)。这带来自然语言处理的两个主要困难。

    首先,语言中充满了大量的歧义,这主要体现在词法、句法及语义三个层次上。歧义的产生是由于自然语言所描述的对象――人类活动非常复杂,而语言的词汇和句法规则又是有限的,这就造成同一种语言形式可能具有多种含义。

    例如单词定界问题是属于词法层面的消歧任务。在口语中,词与词之间通常是连贯说出来的。在书面语中,中文等语言也没有词与词之间的边界。由于单词是承载语义的最小单元,要解决自然语言处理,单词的边界界定问题首当其冲。特别是中文文本通常由连续的字序列组成,词与词之间缺少天然的分隔符,因此中文信息处理比英文等西方语言多一步工序,即确定词的边界,我们称为“中文自动分词”任务。通俗的说就是要由计算机在词与词之间自动加上分隔符,从而将中文文本切分为独立的单词。例如一个句子“今天天气晴朗”的带有分隔符的切分文本是“今天|天气|晴朗”。中文自动分词处于中文自然语言处理的底层,是公认的中文信息处理的第一道工序,扮演着重要的角色,主要存在新词发现和歧义切分等问题。我们注意到:正确的单词切分取决于对文本语义的正确理解,而单词切分又是理解语言的最初的一道工序。这样的一个“鸡生蛋、蛋生鸡”的问题自然成了(中文)自然语言处理的第一条拦路虎。

    其他级别的语言单位也存在着各种歧义问题。例如在短语级别上,“进口彩电”可以理解为动宾关系(从国外进口了一批彩电),也可以理解为偏正关系(从国外进口的彩电)。又如在句子级别上,“做手术的是她的父亲”可以理解为她父亲生病了需要做手术,也可以理解为她父亲是医生,帮别人做手术。总之,同样一个单词、短语或者句子有多种可能的理解,表示多种可能的语义。如果不能解决好各级语言单位的歧义问题,我们就无法正确理解语言要表达的意思。

    另外一个方面,消除歧义所需要的知识在获取、表达以及运用上存在困难。由于语言处理的复杂性,合适的语言处理方法和模型难以设计。

    例如上下文知识的获取问题。在试图理解一句话的时候,即使不存在歧义问题,我们也往往需要考虑上下文的影响。所谓的“上下文”指的是当前所说这句话所处的语言环境,例如说话人所处的环境,或者是这句话的前几句话或者后几句话,等等。假如当前这句话中存在指代词的时候,我们需要通过这句话前面的句子来推断这个指代词是指的什么。我们以“小明欺负小亮,因此我批评了他”为例。在其中的第二句话中的“他”是指代“小明”还是“小亮”呢?要正确理解这句话,我们就要理解上句话“小明欺负小亮”意味着“小明”做得不对,因此第二句中的“他”应当指代的是“小明”。由于上下文对于当前句子的暗示形式是多种多样的,因此如何考虑上下文影响问题是自然语言处理中的主要困难之一。

    再如背景知识问题。 正确理解人类语言还要有足够的背景知识。举一个简单的例子,在机器翻译研究的初期,人们经常举一个例子来说明机器翻译任务的艰巨性。在英语中“The spirit is willing but the flesh is weak.”,意思是“心有余而力不足”。但是当时的某个机器翻译系统将这句英文翻译到俄语,然后再翻译回英语的时候,却变成了“The Voltka is strong but the meat is rotten.”,意思是“伏特加酒是浓的,但肉却腐烂了”。从字面意义上看,“spirit”(烈性酒)与“Voltka”(伏特加)对译似无问题,而“flesh”和“meat”也都有肉的意思。那么这两句话在意义上为什么会南辕北辙呢?关键的问题就在于在翻译的过程中,机器翻译系统对于英语成语并无了解,仅仅是从字面上进行翻译,结果自然失之毫厘,差之千里。

    从上面的两个方面的主要困难,我们看到自然语言处理这个难题的根源就是人类语言的复杂性和语言描述的外部世界的复杂性。人类语言承担着人类表达情感、交流思想、传播知识等重要功能,因此需要具备强大的灵活性和表达能力,而理解语言所需要的知识又是无止境的。那么目前人们是如何尝试进行自然语言处理的呢?

     

    自然语言处理的发展趋势

    目前,人们主要通过两种思路来进行自然语言处理,一种是基于规则的理性主义,另外一种是基于统计的经验主义。理性主义方法认为,人类语言主要是由语言规则来产生和描述的,因此只要能够用适当的形式将人类语言规则表示出来,就能够理解人类语言,并实现语言之间的翻译等各种自然语言处理任务。而经验主义方法则认为,从语言数据中获取语言统计知识,有效建立语言的统计模型。因此只要能够有足够多的用于统计的语言数据,就能够理解人类语言。然而,当面对现实世界充满模糊与不确定性时,这两种方法都面临着各自无法解决的问题。例如,人类语言虽然有一定的规则,但是在真实使用中往往伴随大量的噪音和不规范性。理性主义方法的一大弱点就是鲁棒性差,只要与规则稍有偏离便无法处理而对于经验主义方法而言,又不能无限地获取语言数据进行统计学习,因此也不能够完美地理解人类语言。二十世纪八十年代以来的趋势就是,基于语言规则的理性主义方法不断受到质疑,大规模语言数据处理成为目前和未来一段时期内自然语言处理的主要研究目标。统计学习方法越来越受到重视,自然语言处理中越来越多地使用机器自动学习的方法来获取语言知识。

    迈进21世纪,我们已经进入了以互联网为主要标志的海量信息时代,这些海量信息大部分是以自然语言表示的。一方面,海量信息也为计算机学习人类语言提供了更多的“素材”,另一方面,这也为自然语言处理提供了更加宽广的应用舞台。例如,作为自然语言处理的重要应用,搜索引擎逐渐成为人们获取信息的重要工具,涌现出以百度、谷歌等为代表的搜索引擎巨头;机器翻译也从实验室走入寻常百姓家,谷歌、百度等公司都提供了基于海量网络数据的机器翻译和辅助翻译工具;基于自然语言处理的中文(输入法如搜狗、微软、谷歌等输入法)成为计算机用户的必备工具;带有语音识别的计算机和手机也正大行其道,协助用户更有效地工作学习。总之,随着互联网的普及和海量信息的涌现,自然语言处理正在人们的日常生活中扮演着越来越重要的作用。然而,面向海量的大规模文本数据,人们面临的一个严峻事实是,如何有效利用海量信息,人们逐渐意识到,单纯依靠统计方法已经无法快速有效地从海量数据中学习语言知识。

    随着2013年word2vec技术的发表,以神经网络为基础的深度学习技术开始在自然语言处理中广泛使用,深度学习的分布式语义表示和多层网络架构具有强大的拟合和学习能力,显著提升了自然语言处理各种任务的性能,成为现阶段自然语言处理的主要技术方案。

    深度学习是纯的数据驱动技术方案,需要从大规模标注数据中学习特定任务相关的复杂模式。一方面,有些学者开始探索面向大规模无标注文本数据的深度学习模型,如ELMo,GPT、BERT等,可以看做从大规模数据中学习知识的极致探索;另一方面,现有深度学习技术尚未考虑人类积累的丰富知识(包括语言知识、世界知识、常识知识、认知知识、行业知识等),如果将深度学习看做经验主义方法,将符号知识看做理性主义方法,那么如何充分发挥基于规则的理性主义方法和基于统计的经验主义方法的优势,两者互相补充,更好、更快地进行自然语言处理,仍然是我们需要探索的重要课题。

    自然语言处理作为一个年龄尚不足一个世纪的新兴学科,正在进行着突飞猛进的发展。回顾自然语言处理的发展历程,并不是一帆风顺,有过低谷,也有过高潮。而现在我们正面临着新的挑战和机遇。例如,目前网络搜索引擎基本上还停留在关键词匹配,缺乏深层次的自然语言处理和理解。语音识别、文字识别、问答系统、机器翻译等目前也只能达到很基本的水平。路漫漫其修远兮,自然语言处理作为一个高度交叉的新兴学科,不论是探究自然本质还是付诸实际应用,在将来必定会有令人期待的惊喜和异常快速的发展。

    1. 信息抽取:从给定文本中抽取重要的信息,比如时间、地点、人物、事件、原因、结果、数字、日期、货币、专有名词等等。通俗说来,就是要了解谁在什么时候、什么原因、对谁、做了什么事、有什么结果。
    2. 文本生成:机器像人一样使用自然语言进行表达和写作。依据输入的不同,文本生成技术主要包括数据到文本生成和文本到文本生成。数据到文本生成是指将包含键值对的数据转化为自然语言文本;文本到文本生成对输入文本进行转化和处理从而产生新的文本。
    3. 问答系统:对一个自然语言表达的问题,由问答系统给出一个精准的答案。需要对自然语言查询语句进行某种程度的语义分析,包括实体链接、关系识别,形成逻辑表达式,然后到知识库中查找可能的候选答案并通过一个排序机制找出最佳的答案。
    4. 对话系统:系统通过一系列的对话,跟用户进行聊天、回答、完成某一项任务。涉及到用户意图理解、通用聊天引擎、问答引擎、对话管理等技术。此外,为了体现上下文相关,要具备多轮对话能力。
    5. 文本挖掘:包括文本聚类、分类、情感分析以及对挖掘的信息和知识的可视化、交互式的表达界面。目前主流的技术都是基于统计机器学习的。
    6. 语音识别和生成:语音识别是将输入计算机的语音符号识别转换成书面语表示。语音生成又称文语转换、语音合成,它是指将书面文本自动转换成对应的语音表征。
    7. 信息过滤:通过计算机系统自动识别和过滤符合特定条件的文档信息。通常指网络有害信息的自动识别和过滤,主要用于信息安全和防护,网络内容管理等。
    8. 舆情分析:是指收集和处理海量信息,自动化地对网络舆情进行分析,以实现及时应对网络舆情的目的。
    9. 信息检索:对大规模的文档进行索引。可简单对文档中的词汇,赋之以不同的权重来建立索引,也可建立更加深层的索引。在查询的时候,对输入的查询表达式比如一个检索词或者一个句子进行分析,然后在索引里面查找匹配的候选文档,再根据一个排序机制把候选文档排序,最后输出排序得分最高的文档。
    10. 机器翻译:把输入的源语言文本通过自动翻译获得另外一种语言的文本。机器翻译从最早的基于规则的方法到二十年前的基于统计的方法,再到今天的基于神经网络(编码-解码)的方法,逐渐形成了一套比较严谨的方法体系。

    与计算机视觉(CV)相比,自然语言处理有什么特点

    从图像和语言两种模态来看,对文本处理技术的大规模应用要早于计算机视觉。将图像和语言中的处理对象做一个不太严谨的对应。如下图所示,大体上像素类似于语言中的字母;图像中的对象类似于语言中的单词/概念;图像中对象组成的场景类似于语言中的句子表达的语义;视频则类似于语言中的篇章(文章)。

     

    在这种类比下看,NLP/IR在单词层面的处理要比CV中的图像识别简单得多,只需要做一下tokenization、lemmatization、stemming等(中文复杂一些需要额外做自动分词),就可以利用关键词匹配完成很多任务,例如信息检索、文本分类、拼写纠错、情感分析、关键词提取等等,实际上已经得到非常广泛的应用,如搜索引擎、拼音输入法、新闻分类、阅读推荐等。

    而由于图像中对象的复杂性和多样性,仅在对象识别层面,甚至特定的人脸识别,还有很多技术挑战。只不过是近年来,由于深度学习对非结构数据的强大表示和学习能力,开始让对象识别走向了实用化。

    而进入到更高层面,例如面向图像的场景图构建,面向文本的句法语义分析,都需要对复杂语境(上下文)的精准而强大的建模能力。所以我感觉,并非NLP发展缓慢,只是两个领域的发展节奏和阶段不同。进入高层任务后,两个领域都将面临共同的关键挑战,都可以归结为复杂语境下的多对象(图像中是不同对象,文本中是不同概念)的语义组合问题。

     

    中文NLP vs 英文NLP在理论、处理上有什么相同和不同, 尤其是中文 NLP有什么独特之处

    从实用文本分析技术而言,如果只做主题聚类、文本分类等任务的话,中英文最大差别就在于,中文需要做自动分词,相关工具包已经很多了,包括题主提到的Jieba,还有哈工大的LTP,北理工的ICTCLAS,还有我们组研制的THULAC。当然,在文本分类时,到底是选词还是Ngram作为特征,在SVM+BOW时代曾是个问题。进入到深度学习时代,就直接可以用基于字的神经网络模型了。

    从NLP研究角度而言,中英文在词性标注、句法分析等任务上颇有差异。主要体现在英语有明显的屈折变化(单复数、时态等)而汉语缺少这些屈折变化,亦即有学者总结的“汉语重义合,英语重形合”。所以,英语里一个词被标为动词还是名词,没有太多争议;汉语里一个词应该被标为动词还是名词,例如“热爱学习”、“劳动光荣”中的“学习”、“劳动”如果按照英文语法规范应当标注为名词。著名语言学家沈家煊先生就曾提出“汉语动词和名词不分立”的理论。在句法分析层面汉语也有一些自己的特点,具体需要请教专业的语言学家解答了。

    中英文相关分析任务的错误率问题。之所以在一些任务上中文分析性能显著低于英文,除了中文缺少屈者变化、有更多自由度从而提升了分析难度的原因外,中文标注资源相对较少、标注质量相对较低也是关键原因之一。语言资源标注既需要语言学家和计算机学者的通力合作,需要花费大量精力和时间,在国内环境下太费力不讨好了,希望未来会有改观。

    从更广阔的语言研究角度而言,中英由于各自承载了两种截然不同的人类群体的文化信息,所以在更深层的文化内涵会有更明显的分野,例如两种语言的词汇联想网络、隐喻风格等,可能会有更大的不同。也许在NLP技术日渐成熟之后,我们可以透过语言更加定量地分析两种不同文化的差异。

    展开全文
  • NLP自然语言处理步骤1.数据收集(建立语料库)1.1.利用已有数据1.2.爬取数据2.数据处理2.1.数据读取(语料)2.2.数据清洗(去掉标点符号(空格、句号、逗号、问好、引号等)等)2.3.分词(token)文章样本集中的句子...

    NLP自然语言处理步骤

    未完待续。。。

    1.数据收集(建立语料库)

    1.1.利用已有数据
    1.2.爬取数据
    2.数据处理
    2.1.数据读取(语料)
    2.2.数据清洗(去掉标点符号(空格、句号、逗号、问好、引号等)等)
    2.3.分词(token)
    文章样本集中的句子分解成单个单词。
    输入:文章(例如:莎士比亚全集、尼采全集、唐诗300首等)
    输出:词集合(可以有重复词)

    2.4.词频统计

    计算词集合中,每个样本(词)出现的次数。
    输入: 词集合(可以有重复词)

    输出:词频表(key为词,值为词的出现次数)

    可根据实际项目需求,删除高频词(例如常用词the、a、is等出现次数比较多,但没有实际意义)和低频词。

    2.5.字母小写
    2.6.编号替换

    用2.4中的词编号替换语料库中的词。

    备注:有些情况下,使用词频作为词的编号。

    例如
    test.txt中
    A B C D  A B  A   
    替换后:
    3 2 1 1 3 2 3
    2.7.句子截取

     句子长度截取为规定长度,不足补规定字符(例如0)


    3.模型搭建


    4.模型训练


    实例说明(简单实例,方便理解,实际项目更复杂):

    text.txt文件(内容)2.1
    A ,B’ c.D A B A E F G

    text.txt文件 ( 对应词集合,text.txt中单词已经存入到一个词集合中)2.2
    A B c D A B A E F G

    注意:字母之间不是空格了,表示分开

    text.txt文件 对应词集合2.3
    A
    B
    C
    D
    A
    B
    A
    E
    F

    G

    text.txt文件 对应词集合2.4
    Key(词) value(词在语料库出现次数)
    A                 3
    B                 2
    C                 1
    D                 1
    E                 1
    F                 1

    G                 1 

    根据以上集合,可以建立一个词矩阵

    one-hot列构成了一个词向量的矩阵,实际项目中可能根据需要删除词频较低的词,例如,可以删除C-G行

    text.txt文件 对应词集合(字母小写)2.5
    a 3
    b 2
    c 1
    d 1
    e 1
    f 1
    g 1 

    text.txt文件 2.6
    3 2 1 1 3 2 3 1 1 1

    text.txt文件2.7 读取第一个句子处理后 句子长度为5
    3 2 1 1 3

    text.txt文件2.7  读取第一个句子处理后 句子长度为15(不足15用0补齐)
    3 2 1 1 3 2 3 1 1 1 0 0 0 0 0
    展开全文
  • 文件中包含:(代码+分析) 1.最小编辑距离 2.文本分类 3.文本聚类 4.文本对齐
  • [NLP自然语言处理]谷歌BERT模型深度解析

    万次阅读 多人点赞 2018-10-15 17:49:18
    BERT目前已经刷新的11项自然语言处理任务的最新记录包括:将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%),将SQuAD v1.1问答测试F1得分纪录刷新为93.2分(绝对提升1.5分),...

    任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~

     

    BERT模型代码已经发布,可以在我的github: NLP-BERT--Python3.6-pytorch 中下载,请记得start哦


    目录

    一、前言

    二、如何理解BERT模型

    三、BERT模型解析

          论文的核心:详解BERT模型架构

          关键创新:预训练任务

          实验结果

    四、BERT模型的影响

    对BERT模型的观点

    参考文献


    一、前言

     

    最近谷歌搞了个大新闻,公司AI团队新发布的BERT模型,在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类,并且还在11种不同NLP测试中创出最佳成绩,包括将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%)等。可以预见的是,BERT将为NLP带来里程碑式的改变,也是NLP领域近期最重要的进展。

    Rank

    谷歌团队的Thang Luong直接定义:BERT模型开启了NLP的新时代!

    从现在的大趋势来看,使用某种模型预训练一个语言模型看起来是一种比较靠谱的方法。从之前AI2的 ELMo,到 OpenAI的fine-tune transformer,再到Google的这个BERT,全都是对预训练的语言模型的应用。

    BERT这个模型与其它两个不同的是

    1. 它在训练双向语言模型时以减小的概率把少量的词替成了Mask或者另一个随机的词。我个人感觉这个目的在于使模型被迫增加对上下文的记忆。至于这个概率,我猜是Jacob拍脑袋随便设的。
    2. 增加了一个预测下一句的loss。这个看起来就比较新奇了。

    BERT模型具有以下两个特点:

    第一,是这个模型非常的深,12层,并不宽(wide),中间层只有1024,而之前的Transformer模型中间层有2048。这似乎又印证了计算机图像处理的一个观点——深而窄 比 浅而宽 的模型更好。

    第二,MLM(Masked Language Model),同时利用左侧和右侧的词语,这个在ELMo上已经出现了,绝对不是原创。其次,对于Mask(遮挡)在语言模型上的应用,已经被Ziang Xie提出了(我很有幸的也参与到了这篇论文中):[1703.02573] Data Noising as Smoothing in Neural Network Language Models。这也是篇巨星云集的论文:Sida Wang,Jiwei Li(香侬科技的创始人兼CEO兼史上发文最多的NLP学者),Andrew Ng,Dan Jurafsky都是Coauthor。但很可惜的是他们没有关注到这篇论文。用这篇论文的方法去做Masking,相信BRET的能力说不定还会有提升。

     

    二、如何理解BERT模型

    [1] BERT 要解决什么问题?

    通常情况 transformer 模型有很多参数需要训练。譬如 BERT BASE 模型: L=12, H=768, A=12, 需要训练的模型参数总数是 12 * 768 * 12 = 110M。这么多参数需要训练,自然需要海量的训练语料。如果全部用人力标注的办法,来制作训练数据,人力成本太大。

    受《A Neural Probabilistic Language Model》论文的启发,BERT 也用 unsupervised 的办法,来训练 transformer 模型。神经概率语言模型这篇论文,主要讲了两件事儿,1. 能否用数值向量(word vector)来表达自然语言词汇的语义?2. 如何给每个词汇,找到恰当的数值向量?

    Transformer

    这篇论文写得非常精彩,深入浅出,要言不烦,而且面面俱到。经典论文,值得反复咀嚼。很多同行朋友都熟悉这篇论文,内容不重复说了。常用的中文汉字有 3500 个,这些字组合成词汇,中文词汇数量高达 50 万个。假如词向量的维度是 512,那么语言模型的参数数量,至少是 512 * 50万 = 256M

    模型参数数量这么大,必然需要海量的训练语料。从哪里收集这些海量的训练语料?《A Neural Probabilistic Language Model》这篇论文说,每一篇文章,天生是训练语料。难道不需要人工标注吗?回答,不需要。

    我们经常说,“说话不要颠三倒四,要通顺,要连贯”,意思是上下文的词汇,应该具有语义的连贯性。基于自然语言的连贯性,语言模型根据前文的词,预测下一个将出现的词。如果语言模型的参数正确,如果每个词的词向量设置正确,那么语言模型的预测,就应该比较准确。天下文章,数不胜数,所以训练数据,取之不尽用之不竭。

    深度学习四大要素,1. 训练数据、2. 模型、3. 算力、4. 应用。训练数据有了,接下去的问题是模型。

     

    [2] BERT 的五个关键词 Pre-training、Deep、Bidirectional、Transformer、Language Understanding 分别是什么意思?

    《A Neural Probabilistic Language Model》这篇论文讲的 Language Model,严格讲是语言生成模型(Language Generative Model),预测语句中下一个将会出现的词汇。语言生成模型能不能直接移用到其它 NLP 问题上去?

    譬如,淘宝上有很多用户评论,能否把每一条用户转换成评分?-2、-1、0、1、2,其中 -2 是极差,+2 是极好。假如有这样一条用户评语,“买了一件鹿晗同款衬衫,没想到,穿在自己身上,不像小鲜肉,倒像是厨师”,请问这条评语,等同于 -2,还是其它?

    语言生成模型,能不能很好地解决上述问题?进一步问,有没有 “通用的” 语言模型,能够理解语言的语义,适用于各种 NLP 问题?BERT 这篇论文的题目很直白,《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》,一眼看去,就能猜得到这篇文章会讲哪些内容。

    这个题目有五个关键词,分别是 Pre-training、Deep、Bidirectional、Transformers、和 Language Understanding。其中 pre-training 的意思是,作者认为,确实存在通用的语言模型,先用文章预训练通用模型,然后再根据具体应用,用 supervised 训练数据,精加工(fine tuning)模型,使之适用于具体应用。为了区别于针对语言生成的 Language Model,作者给通用的语言模型,取了一个名字,叫语言表征模型 Language Representation Model。

    能实现语言表征目标的模型,可能会有很多种,具体用哪一种呢?作者提议,用 Deep Bidirectional Transformers 模型。假如给一个句子 “能实现语言表征[mask]的模型”,遮盖住其中“目标”一词。从前往后预测[mask],也就是用“能/实现/语言/表征”,来预测[mask];或者,从后往前预测[mask],也就是用“模型/的”,来预测[mask],称之为单向预测 unidirectional。单向预测,不能完整地理解整个语句的语义。于是研究者们尝试双向预测。把从前往后,与从后往前的两个预测,拼接在一起 [mask1/mask2],这就是双向预测 bi-directional。细节参阅《Neural Machine Translation by Jointly Learning to Align and Translate》。

    BERT 的作者认为,bi-directional 仍然不能完整地理解整个语句的语义,更好的办法是用上下文全向来预测[mask],也就是用 “能/实现/语言/表征/../的/模型”,来预测[mask]。BERT 作者把上下文全向的预测方法,称之为 deep bi-directional。如何来实现上下文全向预测呢?BERT 的作者建议使用 Transformer 模型。这个模型由《Attention Is All You Need》一文发明。

    这个模型的核心是聚焦机制,对于一个语句,可以同时启用多个聚焦点,而不必局限于从前往后的,或者从后往前的,序列串行处理。不仅要正确地选择模型的结构,而且还要正确地训练模型的参数,这样才能保障模型能够准确地理解语句的语义。BERT 用了两个步骤,试图去正确地训练模型的参数。第一个步骤是把一篇文章中,15% 的词汇遮盖,让模型根据上下文全向地预测被遮盖的词。假如有 1 万篇文章,每篇文章平均有 100 个词汇,随机遮盖 15% 的词汇,模型的任务是正确地预测这 15 万个被遮盖的词汇。通过全向预测被遮盖住的词汇,来初步训练 Transformer 模型的参数。然后,用第二个步骤继续训练模型的参数。譬如从上述 1 万篇文章中,挑选 20 万对语句,总共 40 万条语句。挑选语句对的时候,其中 2*10 万对语句,是连续的两条上下文语句,另外 2*10 万对语句,不是连续的语句。然后让 Transformer 模型来识别这 20 万对语句,哪些是连续的,哪些不连续。

    这两步训练合在一起,称为预训练 pre-training。训练结束后的 Transformer 模型,包括它的参数,是作者期待的通用的语言表征模型。

     

    三、BERT模型解析

    首先来看下谷歌AI团队做的这篇论文。

    BERT的新语言表示模型,它代表Transformer的双向编码器表示。与最近的其他语言表示模型不同,BERT旨在通过联合调节所有层中的上下文来预先训练深度双向表示。因此,预训练的BERT表示可以通过一个额外的输出层进行微调,适用于广泛任务的最先进模型的构建,比如问答任务和语言推理,无需针对具体任务做大幅架构修改。

    论文作者认为现有的技术严重制约了预训练表示的能力。其主要局限在于标准语言模型是单向的,这使得在模型的预训练中可以使用的架构类型很有限。

    在论文中,作者通过提出BERT:即Transformer的双向编码表示来改进基于架构微调的方法。

    BERT 提出一种新的预训练目标:遮蔽语言模型(masked language model,MLM),来克服上文提到的单向性局限。MLM 的灵感来自 Cloze 任务(Taylor, 1953)。MLM 随机遮蔽模型输入中的一些 token,目标在于仅基于遮蔽词的语境来预测其原始词汇 id。

    与从左到右的语言模型预训练不同,MLM 目标允许表征融合左右两侧的语境,从而预训练一个深度双向 Transformer。除了遮蔽语言模型之外,本文作者还引入了一个“下一句预测”(next sentence prediction)任务,可以和MLM共同预训练文本对的表示。

    论文的主要贡献在于:

    • 证明了双向预训练对语言表示的重要性。与之前使用的单向语言模型进行预训练不同,BERT使用遮蔽语言模型来实现预训练的深度双向表示。
    • 论文表明,预先训练的表示免去了许多工程任务需要针对特定任务修改体系架构的需求。 BERT是第一个基于微调的表示模型,它在大量的句子级和token级任务上实现了最先进的性能,强于许多面向特定任务体系架构的系统。
    • BERT刷新了11项NLP任务的性能记录。本文还报告了 BERT 的模型简化研究(ablation study),表明模型的双向性是一项重要的新成果。相关代码和预先训练的模型将会公布在goo.gl/language/bert上。

    BERT目前已经刷新的11项自然语言处理任务的最新记录包括:将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%),将SQuAD v1.1问答测试F1得分纪录刷新为93.2分(绝对提升1.5分),超过人类表现2.0分。

    论文的核心:详解BERT模型架构

    本节介绍BERT模型架构和具体实现,并介绍预训练任务,这是这篇论文的核心创新。

    模型架构

    BERT的模型架构是基于Vaswani et al. (2017) 中描述的原始实现multi-layer bidirectional Transformer编码器,并在tensor2tensor库中发布。由于Transformer的使用最近变得无处不在,论文中的实现与原始实现完全相同,因此这里将省略对模型结构的详细描述。

    在这项工作中,论文将层数(即Transformer blocks)表示为L,将隐藏大小表示为H,将self-attention heads的数量表示为A。在所有情况下,将feed-forward/filter 的大小设置为 4H,即H = 768时为3072,H = 1024时为4096。论文主要报告了两种模型大小的结果:

    • BERT_{BASE} : L=12, H=768, A=12, Total Parameters=110M
    • BERT_{LARGE} : L=24, H=1024, A=16, Total Parameters=340M

    为了进行比较,论文选择了 BERT_{LARGE} ,它与OpenAI GPT具有相同的模型大小。然而,重要的是,BERT Transformer 使用双向self-attention,而GPT Transformer 使用受限制的self-attention,其中每个token只能处理其左侧的上下文。研究团队注意到,在文献中,双向 Transformer 通常被称为“Transformer encoder”,而左侧上下文被称为“Transformer decoder”,因为它可以用于文本生成。BERT,OpenAI GPT和ELMo之间的比较如图1所示。

    图1:预训练模型架构的差异。BERT使用双向Transformer。OpenAI GPT使用从左到右的Transformer。ELMo使用经过独立训练的从左到右和从右到左LSTM的串联来生成下游任务的特征。三个模型中,只有BERT表示在所有层中共同依赖于左右上下文。

    输入表示(input representation)

    论文的输入表示(input representation)能够在一个token序列中明确地表示单个文本句子或一对文本句子(例如, [Question, Answer])。对于给定token,其输入表示通过对相应的tokensegmentposition embeddings进行求和来构造。图2是输入表示的直观表示:

    图2:BERT输入表示。输入嵌入是token embeddings, segmentation embeddings 和position embeddings 的总和。

    具体如下:

    • 使用WordPiece嵌入(Wu et al., 2016)和30,000个token的词汇表。用##表示分词。
    • 使用学习的positional embeddings,支持的序列长度最多为512个token。
    • 每个序列的第一个token始终是特殊分类嵌入([CLS])。对应于该token的最终隐藏状态(即,Transformer的输出)被用作分类任务的聚合序列表示。对于非分类任务,将忽略此向量。
    • 句子对被打包成一个序列。以两种方式区分句子。首先,用特殊标记([SEP])将它们分开。其次,添加一个learned sentence A嵌入到第一个句子的每个token中,一个sentence B嵌入到第二个句子的每个token中。
    • 对于单个句子输入,只使用 sentence A嵌入。

    关键创新:预训练任务

    与Peters et al. (2018) 和 Radford et al. (2018)不同,论文不使用传统的从左到右或从右到左的语言模型来预训练BERT。相反,使用两个新的无监督预测任务对BERT进行预训练。

    任务1: Masked LM

    从直觉上看,研究团队有理由相信,深度双向模型比left-to-right 模型或left-to-right and right-to-left模型的浅层连接更强大。遗憾的是,标准条件语言模型只能从左到右或从右到左进行训练,因为双向条件作用将允许每个单词在多层上下文中间接地“see itself”。

    为了训练一个深度双向表示(deep bidirectional representation),研究团队采用了一种简单的方法,即随机屏蔽(masking)部分输入token,然后只预测那些被屏蔽的token。论文将这个过程称为“masked LM”(MLM),尽管在文献中它经常被称为Cloze任务(Taylor, 1953)。

    在这个例子中,与masked token对应的最终隐藏向量被输入到词汇表上的输出softmax中,就像在标准LM中一样。在团队所有实验中,随机地屏蔽了每个序列中15%的WordPiece token。与去噪的自动编码器(Vincent et al., 2008)相反,只预测masked words而不是重建整个输入。

    虽然这确实能让团队获得双向预训练模型,但这种方法有两个缺点。首先,预训练和finetuning之间不匹配,因为在finetuning期间从未看到[MASK]token。为了解决这个问题,团队并不总是用实际的[MASK]token替换被“masked”的词汇。相反,训练数据生成器随机选择15%的token。例如在这个句子“my dog is hairy”中,它选择的token是“hairy”。然后,执行以下过程:

    数据生成器将执行以下操作,而不是始终用[MASK]替换所选单词:

    • 80%的时间:用[MASK]标记替换单词,例如,my dog is hairy → my dog is [MASK]
    • 10%的时间:用一个随机的单词替换该单词,例如,my dog is hairy → my dog is apple
    • 10%的时间:保持单词不变,例如,my dog is hairy → my dog is hairy. 这样做的目的是将表示偏向于实际观察到的单词。

    Transformer encoder不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入token的分布式上下文表示。此外,因为随机替换只发生在所有token的1.5%(即15%的10%),这似乎不会损害模型的语言理解能力

    使用MLM的第二个缺点是每个batch只预测了15%的token,这表明模型可能需要更多的预训练步骤才能收敛。团队证明MLM的收敛速度略慢于 left-to-right的模型(预测每个token),但MLM模型在实验上获得的提升远远超过增加的训练成本。

     

    任务2:下一句预测

    许多重要的下游任务,如问答(QA)和自然语言推理(NLI)都是基于理解两个句子之间的关系,这并没有通过语言建模直接获得。

    在为了训练一个理解句子的模型关系,预先训练一个二进制化的下一句测任务,这一任务可以从任何单语语料库中生成。具体地说,当选择句子A和B作为预训练样本时,B有50%的可能是A的下一个句子,也有50%的可能是来自语料库的随机句子。例如:

    Input = [CLS] the man went to [MASK] store [SEP]

    he bought a gallon [MASK] milk [SEP]

    Label = IsNext

    Input = [CLS] the man [MASK] to the store [SEP]

    penguin [MASK] are flight ##less birds [SEP]

    Label = NotNext

    团队完全随机地选择了NotNext语句,最终的预训练模型在此任务上实现了97%-98%的准确率

    实验结果

    如前文所述,BERT在11项NLP任务中刷新了性能表现记录!在这一节中,团队直观呈现BERT在这些任务的实验结果,具体的实验设置和比较请阅读原论文.

    图3:我们的面向特定任务的模型是将BERT与一个额外的输出层结合而形成的,因此需要从头开始学习最小数量的参数。在这些任务中,(a)和(b)是序列级任务,而(c)和(d)是token级任务。在图中,E表示输入嵌入,Ti表示tokeni的上下文表示,[CLS]是用于分类输出的特殊符号,[SEP]是用于分隔非连续token序列的特殊符号。

    图4:GLUE测试结果,由GLUE评估服务器给出。每个任务下方的数字表示训练样例的数量。“平均”一栏中的数据与GLUE官方评分稍有不同,因为我们排除了有问题的WNLI集。BERT 和OpenAI GPT的结果是单模型、单任务下的数据。所有结果来自https://gluebenchmark.com/leaderboardhttps://blog.openai.com/language-unsupervised/

    图5:SQuAD 结果。BERT 集成是使用不同预训练检查点和fine-tuning seed的 7x 系统。

    图6:CoNLL-2003 命名实体识别结果。超参数由开发集选择,得出的开发和测试分数是使用这些超参数进行五次随机重启的平均值。

     

    四、BERT模型的影响

    BERT是一个语言表征模型(language representation model),通过超大数据、巨大模型、和极大的计算开销训练而成,在11个自然语言处理的任务中取得了最优(state-of-the-art, SOTA)结果。或许你已经猜到了此模型出自何方,没错,它产自谷歌。估计不少人会调侃这种规模的实验已经基本让一般的实验室和研究员望尘莫及了,但它确实给我们提供了很多宝贵的经验:

    1. 深度学习就是表征学习 (Deep learning is representation learning):"We show that pre-trained representations eliminate the needs of many heavily engineered task-specific architectures". 在11项BERT刷出新境界的任务中,大多只在预训练表征(pre-trained representation)微调(fine-tuning)的基础上加一个线性层作为输出(linear output layer)。在序列标注的任务里(e.g. NER),甚至连序列输出的依赖关系都先不管(i.e. non-autoregressive and no CRF),照样秒杀之前的SOTA,可见其表征学习能力之强大。
    2. 规模很重要(Scale matters):"One of our core claims is that the deep bidirectionality of BERT, which is enabled by masked LM pre-training, is the single most important improvement of BERT compared to previous work". 这种遮挡(mask)在语言模型上的应用对很多人来说已经不新鲜了,但确是BERT的作者在如此超大规模的数据+模型+算力的基础上验证了其强大的表征学习能力。这样的模型,甚至可以延伸到很多其他的模型,可能之前都被不同的实验室提出和试验过,只是由于规模的局限没能充分挖掘这些模型的潜力,而遗憾地让它们被淹没在了滚滚的paper洪流之中。
    3. 预训练价值很大(Pre-training is important):"We believe that this is the first work to demonstrate that scaling to extreme model sizes also leads to large improvements on very small-scale tasks, provided that the model has been sufficiently pre-trained". 预训练已经被广泛应用在各个领域了(e.g. ImageNet for CV, Word2Vec in NLP),多是通过大模型大数据,这样的大模型给小规模任务能带来的提升有几何,作者也给出了自己的答案。BERT模型的预训练是用Transformer做的,但我想换做LSTM或者GRU的话应该不会有太大性能上的差别,当然训练计算时的并行能力就另当别论了。

    对BERT模型的观点
     

    0. high-performance的原因其实还是归结于两点,除了模型的改进,更重要的是用了超大的数据集(BooksCorpus 800M + English Wikipedia 2.5G单词)和超大的算力(对应于超大模型)在相关的任务上做预训练,实现了在目标任务上表现的单调增长

    1. 这个模型的双向和Elmo不一样,大部分人对他这个双向在novelty上的contribution 的大小有误解,我觉得这个细节可能是他比Elmo显著提升的原因。Elmo是拼一个左到右和一个右到左,他这个是训练中直接开一个窗口,用了个有顺序的cbow。

    2. 可复现性差:有钱才能为所欲为(Reddit对跑一次BERT的价格讨论)

    For TPU pods:
    
    4 TPUs * ~$2/h (preemptible) * 24 h/day * 4 days = $768 (base model)
    
    16 TPUs = ~$3k (large model)
    
    
    
    For TPU:
    
    16 tpus * $8/hr * 24 h/day * 4 days = 12k
    
    64 tpus * $8/hr * 24 h/day * 4 days = 50k

    最后他问到:For GPU:"BERT-Large is 24-layer, 1024-hidden and was trained for 40 epochs over a 3.3 billion word corpus. So maybe 1 year to train on 8 P100s? " ,然后这个就很interesting了。

    参考文献

    1. 知乎:如何评价谷歌最新的BERT模型

    2. 华尔街见闻:NLP历史突破

    3. OPENAI-Improving Language Understanding with Unsupervised Learning

    4. https://gluebenchmark.com/leaderboard

     

    >>>关于作者

    CSDN 博客专家,2019-CSDN百大博主,计算机(机器学习方向)博士在读,业余Kaggle选手,有过美团、腾讯算法工程师经历,目前就职于Amazon AI lab。喜爱分享和知识整合。

    关注微信公众号,点击“学习资料”菜单即可获取算法、编程资源以及教学视频,还有免费SSR节点相送哦。其他平台(微信/知乎/B站),欢迎关注同名公众号「图灵的猫」~

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 396,707
精华内容 158,682
关键字:

nlp自然语言处理

友情链接: TwainDotNet.rar