关于nlp:搜索语义模型的大规模量化实践

作者 | 把酒问青天 导读  通过近几年的技术演进,语义模型在百度搜寻场景中被宽泛地利用,耗费了大量的GPU资源,模型压缩技术也随之失去大量钻研和实际。通过兼顾推理性能、业务成果和迭代效率的优化指标,咱们胜利地将INT8量化技术大面积地利用到了搜寻场景中,极大地提高了资源效力。此外,目前大模型正在被钻研和利用,算力资源曾经成为瓶颈,如何以更低的老本进行落地是一个十分热点的问题。基于对模型压缩技术的实际和积攒,咱们可能更好地助力大模型的摸索和利用。 全文6287字,预计浏览工夫16分钟。 01 搜寻语义模型现状ERNIE: Enhanced Representation through Knowledge Integration是百度在2019年4月的时候,基于BERT模型做的进一步优化,在中文的NLP工作上失去了state-of-the-art的后果。 近年来,ERNIE 1.0/2.0/3.0等语义模型在搜寻各个重点业务场景下失去了广泛应用,包含相关性、排序等多个子方向,耗费了大量GPU资源。每个业务方向个别由多个模型组成链路来实现最终计算,整体搜寻业务所波及的模型数量多、迭代快。目前,线上全流量模型超过几百个,月级迭代近百次。语义模型的大量利用对搜寻产生了微小影响,相干业务指标对模型精度的变动十分敏感。总的来说,在模型压缩技术的工程实际中,推理性能、业务指标和迭代效率三者的优化指标该当对立思考: 1、推理性能:采纳INT8量化,ERNIE模型的性能减速均匀达25%以上。其次要影响因素蕴含输出数据量大小(batch size、sequence length等)、暗藏节点数、非标准网络结构与算子交融优化。 2、业务指标:以某相关性场景下的ERNIE模型为例,模型输入在数值上的diff率不超过1%,在离线测试集上的评估指标达到简直无损。 3、迭代效率:离线量化达小时级,流水线式疾速产出量化模型,不阻塞模型全生命周期的相干环节(如模型多版本迭代、小流量试验、全量化推全等)。 02 模型量化简述简而言之,模型量化就是将高精度存储(运算)转换为低精度存储(运算)的一种模型压缩技术。劣势如下: 更少的存储开销与带宽需要:如每层权重量化后,32位比特压缩到8比特甚至更低比特,模型占用空间变小;内存拜访带宽的压力天然也会变小。更快的计算速度:单位工夫内执行整型计算指令比浮点计算指令更多;另,英伟达安培架构芯片还有专用INT8 Tensor core。如果咱们从不同的技术角度来对待它,那么: 从映射函数是否是线性,分为线性和非线性。非线性量化计算较为简单,个别次要钻研线性量化,其公式如下: Q = clip(round(R/S) + Z),其中R: high precision float number,Q:quantized integer number,s:scale,z:zero point。 从零点对应地位辨别,线性量化又分为对称和非对称。 △1:对称与非对称量化 以矩阵乘为例,计算公式如下: = = = ( − ) ( − ) = − − + 在理论利用中,两者精度差别不大,对称量化在推理上更容易实现、计算更快。 从量化粒度上,分为逐层量化、逐组量化和逐通道量化。第一种在推理上最易实现,性能更好,个别利用在输出矩阵。第二和第三种在推理上难实现,但业务精度好,个别利用在权重矩阵。从浮点矩阵中统计最大值是否截断上,分为饱和量化和非饱和量化。个别权重采纳非饱和量化;输出/输入矩阵数据分布不平均,采纳饱和量化。从是否参加训练上,分为训练后量化(Post-Traning Quantization,PTQ)和量化感知训练(Quantization Aware Training, QAT)。从实际上看,前者性价比最高,在精度损失可承受范畴内可能疾速产出量化后模型,并取得不错的性能减速;后者须要联合训练来看,往往是在PTQ造成精度损失过大时采取的进一步伎俩。 △图2:PTQ与QAT流程 从是否在推理中动静生成尺度因子,分为在线(动静)量化和离线(动态)量化。在线量化须要在推理过程中依据理论激活计算量化参数,会影响推理速度。03 训练后量化结合实际的利用场景,咱们率先对训练后INT8量化技术进行了粗疏钻研和大规模实际。本文中波及到的硬件测试环境为GPU A10,CUDA 11.2,TensorRT8,工具链包含PaddlePaddle、PaddleInference、PaddleSlim等。 3.1 量化损失的精细化剖析低精度示意空间远远小于高精度示意空间,无论采纳何种校准办法和校准数据,量化肯定会带来不同水平上的数值误差。为了尽可能的减小误差、不影响模型业务指标,那么误差的起源和解决方案该当被全面粗疏地探索与剖析。比方,哪些算子适宜量化,每个算子量化后带来的端到端误差如何掂量,是否将误差较大的局部算子不作量化等问题。 ...

June 27, 2023 · 1 min · jiezi

关于nlp:分集与路径合并方式

本专栏蕴含信息论与编码的外围常识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。分集分集的概念分集是一种抗衰败技术。原理是利用两个以上信号传送同一个信息,并且这些不同信号的衰败互相独立。在接收端以适当形式将这些信号合并利用,以升高合成信号电平起伏,减小各种衰败对接管信号的影响,进而复原信息。 设同一信息通过两路信号传输, 包络为 $v_{1}(t)$ 和 $v_{2}(t)$ , 设 $u_{0}$ 为门限电平, 当小于门限电平时则产生谬误, 令 $$P[v_{1}(t) \lt u_{0}] = P[v_{1}(t) \lt u_{0}] = 10^{-3}$$ 若 $v_{1}(t)$ 和 $v_{2}(t)$ 独立, 则二者同时小于 $u_{0}$ 的概率为 $$P[v_{1}(t) \lt u_{0}, v_{2}(t) \lt u_{0}]=10^{-3} \times 10^{-3}=10^{-6} \ll 10^{-3}$$ 此时若同时利用 $v_{1}(t)$ 和 $v_{2}(t)$ 来复原信息,则可缩小错 若 $v_{1}(t)$ 和 $v_{2}(t)$ 齐全相干则 : $$P[v_{1}(t) \lt u_{0}, v_{2}(t) \lt u_{0}]=10^{-3}$$ 论断: 要达到抗多径成果, 要求 $v_{1}(t)$ 和 $v_{2}(t)$ 统计独立或不相干或弱相干. 分集的办法取得不相干门路信号的办法: 空间分集采纳多天线接管同一信号, 相邻天线间间隔大于载波波长 3 倍以上。(注:实践最小值为 $\lambda / 2$ )。 ...

June 10, 2023 · 2 min · jiezi

关于nlp:java-如何计算两个汉字的相似度如何获得一个汉字的相似汉字

计算汉字类似度情景有时候咱们心愿计算两个汉字的类似度,比方文本的 OCR 等场景。用于辨认纠正。 实现引入 maven <dependency> <groupId>com.github.houbb</groupId> <artifactId>nlp-hanzi-similar</artifactId> <version>1.3.0</version></dependency>java 实现 double rate1 = HanziSimilarHelper.similar('末', '未');返回对应的类似度: 0.9629629629629629返回一个汉字的类似列表情景找到类似的汉字,有很多乏味的场景。 实现List<String> list = HanziSimilarHelper.similarList('爱');Assert.assertEquals("[爰, 爯, 受, 爭, 妥, 憂, 李, 爳, 叐, 雙]", list.toString());开源地址为了便于大家学习,上述代码已开源 https://github.com/houbb/nlp-hanzi-similar在线体验在线体验拓展浏览NLP 中文形近字类似度计算思路 中文形近字类似度算法实现,为汉字 NLP 尽一点绵薄之力 当代中国最贵的汉字是什么? NLP 开源形近字算法补完打算(完结篇) NLP 开源形近字算法之形近字列表(番外篇) 开源我的项目在线化 中文繁简体转换/敏感词/拼音/分词/汉字类似度/markdown 目录

April 12, 2023 · 1 min · jiezi

关于nlp:NLP-开源形近字算法之相似字列表番外篇

创作目标国内对于文本的类似度计算,开源的工具是比拟丰盛的。 然而对于两个汉字之间的类似度计算,国内根本一片空白。国内的参考的材料少的可怜,国外相干文档也是如此。 本我的项目旨在抛砖引玉,实现一个根本的类似度计算工具,为汉字 NLP 奉献一点绵薄之力。 举荐浏览: NLP 中文形近字类似度计算思路 中文形近字类似度算法实现,为汉字 NLP 尽一点绵薄之力 当代中国最贵的汉字是什么? NLP 开源形近字算法补完打算(完结篇) NLP 开源形近字算法之形近字列表(番外篇) 开源我的项目在线化 中文繁简体转换/敏感词/拼音/分词/汉字类似度/markdown 目录 需要有时候咱们并不是须要返回两个字的类似,而是须要返回一个汉字的类似列表。 实现思路咱们能够别离计算所有的汉字之间的类似度,而后保留最大的前100个,放在字典中。 而后实时查问这个字典即可。 实现形式bihuashu_2w.txt 中咱们次要须要的是对应的 2W 常见汉字。 hanzi_similar_list.txt 用来寄存汉字和类似字的映射关系。 数据初始化public static void main(String[] args) { final String path = "D:\\code\\coin\\nlp-hanzi-similar\\src\\main\\resources\\hanzi_similar_list.txt"; // 读取列表 List<String> lines = FileUtil.readAllLines("D:\\code\\coin\\nlp-hanzi-similar\\src\\main\\resources\\nlp\\bihuashu_2w.txt"); // 所有的单词 Set<String> allWordSet = new HashSet<>(); for(String line : lines) { String word = line.split(" ")[0]; allWordSet.add(word); } // 循环比照 for(String word : allWordSet) { List<String> list = getSimilarListData(word, allWordSet); String line = word +" " + StringUtil.join(list, ""); FileUtil.append(path, line); }}优先级队列取前 100 个咱们通过优先级队列存储: ...

March 28, 2023 · 2 min · jiezi

关于nlp:java-中文繁简体转换工具-opencc4j-使用介绍-180

Opencc4jOpencc4j 反对中文繁简体转换,思考到词组级别。 在线体验Features 特点严格辨别「一简对多繁」和「一简对多异」。齐全兼容异体字,能够实现动静替换。严格审校一简对多繁词条,准则为「能分则不合」。词库和函数库齐全拆散,能够自在批改、导入、扩大。兼容 Windows、Linux、Mac 平台。反对自定义分词反对判断单个字(词)是否为简体/繁体反对返回字符串中简体/繁体的列表信息反对中国台湾地区繁简体转换v1.8.0 版本变更丰盛工具类办法优化繁简体判断逻辑变更日志创作原因OpenCCOpenCC 的思维十分优良,做的也特地棒。然而没有特地为 java 提供的工具。 jopenccjopencc 没有提供分词性能。 疾速开始maven 引入<dependency> <groupId>com.github.houbb</groupId> <artifactId>opencc4j</artifactId> <version>1.8.0</version></dependency>api 概览外围工具列表如下: 序号工具类简介1ZhConverterUtil根底的繁简体转换2ZhTwConverterUtil台湾地区的繁简体转换所有的工具类办法具备雷同的办法设计,便于记忆。 外围办法如下: 序号api 办法简介1toSimple(String)转为简体2toTraditional(String)转为繁体3simpleList(String)返回蕴含的简体列表4traditionalList(String)返回蕴含的繁体列表5toSimple(char)返回单个汉字对应的所有简体字列表6toTraditional(char)返回单个汉字对应的所有繁体字列表7isSimple(String)是否全副为简体8isSimple(char)单个字符是否为简体9containsSimple(String)字符中是否为蕴含简体10isTraditional(String)是否全副为繁体11isTraditional(char)单个字符是否为繁体12containsTraditional(String)字符中是否为蕴含繁体13isChinese(String)是否全副为中文14isChinese(char)单个字符是否为中文15containsChinese(char)字符串中是否蕴含中文繁简体转换转为简体 toSimpleString original = "生命不息,奮鬥不止";String result = ZhConverterUtil.toSimple(original);Assert.assertEquals("生命不息,奋斗不止", result);转为繁体 toTraditionalString original = "生命不息,奋斗不止";String result = ZhConverterUtil.toTraditional(original);Assert.assertEquals("生命不息,奮鬥不止", result);繁简体判断对单个字符或者词组进行繁简体判断。 是否为简体 isSimpleAssert.assertTrue(ZhConverterUtil.isSimple('奋'));Assert.assertTrue(ZhConverterUtil.isSimple("奋"));Assert.assertTrue(ZhConverterUtil.isSimple("奋斗"));Assert.assertFalse(ZhConverterUtil.isSimple('奮'));Assert.assertFalse(ZhConverterUtil.isSimple("奮"));Assert.assertFalse(ZhConverterUtil.isSimple("奮鬥"));Assert.assertFalse(ZhConverterUtil.isSimple("奮斗"));Assert.assertFalse(ZhConverterUtil.isSimple("beef"));是否蕴含简体 containsSimpleAssert.assertTrue(ZhConverterUtil.containsSimple("奋"));Assert.assertTrue(ZhConverterUtil.containsSimple("奋斗"));Assert.assertTrue(ZhConverterUtil.containsSimple("奋斗2023"));Assert.assertFalse(ZhConverterUtil.containsSimple("編"));Assert.assertFalse(ZhConverterUtil.containsSimple("編號"));是否为繁体 isTraditionalAssert.assertTrue(ZhConverterUtil.isTraditional('編'));Assert.assertTrue(ZhConverterUtil.isTraditional("編"));Assert.assertTrue(ZhConverterUtil.isTraditional("編號"));Assert.assertFalse(ZhConverterUtil.isTraditional('编'));Assert.assertFalse(ZhConverterUtil.isTraditional("编"));Assert.assertFalse(ZhConverterUtil.isTraditional("编号"));Assert.assertFalse(ZhConverterUtil.isTraditional("编號"));是否蕴含繁体 containsTraditionalAssert.assertTrue(ZhConverterUtil.containsTraditional("編"));Assert.assertTrue(ZhConverterUtil.containsTraditional("編號"));Assert.assertTrue(ZhConverterUtil.containsTraditional("編號2023"));Assert.assertFalse(ZhConverterUtil.containsTraditional("号"));Assert.assertFalse(ZhConverterUtil.containsTraditional("编号"));句子中蕴含的繁简体列表返回返回字符串中繁简体对应的词、字列表,默认反对中文分词。 繁简体列表返回的词组和分词策略严密相干。 简体列表 simpleListfinal String original = "生命不息奋斗不止";final List<String> resultList = ZhConverterUtil.simpleList(original);Assert.assertEquals("[生, 命, 不, 息, 奋斗, 不, 止]", resultList.toString());繁体列表 traditionalListPS: 很多字是同体字。 final String original = "生命不息奮鬥不止";final List<String> resultList = ZhConverterUtil.traditionalList(original);Assert.assertEquals("[生, 命, 不, 息, 奮, 鬥, 不, 止]", resultList.toString());单个汉字对应的繁简体列表繁体字列表Assert.assertEquals("[幹, 乾, 干]", ZhConverterUtil.toTraditional('干').toString());Assert.assertEquals("[發, 髮]", ZhConverterUtil.toTraditional('发').toString());简体字列表Assert.assertEquals("[测]", ZhConverterUtil.toSimple('測').toString());中文工具办法是否为中文 isChineseAssert.assertTrue(ZhConverterUtil.isChinese("你"));Assert.assertTrue(ZhConverterUtil.isChinese("你好"));Assert.assertTrue(ZhConverterUtil.isChinese('你'));Assert.assertFalse(ZhConverterUtil.isChinese("你0"));Assert.assertFalse(ZhConverterUtil.isChinese("10"));Assert.assertFalse(ZhConverterUtil.isChinese('0'));Assert.assertFalse(ZhConverterUtil.isChinese(""));Assert.assertFalse(ZhConverterUtil.isChinese(null));是否蕴含中文 containsChineseAssert.assertTrue(ZhConverterUtil.containsChinese("你"));Assert.assertTrue(ZhConverterUtil.containsChinese("你好"));Assert.assertTrue(ZhConverterUtil.containsChinese("你0"));Assert.assertFalse(ZhConverterUtil.containsChinese("10"));Assert.assertFalse(ZhConverterUtil.containsChinese(""));Assert.assertFalse(ZhConverterUtil.containsChinese(null));中国台湾繁简体转换工具类为保障办法的一致性,引入 ZhTwConverterUtil 工具类,反对办法和 ZhConverterUtil 保持一致。 ...

March 14, 2023 · 2 min · jiezi

关于nlp:如何提高IT运维效率深度解读京东云基于NLP的运维日志异常检测AIOps落地实践

作者:京东科技  张宪波、张静、李东江 基于NLP技术对运维日志聚类,从日志角度疾速发现线上业务问题 日志在IT行业中被宽泛应用,日志的异样检测对于识别系统的运行状态至关重要。解决这一问题的传统办法须要简单的基于规定的有监督办法和大量的人工工夫老本。咱们提出了一种基于自然语言解决技术运维日志异样检测模型。为了进步日志模板向量的品质,咱们改良特征提取,模型中应用了词性(PoS)和命名实体辨认(NER)技术,缩小了规定的参加,利用 NER 的权重向量对模板矢量进行了批改,剖析日志模板中每个词的 PoS 属性,从而缩小了人工标注老本,有助于更好地进行权重调配。为了批改模板向量,引入了对日志模板标记权重的办法,并利用深度神经网络(DNN)实现了基于模板修改向量的最终检测。咱们的模型在三个数据集上进行了有效性测试,并与两个最先进的模型进行了比拟,评估结果表明,咱们的模型具备更高的准确度。 日志是记录操作系统等 IT 畛域中的操作状态的次要办法之一,是识别系统是否处于衰弱状态的重要资源。因而,对日志做出精确的异样检测十分重要。日志异样个别有三种类型,即异样个体日志、异样日志序列和异样日志定量关系。咱们次要是辨认异样个体日志,即蕴含异样信息的日志。 一般来说,日志的异样检测包含三个步骤: 日志解析、特征提取和异样检测。解析工具提取的模板是文本数据,应将其转换为数字数据,以便于输出到模型中。为此,特征提取对于取得模板的数字示意是必要的。在模板特征提取方面,业界提出了多种办法来实现这一工作。独热编码是最早和最简略的办法之一,能够轻松地将文本模板转换为便于解决的数字示意,然而独热编码是一种效率较低的编码方法,它占用了太多的贮存空间来造成一个零矢量,而且在应用独热编码时,疏忽了日志模板的语义信息。除了这种不便的编码方法外,越来越多的钻研人员利用自然语言解决(NLP)技术来实现文本的数字转换,其中包含词袋,word2vec 等办法。尽管上述办法能够实现从文本数据到数字数据的转换,但在日志异样检测方面依然存在一些缺点。词袋和 word2vec 思考到模板的语义信息,能够无效地取得单词向量,然而它们不足思考模板中呈现的每个模版词的重要性调节能力。此外,深度神经网络(DNN)也被用于模板的特征提取。 咱们的模型次要改良特征提取,同时思考每个标记的模版词语义信息和权重调配,因为标记后果对最终检测的重要性不同。咱们利用两种自然语言解决技术即PoS和命名实体辨认(NER),通过以下步骤实现了模板特色的提取。具体来说,首先通过 FT-Tree 将原始日志音讯解析为日志模板,而后通过 PoS 工具对模板进行解决,取得模板中每个词的 PoS 属性,用于权重向量计算。同时,通过 word2vec 将模板中的标记向量化为初始模板向量,并利用权值向量对初始模板向量进行进一步批改,那些重要的模版词的 PoS属性将有助于模型更好地了解日志含意。对于标记完 PoS 属性的模版词,词对异样信息辨认的重要性是不同的,咱们应用 NER 在模版的 PoS属性中找出重要性高的模版词,并且被 NER 辨认为重要的模版词将取得更大的权重。而后,将初始模板向量乘以这个权重向量,生成一个复合模板向量,输出到DNN模型中,失去最终的异样检测后果。为了缩小对日志解析的人力投入,并为权重计算做筹备,咱们采纳了 PoS 分析方法,在不引入模板提取规定的状况下,对每个模版词都标记一个 PoS 属性。 解析模板的特征提取过程是异样检测的一个重要步骤,特征提取的次要目标是将文本格式的模板转换为数字向量,业界提出了各种模板特征提取办法: One-hot 编码:在 DeepLog 中,来自一组 k 模板ti,i∈[0,k)的每个输出日志模板都被编码为一个One-hot编码。在这种状况下,对于日志的重要信息ti 结构了一个稠密的 k 维向量 V = [ v0,v1,... ,vk-1] ,并且满足j不等于i, j∈[0,k),使得对于所有vi= 1和 vj = 0。 自然语言解决(NLP):为了提取日志模板的语义信息并将其转换为高维向量,LogRobust 利用现成的 Fast-Text 算法从英语词汇中提取语义信息,可能无效地捕获自然语言中词之间的外在关系(即语义相似性) ,并将每个词映射到一个 k 维向量。应用 NLP 技术的各种模型也被业界大部分人应用,如 word2vec 和 bag-of-words 。 ...

January 28, 2023 · 1 min · jiezi

关于nlp:排除-spaCy-的部分组件qbit

前言官网文档:https://spacy.io/usage/spacy-101spaCy GitHub:https://github.com/explosion/...本文环境 Windows 10Python 3.8.10spaCy 3.4.2spcCy 的组件很多,有时咱们并不需要全副组件,能够排除掉一些办法spaCy 内置组件清单:https://spacy.io/usage/proces...查看默认组件 >>> spaNLP = spacy.load("zh_core_web_sm")>>> spaNLP.pipe_names['tok2vec', 'tagger', 'parser', 'attribute_ruler', 'ner']比方只须要词性标注,能够排除其余组件 >>> spaNLP = spacy.load("zh_core_web_md", exclude=['parser', 'ner'])>>> spaNLP.pipe_names['tok2vec', 'tagger', 'attribute_ruler']>>> doc = spaNLP('考察显示:PDA性能金玉其外;败絮其中') for token in doc: print(token.pos_, token.text)NOUN 考察VERB 显示PUNCT :NOUN PDANOUN 性能VERB 金玉其外;败絮其中本文出自 qbit snap

November 4, 2022 · 1 min · jiezi

关于nlp:词对齐任务依附于机器翻译

前情概括词对齐工作分为三大实现形式,详情见词对齐工作概述,此为其一。 NMT附丽下的word alignment说道机翻显然就想到transformer,其encoder-decoder构造其实即使是在应用了lstm等模型上也是这样的,附丽在NMT的word alignment工作就能够间接应用seq2seq的输入对输出的词attention(动图https://www.bilibili.com/vide...,36:00)来表征word alignment。 词互信息(PMI)直算这个是很intuitive的办法,我不应用任何模型,间接用概率统计的办法,算出两词间的互信息值,很多文章里叫PMI(pointwise mutual information),间接用这个值作为根据,填出词相关矩阵。互信息是什么?这个场景下的互信息怎么算?见https://blog.csdn.net/index20...。 附丽NMT的词对齐这种模式的word alignment的最终解决形式是求得word的相关矩阵,用分数示意各个词的相关度,文章中名词叫做soft align。经典seq2seq+att的模型和transformer based模型会在decoder阶段失去以后输入词与原sentence的词的attention,利用此能够组成相关矩阵。对于老式的seq2seq+att来说, 对于transformer来说, 值得注意的一点是,只管bert是在transformer的根底上倒退来的,只取了transformer的encoder,在文字了解、浏览等工作有宽泛应用和很好成绩,然而在机器翻译这一工作上bert encoder的体现 很个别 ,甚至不如lstm等老牌rnn,连带的word alignment也不算好(ACL 2019)。 MT和词对齐都做得好 (EMNLP 2019)文章简介挑明,只管机翻工作NMT完爆SMT,然而词对齐工作概率统计办法依然是下风on the closely related task of word alignment, traditional statistical word alignment models often remain the go-to solution.也就是只管深度学习fancy一点,在词对齐工作上还是打不过概率统计模型。本文提出既能很好的机翻,又能很好的词对齐的模型。 办法在原有的transformer根底上,减少词对齐loss(文章标识为multi-task),和扩增了attention的范畴(文章标识full-context)。 减少词对齐loss:新设立一个相关矩阵$G$,拿transformer的倒数第二层的att做$G$的label,用KL散度做词对齐的loss。扩增attention:transformer原型decoder阶段只计算后方的att,但词对齐是不论先后的,此文扩增了att的范畴,叫做full context。evalgiza++做baseline,在应用了giza++做训练信息后的模型能力在词对齐工作上战胜giza++。 MarianNMT自身是一个汇合了很多seq2seq和transformer的机器翻译的工具箱,word alignment能够依附于机器翻译,应用src的word embedding与target embedding计算词汇的相关矩阵。 从可解释性角度进行word align (ACL 2019)前言文章借鉴了LRP删除法判断重要性的办法(ACL 2016)。LRP最先在cv畛域提出。具体来说,对于cv来说,删掉某一部分使得模型错判,则阐明此局部对于后果是重要的。在nlp中,上文提出间接把word embedding全0示意来“删除”这个word。LRP能给出每个word对后果的相干值。·文章首先摸索了应用bert的att的办法也不咋地,应用transformer做word alignment工作的话有些甚至不如用互信息(PMI)直算: 文章一共比拟了 互信息直算(PMI)用transformer attention他的两种model agnostic的办法,一个叫PD,一个叫EAM PD(prediction difference)办法其办法如下,对于一个填词问题来说,把原sentence的某一个word $x$替换成全0embedding,把替换前后的模型输入词$y$的差值作为x与y的“相关度”。 不同于直算或者attention办法的word alignment,本篇文章间接应用删除word对后果的差别大小来作为两个语言相关矩阵的值。 EAM(Explicit Alignment Model)办法对于一个曾经训练好的NMT模型,源语言的word x和目标语言的word y是这样算的: 而后归一化一下这个$W$是要训练的。 后果fast align是IBM mode 2的一个实现,就是纯概率统计模型的词对齐模型。AER是越小越好,这表只能看出,作者的EAM和PD比应用transformer的attention做词对齐好,然而比不上IBM model 2. ...

June 24, 2022 · 1 min · jiezi

关于nlp:什么是ngram最简理解短小精悍

最简了解gram指句子中的间断的一小部分。you are my ex-girlfriend. 外面,you are my就可以看做是gram。gram中几个单词就说是几gram,you are my是3-gram。n gram指数量是n的gram。 起源在statistical language model,统计语言模型中假使要实现这个填词工作you are my ___,前面词填什么才最合适?转换成统计问题就变成了,一个句子中you are my曾经产生了,前面是什么词才冀望最大。写作$$\argmax_x P(x|w_1,w_2,w_3)$$$w_1$是you、$w_2$是are、$w_3$是my,x是要填的词。而你的抉择是整个语言中的所有的词。 咱们冀望有个模型能间接帮忙给出最合适的答案w,然而这个模型是有参数的,需要求他的参数:$$\argmax_\theta P(w|w_1,w_2,w_3)$$然而假使句子特地长,模型参数的计算量会极其宏大,为了解决计算量宏大的问题,提出假如n-gram:要填的这个词w只和词后面的n个词无关,来加重计算累赘。当然除了n-gram假如,还有bi-gram等其余假如,无非就是假如词与前后n个词相干等等的变体了。 对于下面的问题,假使我应用2-gram,那么参数求解的问题就能够简化到:$$\argmax_\theta P(w|w_2,w_3)$$$w_1$就能够不用参加相干计算。 利用ngram在统计语言模型中利用很宽泛,比方IBM model1/2等。

June 6, 2022 · 1 min · jiezi

关于nlp:EasyNLP开源|中文NLP大模型落地EasyNLP-is-all-you-need

简介:EasyNLP背地的技术框架如何设计?将来有哪些布局?明天一起来深刻理解。 作者 | 临在、岑鸣、熊兮起源 | 阿里开发者公众号 一 导读随着BERT、Megatron、GPT-3等预训练模型在NLP畛域获得注目的成绩,越来越多团队投身到超大规模训练中,这使得训练模型的规模从亿级别倒退到了千亿甚至万亿的规模。然而,这类超大规模的模型使用于理论场景中依然有一些挑战。首先,模型参数量过大使得训练和推理速度过慢且部署老本极高;其次在很多理论场景中数据量有余的问题依然制约着大模型在小样本场景中的利用,进步预训练模型在小样本场景的泛化性仍然存在挑战。为了应答以上问题,PAI团队推出了EasyNLP中文NLP算法框架,助力大模型疾速且高效的落地。 EasyNLP背地的技术框架如何设计?将来有哪些布局?明天一起来深刻理解。 二 EasyNLP简介EasyNLP是PAI算法团队基于PyTorch开发的易用且丰盛的中文NLP算法框架,反对罕用的中文预训练模型和大模型落地技术,并且提供了从训练到部署的一站式NLP开发体验。EasyNLP提供了简洁的接口供用户开发NLP模型,包含NLP利用AppZoo和预训练ModelZoo,同时提供技术帮忙用户高效的落地超大预训练模型到业务。除此之外EasyNLP框架借助PAI团队在通信优化、资源调度方面的深厚积攒,能够为用户提供大规模、鲁棒的训练能力,同时能够无缝对接PAI系列产品,例如PAI-DLC、PAI-DSW、PAI-Designer和PAI-EAS,给用户带来高效的从训练到落地的残缺体验。 EasyNLP曾经在阿里巴巴外部反对10多个BU的业务,同时在阿里云上提供了NLP解决方案和ModelHub模型帮忙用户解决业务问题,也提供用户自定义模型服务不便用户打造自研模型。在通过外部业务打磨之后,咱们将EasyNLP推向开源社区,心愿可能服务更多的NLP算法开发者和研究者,也心愿和社区一起推动NLP技术特地是中文NLP的疾速倒退和业务落地。 EasyNLP is a Comprehensive and Easy-to-use NLP Toolkit[1] EasyNLP次要个性如下: 易用且兼容开源:EasyNLP反对罕用的中文NLP数据和模型,不便用户评测中文NLP技术。除了提供易用简洁的PAI命令模式对前沿NLP算法进行调用以外,EasyNLP还形象了肯定的自定义模块如AppZoo和ModelZoo,升高NLP利用的门槛,同时ModelZoo外面常见的预训练模型和PAI自研的模型,包含常识预训练模型等。EasyNLP能够无缝接入huggingface/ transformers的模型,也兼容EasyTransfer模型,并且能够借助框架自带的分布式训练框架(基于Torch-Accelerator)晋升训练效率。大模型小样本落地技术:EasyNLP框架集成了多种经典的小样本学习算法,例如PET、P-Tuning等,实现基于大模型的小样本数据调优,从而解决大模型与小训练集不相匹配的问题。此外,PAI团队联合经典小样本学习算法和比照学习的思路,提出了一种不削减任何新的参数与任何人工设置模版与标签词的计划Contrastive Prompt Tuning,在FewCLUE小样本学习榜单获得第一名,相比Finetune有超过10%的晋升。大模型常识蒸馏技术:鉴于大模型参数大难以落地的问题,EasyNLP提供常识蒸馏性能帮忙蒸馏大模型从而失去高效的小模型来满足线上部署服务的需要。同时EasyNLP提供MetaKD算法,反对元常识蒸馏,晋升学生模型的成果,在很多畛域上甚至能够跟老师模型的成果持平。同时,EasyNLP反对数据加强,通过预训练模型来加强指标畛域的数据,能够无效的晋升常识蒸馏的成果。三 EasyNLP框架特点1 整体架构 如图所示,EasyNLP架构次要有如下几个外围模块: 根底模块:提供了预训练模型库ModelZoo,反对罕用的中文预训练模型,包含BERT,MacBERT,WOBERT等;也提供罕用的NN模块,不便用户自定义模型;应用层:AppZoo反对常见的NLP利用比方说文本分类,文本匹配等;EasyNLP反对预训练模型落地工具,包含小样本学习和常识蒸馏,助力大模型疾速落地,这里也集成了多个PAI团队自研的算法;NLP利用和解决方案:提供了多个NLP解决方案和ModelHub模型帮忙用户解决业务问题;工具层:能够反对本地拉起服务,也能够在阿里云产品上部署和调用,比方说PAI-DLC、PAI-DSW、PAI-Designer和PAI-EAS,给用户带来高效的从训练到落地的残缺体验。2 大模型常识蒸馏技术随着BERT等预训练语言模型在各项任务上都获得SOTA成果,大规模预训练模型曾经成为 NLP学习管道中的重要组成部分,然而这类模型的参数量太大,而且训练和推理速度慢,重大影响到了须要较高QPS的线上场景,部署老本十分高。EasyNLP框架集成了经典的数据加强和常识蒸馏算法,使得训练出的小模型在相应工作行为上可能迫近大模型的成果。 因为现有大部分的常识蒸馏工作都聚焦在同畛域模型的蒸馏,而疏忽了跨畛域模型对指标蒸馏工作成果的晋升。PAI团队进一步提出了元常识蒸馏算法MetaKD(Meta Knowledge Distillation),将跨畛域的可迁徙常识学出,在蒸馏阶段额定对可迁徙的常识进行蒸馏。MetaKD算法使得学习到的学生模型在相应的畛域的效果显著晋升,迫近老师模型的成果。这一算法的外围框架图如下所示: 其中,MetaKD算法包含两个阶段。第一个阶段为元老师模型学习(Meta-teacher Learning)阶段,算法从多个畛域的训练数据协同学习元老师模型,它对每个畛域的样本都计算其典型得分(Prototype Score),使更具备跨畛域典型性的样本在学习阶段有更大的权重。第二个阶段为元蒸馏(Meta-distillation)阶段,将元老师模型选择性地蒸馏到特定畛域的学习工作上。因为元老师模型可能无奈做到在所有畛域上都有准确的预测成果,咱们额定引入了畛域专业性权重(Domain-expertise Weight),使元老师模型只将置信度最高的常识迁徙到学生模型,防止学生模型对元老师模型的过拟合。 下图展现了MetaKD算法在MNLI的5个畛域数据集的跨工作蒸馏成果。由后果可见,MetaKD蒸馏出的BERT-Small模型的和原始BERT模型相比,在放弃模型精度值均匀只降落1.5%的前提下参数缩小了87%,大大减少了部署的压力。 目前,MetaKD算法也曾经集成到EasyNLP框架中开源。 常识蒸馏实际详见[2]。 3 大模型小样本学习技术预训练语言模型规模的扩充,使得这一类模型在自然语言了解等相干工作成果一直晋升。然而,这些模型的参数空间比拟大,如果在上游工作上间接对这些模型进行微调,为了达到较好的模型泛化性,须要较多的训练数据。在理论业务场景中,特地是垂直畛域、特定行业中,训练样本数量有余的问题宽泛存在,极大地影响这些模型在上游工作的准确度。为了解决这一问题,EasyNLP框架集成了多种经典的小样本学习算法,例如PET、P-Tuning等,实现基于预训练语言模型的小样本数据调优,从而解决大模型与小训练集不相匹配的问题。 此外,PAI团队联合经典小样本学习算法和比照学习的思路,提出了一种不削减任何新的参数与任何人工设置模版与标签词的计划Contrastive Prompt Tuning (CP-Tuning)。这一算法的外围框架图如下所示: 如上图,CP-Tuning算法放弃了经典算法中以“[MASK]”字符对应预训练模型MLM Head的预测输入作为分类根据,而是参考比照学习的思路,将句子通过预训练模型后,以“[MASK]”字符通过预训练模型后的间断化表征作为features。在小样本工作的训练阶段,训练指标为最小化同类样本features的组内间隔,最大化非同类样本的组间间隔。在上图中,[OMSK]即为咱们所用于分类的“[MASK]”字符,其优化的features示意为[EMB]。因而,CP-Tuning算法不须要定义分类的标签词。在输出侧,除了输出文本和[OMSK],咱们还退出了模版的字符[PRO]。与经典算法不同,因为CP-Tuning不须要学习模版和标签词之间的对应,咱们间接将[PRO]初始化为工作无关的模版,例如“it is”。在模型训练过程中,[PRO]的示意能够在反向流传过程中自动更新。除此之外,CP-Tuning还引入了输出文本的Mask,示意为[TMSK],用于同时优化辅助的MLM工作,晋升模型在小样本学习场景下的泛化性。CP-Tuning算法的损失函数由两局部组成: 如上所示,两个局部别离为Pair-wise Cost-sensitive Contrastive Loss(PCCL)和辅助的MLM损失。咱们在多个GLUE小样本数据集上进行了验证,其中训练集中每个类别限度只有16个标注样本。从下述后果能够看出,CP-Tuning的精确度超过了经典的小样本学习算法,也比规范Fine-tuning算法的精确度高10%以上。 目前,除了咱们自研的CP-Tuning算法之外,EasyNLP框架中集成了多种经典小样本学习算法例如PET、P-tuning等。 小样本学习实际详见[3]。 4 大模型落地实际上面咱们给出一个示例,将一个大的预训练模型(hfl/macbert-large-zh)在小样本场景上落地,并且蒸馏到仅有1/100参数的小模型上。如下图所示,一个大模型(3亿参数)在一个小样本场景上原始的Accuracy为83.8%,通过小样本学习能够晋升7%,达到90.6%。同时,如果用一个小模型(3百万参数)跑这个场景的话,成果仅有54.4%,能够把成果晋升到71%(晋升约17%),inference的工夫相比大模型晋升了10倍,模型参数仅为原来的1/100。 代码详见[4]。 四 利用案例EasyNLP撑持了阿里巴巴团体内10个BU20多个业务,同时过PAI的产品例如PAI-DLC、PAI-DSW、PAI Designer和PAI-EAS,给团体用户带来高效的从训练到落地的残缺体验,同时也反对了云上客户自定定制化模型和解决业务问题的需要。针对私有云用户,对于入门级用户PAI-Designer组件来通过简略调参就能够实现NLP模型训练,对于高级开发者,能够应用AppZoo训练NLP模型,或者应用预置的预训练模型ModelZoo进行finetune,对于资深开发者,提供丰盛的API接口,反对用户应用框架进行定制化算法开发,能够应用咱们自带的Trainer来晋升训练效率,也能够自定义新的Trainer。 ...

April 29, 2022 · 1 min · jiezi

关于nlp:Rasa对话机器人连载一-第121课Rasa对话机器人Debugging项目实战之电商零售对话机器人运行流程调试全程演示1

Rasa 3.X对话机器人Debugging我的项目全生命周期调试实战 Gavin大咖2022-03-20 本电子书由段智华依据Gavin大咖Rasa AI上课内容整顿编写。https://blog.csdn.net/duan_zh... NLP on Transformers高手之路137课 Rasa 3.x 源码高手之路 常识店铺:https://appybiyrtzd9613.h5.xi... Rasa培训、Rasa课程、Rasa面试、Rasa实战、Rasa对话机器人Debugging我的项目实战之电商批发对话机器人运行流程调试全程演示 -1本节课解说一个新的我的项目电子商务或零售业的智能业务对话机器人,实现一些智能业务对话外围的性能,例如,查问订单的状态,提交订单等,如果从信息检索的角度,需查问产品的库存(inventory)获取符合要求的产品;如果是服务于具体消费者,例如做电子商务,或者服装销售,可能须要维持用户的关系,有时候会提供订阅相干的性能,咱们在这个我的项目中,这些性能咱们都会实现,如果实现了这些性能,而且读者具备咱们后面解说的对于Rasa的架构,还有内核的一些能力(读者能够学习NLP on Transformers高手之路137课(模型、算法、论文、源码、案例 + 1年答疑)常识店铺的课程内容,https://appybiyrtzd9613.h5.xi...),实践上讲做任意级别的,无论是零售业还是电子商务类型类型的智能业务对话机器人都不会有问题,只不过理论在做的过程中,可能要对数据的品质特地留心或者是注意,同时要和第三方的 API整合的很好,而数据的品质或者第三方的API,可能只须要提供标准,由大数据工程师去解决,第三方接口API的整合,绝大多数时候是由微服务中心提供,微服务调用个别通过Jason及Restful的形式,在一个失常的曾经系统化运行的公司,中等规模、中上等规模或者大规模的公司,在分工合作的状况下,这些都不是问题,那咱们聚焦的外围是什么?聚焦的外围包含三点:第一点就是语言了解,是否很精密的了解零售业或者说电子商务方面的或者是任意类型的基于网络的服务,是否精密的了解任意用户的和输出的信息,判断他的用意以及要做的事件,并收集信息来实现的事件。第二点就是决策零碎对话管理系统。第三点就是异样解决以及版本迭代。可能有些同学会感觉到有点意外,为什么?因为智能业务对话机器人,或者说一所有类型的业务对话机器人,它都有一个新的简单维度,这个维度就是人的语言的不确定性,面临这种不确定性,咱们具体该怎么解决?在Rasa后期的版本,例如Rasa 1.0或者Rasa 2.0这个版本的时候,实践上讲不大可能笼罩用户的所有的状况的。用户如果说了你不了解的话,或者说他说的话,你不怎么了解,该怎么去解决这些内容,这是继续花工夫的中央,要继续的投入工作。做一个智能业务对话机器人, 从工作的角度讲,是一个能够可能让开发者继续一直奉献价值的一个工作。Rasa visualize工具学习首先,咱们运行rasa train命令训练模型: 编辑 切换为居中增加图片正文,不超过 140 字(可选) 在模型训练的过程中,运行rasa visualize命令启动可视化工具,看一下rasa整体基于story和rules相干的流程。 编辑 切换为居中增加图片正文,不超过 140 字(可选) 从整个BOT的宏观层面,次要是基于 rules和stories,以及基于domain和action进行撑持。 编辑增加图片正文,不超过 140 字(可选) 如图所示是Rasa visualize 显示的内容,这是用户和Bot进行交互的设计图,这只是一个维度,不能展示所有的货色,然而能够很分明的展现Bot具体有哪些门路,能做哪些事件,其中start节点是会话开始的终点。 编辑 切换为居中增加图片正文,不超过 140 字(可选) 一些打招呼的根底场景这里不再赘述,能够看几个很重要的场景:例如Subscribe to update、what's new on the site?、What's your Inventory(查问库存)、fallback、actually can I check the status of my order(查看订单状态)等,在批发业务、电子商务、服务餐饮等行业,这都是很罕用的。如果是餐饮行业(例如美团),订单中对话机器人的的思维逻辑是一样的,只是语言的内容不是太一样,思维逻辑一样是指作为一个对话机器人开发者,对开发者的能力要求是一样的。如下图所示,基本上都是跟form表单相干的, order_status_form示意订单状态表单,products _stock_form示意库存信息, Product_update_form示意订单产品的状态, return_form示意退回, cancel_form示意勾销。 ...

April 21, 2022 · 7 min · jiezi

关于nlp:达观数据CTO-纪达麒基于阿里云计算底座打造智能办公机器人

“机器人”一词最早呈现在1921年卡雷尔·卡佩克(Karel Capek)创作的一部科幻剧中,而在迷信智能技术创新倒退百年后的明天,智能机器人曾经成为了一个能够利用于各个行业的前沿科技产品,代替人类从事繁琐反复的枯燥劳动。 随着人工智能技术的提高,智能机器人产业如雨后春笋般蓬勃发展,政策领导、社会环境、科技冲破和待业局势均呈上升姿势,目前智能机器人已在制作、办公等寰球范畴内的多个畛域占有“一席之地”。大势所趋,同时也在行业刚需的促使下,达观数据应运而生。 达观数据是一家为企业提供各类场景智能办公机器人的国家高新技术企业,荣获中国人工智能畛域最高奖“吴文俊人工智能奖”、国家级专精特新“小伟人”企业等荣誉资质。达观利用先进的自然语言解决(NLP)、光学字符识别(OCR)、机器人流程自动化(RPA)、常识图谱等技术,为大型企业和政府机构提供办公流程自动化、文档智能审阅、文字辨认、企业级垂直搜寻、智能举荐等智能办公机器人产品,让计算机帮助人工实现业务流程自动化,大幅度提高企业效率与智能化程度。 【图】达观数据CTO 纪达麒 云原生企业,达观数据七年继续抉择阿里云实际上,达观数据是一家云原生企业,2015年成立以来始终抉择阿里云作为底层基础设施的撑持,“有了阿里云的撑持,也让达观数据可能更加专一地进行业务场景研发。”达观数据CTO 纪达麒说道。 谈到当初为何抉择阿里云时,纪达麒示意,“达观数据刚刚成立初期,只有10集体,过后的基础设施有两个抉择:自建机房或者上云。但思考到自建机房初始投入老本很高,还需装备业余的运维能力,团队成员仍心愿将更多的精力投入到产品研发下面,所以抉择了上云。而阿里云作为业界上云首选云厂商,自然而然就成了达观数据的第一抉择,也是没有过多探讨和犹豫的第一抉择。” 随着业务倒退,在阿里云的单干过程中团队成员们发现阿里云的服务器极为稳固和牢靠,服务响应迅速,即便在非工作工夫也会有业余的人员积极支持和配合排查问题。而随着业务倒退,达观数据越来越多的SaaS客户也都抉择了阿里云,与客户抉择同一云平台,还能够通过内网进行传输、缩小提早,客户也领有了更好的体验,这也是达观数据继续抉择阿里云的起因。 神龙架构,超强算力助力达观数据减速业务翻新达观数据的外围是做文本智能解决,通过自研的NLP、OCR、RPA以及多个行业常识图谱小样本学习算法,胜利为百余家企业客户提供智能化服务,无效实现了规模化的商业利用。但客户的诉求和本身技术的翻新要求在一直减少,导致在计算性能、资源的弹性和稳定性方面的问题也面临着不同的挑战。 对于智能办公机器人,企业客户的诉求是心愿又快、又准、又稳固地进行数据处理,比方excel表格解析、word文档内容审核等工作,这也是最常见的场景,实质上是数据录入。基于此客户诉求,就要求达观数据一直降级算法,打磨产品,深耕各行业多种场景,以便更好地服务客户;另一方面对基础设施底层也提出了更高的要求,包含足够的算力、稳固的环境、监控报警等等。 在AI算法这块,不论是NLP(自然语言解决技术)还是OCR(文字辨认技术),都须要大量的计算资源和比拟多的CPU机器,但自建机房的初始老本过高,还须要搭配业余的运维能力进行辅助,依靠阿里云自研的软硬一体的神龙架构提供的超强算力和高稳定性,帮忙达观数据无效晋升了AI算法的研发效率,极致的弹性也让达观数据能够依据客户的须要,随时地疾速扩容,在算力保障的同时,超强的稳定性也让达观数据为客户提供了更加稳固、平安的服务。 目前,达观智能办公机器人曾经宽泛使用于金融、制作、通信、法律、审计、媒体、银行、政府等多种文字密集型行业。其中,针对券商客户,业务中波及了大量非结构化银行流水数据,业务人员须要从中获取要害流水数据信息,能力剖析企业流水真实性状况、股权穿透状况以及企业现金流状况,达观数据的流水智能核查零碎能使零碎平台的综合工作效率较人工晋升达人员的5-10倍;使得其券商客户体验进一步晋升提高,无缝连接客户外围诉求,满足客户要求。 继续翻新,达观数据为行业客户赋能 基于阿里云平台,达观数据打造达观智能服务引擎,提供更加翻新的企业服务,已宽泛用于金融、政务、制作、医疗、教育供应链等行业;同时打造了达观产品体系,欠缺了客户的服务流程,做到了指标晋升、产品晋升、以及业务晋升。 纪达麒示意:“将来,达观数据将与阿里云持续严密单干,实现技术创新,让反复的工作和繁琐的办公流程更加自动化和智能化,为企业客户带来更大价值,为数字化办公行业保驾护航。”

March 31, 2022 · 1 min · jiezi

关于nlp:隐马尔科夫模型

HMM根底隐马尔科夫模型(Hidden Markov model),HMM是很风行的序列模型,广泛应用在语音辨认等畛域,也能够用在词性标注、实体辨认等文本问题中。 工夫序列数据工夫序列数据(time series data)能够认为是沿着工夫的维度而变动的数据,列如股价、气温、语音、 文本等。时序的数据它的长度是不确定的,比方两个人说同一句话,可能有的人说的比拟快,有的人比较慢。 所以咱们在将逻辑回归或者SVM利用在这类数据上理论是会损失一些数据的。非时序数据比方像图片,一个人的特色等,当咱们应用它们的时候,它的维度是固定的。时序类的模型,从传统机器学习角度来说有HMM、CRF,从深度学习角度来说有RNN、LSTM。 HMM模型介绍上图是一个HMM模型的经典构造,它由下层的隐变量和上层的观测值组成。隐变量之间的传递叫作状态转移,隐变量到观测值之间的传递叫作状态生成,所以它也是生成模型。能够看到这个模型是有向的、生成的模型。HMM是一个概率图模型,在\( t=1 \)时刻: \( z_1 \)示意一个状态,然而它有多种状态,示意每种状态有着对应的概率\( z_1 \) to \( z_2 \),示意状态的转移,由前一种状态转移到下一种状态也有着对应的概率\( z_1 \) to \( x_1 \),示意在这种状态下生成了一个值,这个值也有不同的取值(通常可分为间断和离散值),在这种状态下生成了这种值也有着对应的概率。由以上介绍不难晓得HMM模型存在三大次要问题: 一是在已知模型参数的条件下,对于任何一个观测值序列,去推出背地状态转移的序列,这种问题也叫inference 或者decoding。比如说如果这个序列是针对语音辨认,那么咱们能够依据听到的音乐或人的声音来反推出他到底说了哪些单词或者哪些句子。二是给定观测值,咱们去预测出或者估算出整个模型的参数。三是计算某一个观测值序列的边缘概率。利用举例 Part of Speech Tagging(POS)当咱们的问题变成词性标注时,咱们关怀的是:给定一句话,晓得观测值(单词)\( x_1 到 x_n \)到底是什么词性。能够晓得在这个例子里\( z_i \)是离散值。接下来看咱们的三大问题: 给定咱们句子,咱们须要去反推出它每个单词的词性。这个问题也叫inference or decoding问题(怎么解决,维特比算法)给定一句话之后,咱们怎么去预计模型的参数。\( p(x_1x_2...x_n) \)呈现的概率是多少请看对下面第二个问题的详解:参数\( \theta = (A,B,\pi) \),A示意的是词性之间的转换的概率(transition probability): A是状态转移概率矩阵,也叫作transiton probability。咱们要晓得状态之间的转移不是随机产生的,而是更有可能转移到其它的状态里。\( A_{m\times m} \),m示意词性(状态)的品种个数,每一行示意一个词性(状态),每一行加起来为1。矩阵里每一个点示意从前一个词性(状态)转换到下一个词性(状态)的概率。B是生成概率(emission probability): 在\( z_1 \)状态下咱们生成的单词\( w_1 \)是某种词性的概率,它能够表白为一个概率矩阵\( B_{m\times v} \),m示意词性的品种个数,v示意词库的大小,每一行示意每一种词性对应词库里每一个单词的概率,每一行加和为1。矩阵里的每一个点示意在某个状态下(在这个例子中是单词词性)看到一个观测值(在这个例子中是单词)的概率是多少。值得注意的是生成的值也能够是间断值,对于连续型的变量咱们是不能写成矩阵的模式的,这时该当借用高斯混合(GMM)模型来解决。\( \pi \)示意句子里第一个单词(观测值)呈现某个词性(状态)的概率: 能够了解为\( \pi \)是一个初始化数组,即\( \pi = [\pi_1,\pi_2...\pi_i...\pi_m]\),加和为1在这个模型中,\( x\to \theta \),这个过程叫预测,parameter estimate ;\( x\to z \),这个过程叫infer ...

March 11, 2022 · 2 min · jiezi

关于nlp:文本表示

文本示意对于自然语言解决各类利用,最根底的工作是文本示意。文本是不能间接作为模型的输出的,都是要转化成向量的模式再导入到模型中训练。所谓文本的示意就是钻研如何将文本示意成向量或者矩阵的模式。文本示意的最小单元是单词,其次是短语、句子、段落。咱们须要懂得把这些都示意成向量的模式,其中,单词的表示法是最根底的,对于句子或者更长的文本说,其向量示意都依赖于单词的示意。单词的示意能够有多重办法,如独热编码、TF-IDF等等。 单词的示意独热编码是能够用来示意一个词向量。首先咱们须要依据文本构建本人的词库,词库的大小决定向量矩阵的大小,每个单词都有本人独特的向量示意,每个向量只有一个地位示意为1,其余全为0,列如词库的大小是5,某个单词向量能够示意为\( [0,0,1,0,0] \)。词库中所蕴含的单词的先后顺序并不影响后续工作。独热编码尽管简略,然而也存在许多问题: 因为大量0存在,极度稠密每个单词示意成长度为|V|,|V|是词库的大小无奈比拟语义类似度句子的示意晓得了单词的示意就能够晓得句子的示意,一个句子由多个单词组成。记录一下句子中单词是否呈现,咱们就能够示意这个句子的向量,当然,某些时候也须要记录单词呈现的次数。但这种表示法也存在一些问题,例如: 没有思考到一个单词的重要性没有记录单词呈现个数的表示法叫Boolean function,记录单词呈现个数的表示法叫作Count vectorizerfrom sklearn.feature_extraction.text import CountVectorizer#corpus 语料库corpus = ['I like this course,', 'I like this game,', 'I like this course,but I also like that game' ]#构建countvectorizer objectvectorizer = CountVectorizer()#失去每个文档的count向量,X为稠密矩阵X = vectorizer.fit_transform(corpus)#打印词典print(vectorizer.get_feature_names())#['also', 'but', 'course', 'game', 'like', 'that', 'this']#打印每个文档的向量print(X.toarray()) [[0 0 1 0 1 0 1] [0 0 0 1 1 0 1] [1 1 1 1 2 1 1]]print(X) (0, 4) 1 (0, 6) 1 (0, 2) 1 (1, 4) 1 (1, 6) 1 (1, 3) 1 (2, 4) 2 (2, 6) 1 (2, 2) 1 (2, 3) 1 (2, 1) 1 (2, 0) 1 (2, 5) 1文档示意 TF-IDFTF-IDF示意思考了单词的权重,也能够认为是品质。但并不是呈现的越多就越重要,也并不是呈现的越少就越不重要。具体表示法请看下式(1): ...

March 5, 2022 · 1 min · jiezi

关于nlp:词向量技术

词向量根底单词的示意独热编码存在一下问题: 无奈以一个向量的形式示意一个单词的含意向量维度高,且十分稠密没有掂量两个单词之间的语义类似度因为独热编码的毛病,一种新的形式-词向量(也叫分布式示意)示意形式如下: 独热编码词向量(分布式示意)咱们[1,0,0,0,0][0.1,0.2,0.4,0.2]爬山[0,1,0,0,0][0.2,0.3,0.1,0.2]当有了词向量的分布式的示意之后,两个单词之间的类似度是能够算进去的,当然,成果取决于词向量的品质。这个词向量的维数是由训练词向量的模型人工定义的,学习词向量的模型如Bert,Glove,SkipGram,ELMo从上能够看到: 分布式示意时向量是浓密的,很少有0分布式示意时维数远远小于独热编码词向量肯定水平上能够示意这个单词的含意,则从肯定水平上就能够示意两个单词之间的类似度总结如下: 独热编码分布式示意无奈示意单词额的含意能够认为示意单词的含意向量十分稠密向量浓密向量长度等于词库的长度向量长度是超参数不须要训练须要训练SkipGram模型参考论文:Efficient Estimation of Word Representations in Vector Space SkipGram模型的外围是通过中心词来预测四周的单词。也就是说如果咱们的词向量训练地比拟精确,预测成果就比拟强,实际上这就是咱们的指标函数。 为了便于了解,为什么通过中心词能够预测出四周的单词?咱们来理解它背地的逻辑:这里有一个假如叫做分布式的假如,这个分布式的假如意味着如果两个单词挨在一起,那有可能两个单词的含意是比拟相似的,所以我可能通过一个单词预测出它类似的单词。 上面记录Skipgram的推导:假如咱们存在这样的数据集{\(s_1,s_2,s_3,s_4,s_5\)},当然咱们的数据不可能这么少,数据通常都是一篇一篇的文章或者间接复制网页上的一段话也是咱们数据。 通过挨着的词语相相似的思维,用以上的样本想要训练出词向量,咱们能够这样做:最大可能上面的条件概率乘积: $$ p(s2|s1)·p(s1|s2)·p(s3|s2)·p(s2|s3)·p(s3|s4)·p(s5|s4)·p(s4|s5)$$ 能够发现,咱们对咱们的P(相邻词|中心词)作了一个循环,由此能够推出更通用性的公式:w-中心词,c-属于w上下文的词 $$L(\theta) = MLE \prod_{w\in Text}\prod_{c\in Context}p(c|w;\theta)\tag{1}$$ $$\theta = arg\,\max_{\theta} \sum_{w\in Text} \sum_{c\in Context}log p(c|w;\theta)\tag{2}$$ 对于条件概率 \( p(c|w;\theta)\)咱们心愿能示意为\( \theta \)的状态,所以咱们要晓得它的属性以写出适合的状态,个别它具备以下属性: 概率值在0~1之间\( \sum_{i=1}^n p(c|w;\theta) = 1 \)(w,c)类似的时候,咱们心愿它的值越大(w,c)不类似的时候,咱们心愿它的值越小所以咱们能够采纳softmax的状态: $$softmax = \frac {e^{z_i}}{\sum\limits_{c=1}^c e^c}\tag{3}$$ \( ( p(c|w;\theta) \)就能够写为下式(4):c'示意w的全副相邻词,\( u_c \)示意c的embedding,\( v_w \)示意中心词w的embedding当w和c类似的时候\( u_c v_w \)的内积也越大,反则相同。在这里,咱们采纳余弦类似度来掂量相似性,两向量愈类似,点积也愈大。 $$( p(c|w;\theta) = \frac {e^{u_c v_w}} {\sum\limits_{c'} e^{u_{c'} v_w}}\tag{4}$$ ...

March 4, 2022 · 1 min · jiezi

关于nlp:恒源云SimCSE对比学习只需要-Dropout

文章起源 | 恒源云社区(恒源云,专一 AI 行业的共享算力平台) 原文地址 | Dropout 原文作者 | Mathor 要说2021年上半年NLP最火的论文,想必非《SimCSE: Simple Contrastive Learning of Sentence Embeddings》莫属。SimCSE的全称是Simple Contrastive Sentence Embedding Sentence EmbeddingSentence Embedding始终是NLP畛域的一个热门问题,次要是因为其利用范畴比拟宽泛,而且作为很多工作的基石。获取句向量的办法有很多,常见的有间接将[CLS]地位的输入当做句向量,或者是对所有单词的输入求和、求均匀等。但以上办法均被证实存在各向异性(Anisotropy)问题。艰深来讲就是模型训练过程中会产生Word Embedding各维度表征不统一的问题,从而使得取得的句向量也无奈间接比拟 目前比拟风行解决这一问题的办法有: 线性变换:BERT-flow、BERT-Whitening。这两者更像是后处理,通过对BERT提取的句向量进行某些变换,从而缓解各向异性问题比照学习:SimCSE。 比照学习的思维是拉近类似的样本,推开不类似的样本,从而晋升模型的句子示意能力Unsupervised SimCSE SimCSE利用自监督学习来晋升句子的示意能力。因为SimCSE没有标签数据(无监督),所以把每个句子自身视为类似句子。说白了,实质上就是\( (本人,本人) \)作为正例、\( (本人,他人)\)作为负例来训练比照学习模型。当然,其实远没有这么简略,如果仅仅只是完全相同的两个样本作正例,那么泛化能力会大打折扣。一般来说,咱们会应用一些数据扩增伎俩,让正例的两个样本有所差别,然而在NLP中如何做数据扩增自身也是一个问题,SimCSE提出了一个极为简略优雅的计划:间接把Dropout当做数据扩增! 具体来说,\( N\)个句子通过带Dropout的Encoder失去向量\( \boldsymbol{h}_1^{(0)},\boldsymbol{h}_2^{(0)},…,\boldsymbol{h}_N^{(0)} \),而后让这批句子再从新过一遍Encoder(这时候是另一个随机Dropout)失去向量\( \boldsymbol{h}_1^{(1)},\boldsymbol{h}_2^{(1)},…,\boldsymbol{h}_N^{(1)} \) ,咱们能够\( (\boldsymbol{h}_i^{(0)},\boldsymbol{h}_i^{(1)}) \)视为一对(略有不同的)正例,那么训练指标为其中,\( \text{sim}(\boldsymbol{h}_1, \boldsymbol{h}_2)=\frac{\boldsymbol{h}_1^T\boldsymbol{h}_2}{\Vert \boldsymbol{h}_1\Vert \cdot \Vert \boldsymbol{h}_2\Vert} \)。实际上式(1)如果不看\( -\log \)和\( \tau \)的局部,剩下的局部十分像是\( \text{Softmax} \)。论文中设定\( \tau = 0.05 \),至于这个\( \tau \)有什么作用,我在网上看到一些解释: 如果间接应用余弦类似度作为logits输出到\( \text{Softmax} \),因为余弦类似度的值域是\( [-1,1] \),范畴太小导致\( \text{Softmax} \)无奈对正负样本给出足够大的差距,最终后果就是模型训练不充沛,因而须要进行修改,除以一个足够小的参数\( \tau \)将值进行放大超参数\( \tau \)会将模型更新的重点,聚焦到有难度的负例,并对它们做相应的惩办,难度越大,也即是与\( {h}_i^{(0)} \)间隔越近,则调配到的惩办越多。其实这也比拟好了解,咱们将\( \text{sim}(\boldsymbol{h}_i^{(0)},\boldsymbol{h}_j^{(1)}) \)除以\( \tau \)相当于同比放大了负样本的logits值,如果\( \tau \)足够小,那么那些\( \text{sim}(\boldsymbol{h}_i^{(0)},\boldsymbol{h}_j^{(1)}) \)越凑近1的负样本,通过\( \tau \)的放大后会占主导集体感觉没有严格的数学证实,单从理性的角度去思考一个式子或者一个符号的意义是不够的,因而在查阅了一些材料后我将\( \tau \)这个超参数的作用整顿成了另一篇文章:Contrastive Loss中参数\( \tau \)的了解总结一下SimCSE的办法,个人感觉切实是太奇妙了,因为给两个句子让人类来判断是否类似,这其实十分主观,例如:“我喜爱北京”跟“我不喜爱北京”,请问这两句话到底相不类似?模型就像是一个刚出生的孩子,你教它这两个句子类似,那它就认为类似,你教它不类似,于是它当前见到相似的句子就认为不类似。此时,模型的性能或者准确度与训练过程、模型构造等都没有太大关系,真正影响模型预测后果的是人,或者说是人标注的数据 ...

December 29, 2021 · 2 min · jiezi

关于nlp:通用模型全新框架WavLM语音预训练模型全解

(转载自微软研究院AI头条) 编者按:深度神经网络模型近年来尽管在各项语音工作上都有所停顿,但却仍依赖于大量的标注数据。而自监督训练方法的呈现和倒退则在肯定意义上缓解了该问题。近日,微软亚洲研究院与微软 Azure 语音组的研究员们在判别式自监督预训练方法的根底上,沿用研究院自然语言计算组在自然语言预训练的 Transformer 模型架构,提出了全新的 Denoising Masked Speech Modeling 框架。通过94,000小时的英语语音进行预训练,通用语音预训练模型 WavLM 在 SUPERB 所有13项语音工作测评中超过先前所有模型,排名第一,并在其它4个不同的语音经典测评数据集上都获得了很好成果。 近两年来,预训练模型在自然语言解决和计算机视觉畛域引起了学术界和工业界的宽泛关注。利用大规模无监督数据进行训练的预训练模型有着十分好的泛化性,只需在小规模标注数据上进行微调,就能够在相应工作上有所提高。尽管之前预训练模型在语音解决畛域曾经获得了一些停顿,但其只在语音辨认工作上进行了验证。 为此,微软亚洲研究院与微软 Azure 语音组的研究员们提出了通用语音预训练模型 WavLM。通过 Denoising Masked Speech Modeling 框架,研究员们将 WavLM 适配到了17个工作上,并且都获得了十分好的成果,这使得语音预训练模型的有效性从语音辨认工作延长到了非内容辨认的语音工作。基于在94,000小时无监督的英文数据上进行训练,WavLM 还在多个语音相干的数据集上都获得了 SOTA 的问题。目前,该模型曾经开源,并集成到了 Hugging Face 的 Transformer 框架中不便使用者调用。 论文链接:https://arxiv.org/pdf/2110.13...开源链接:https://aka.ms/wavlmHugging Face集成链接:https://huggingface.co/micros...从自监督预训练方法看语音工作生成式&判别式自监督预训练方法在过来的几年中,深度神经网络模型尽管在语音的多种工作上都获得了突破性停顿,但却仍旧受制于模型训练时所需的大量标注数据。自监督预训练方法的呈现在肯定水平上缓解了这一问题。该办法先应用大规模无监督数据进行预训练,随后将训练好的模型在小规模标注数据上进行微调。已有钻研表明,应用自监督预训练能够晋升多种语音工作的性能。 依据预训练指标的不同,自监督预训练方法可分为生成式和判别式。生成式包含通过间断或离散的隐变量还原原始的语音特色,比方自编码器能够预测将来时刻或被掩码遮蔽的语音特色。而判别式则通过比照学习或者预测离散化索引(id)的形式对模型进行预训练,例如 wav2vec2.0 和 HuBERT。将 wav2vec2.0 和 HuBERT 两种办法在6万小时的数据上进行预训练后,能够发现其在语音辨认数据集 Librispeech 上获得了 SOTA 的性能。这两种办法均应用了声波作为模型输出,并通过 CNN 模块进行降采样,降采样后的特色被随机遮蔽(mask)并输出进 Transformer 编码器。wav2vec2 应用了比照学习进行模型训练,通过引入一个向量量化器(vector quantizer)对未遮蔽的 CNN 输入进行离散化,并在被遮蔽地位的 Transformer 的输入示意上计算 InfoNCE 损失,其中正样本来自该地位离散化后的向量,负样本来自于该语音序列中其余地位的离散化向量。而 HuBERT 则借鉴了 BERT 当中的 mask language model 的损失函数,并应用 Transformer 预测被遮蔽地位的离散 id 来训练模型。HuBERT 应用了迭代的形式生成训练指标,即每一帧的离散 id。微软亚洲研究院的研究员们首先对语音的 MFCC 特色进行了 k-means 聚类来生成学习第一代 HuBERT 模型的离散 id,随后对已训练好的上一代模型的输入示意进行聚类并生成新的id来进行下一轮次的学习。 ...

December 27, 2021 · 2 min · jiezi

关于nlp:NLP-开源形近字算法补完计划完结篇

前言所有的故事都有开始,也终将完结。 本文将作为 NLP 汉字类似度的完结篇,为该系列画上一个句号。 起-NLP 中文形近字类似度计算思路 承-中文形近字类似度算法实现,为汉字 NLP 尽一点绵薄之力 转-当代中国最贵的汉字是什么? 不足之处之所以有本篇,是因为上一次的算法实现存在一些有余。 巴别塔《圣经》中有对于巴别塔建造,最终人们因为语言问题而复工的故事。 创11:6 “看哪!他们成为一样的人民,都是一样的语言,现在既作起这事来,当前他们所要作的事,就没有不成就的了。创11:7 咱们上来,在那里变乱他们的口音,使他们的语言彼此不通。”创11:8 于是,耶和华使他们从那里扩散在全地上;他们就复工不造那城了。为了防止语言问题,我一开始就实现了一个 exe4j 打包的比照程序,本人跑的很顺畅。 小伙伴一跑,运行失败。各种环境配置一顿操作,最初还是报错。 于是,我写了一个 python 繁难版本,便于做 NLP 钻研的小伙伴们学习。 https://github.com/houbb/nlp-hanzi-similar/releases/tag/pythnjava 是一种语言,python 是一种语言。 编程语言,让人和机器之间能够沟通,却让人与人之间产生了隔膜。 拆字在 当代中国最贵的汉字是什么? 一文中,咱们首次阐明了汉字的拆合。 汉字的拆分实现,外围目标之一就是为了欠缺汉字的类似度比拟。 通过比照汉字的拆分局部,而后获取拆字的类似度,进步比照的准确性。 拆字类似度简略的需要为了便于小伙伴们了解,咱们用产品经理的思维和大家介绍一下实现形式。 我的需要比较简单。你看,【明】能够拆分【日】【月】,【冐】也能够拆分为【日】【月】。比照一下,后果是显然的。怎么实现我不论,今天上线吧。小伙伴们,应该曾经晓得怎么实现了吧? 应用体验诚如产品所言,这个需要曾经实现。 maven 引入<dependency> <groupId>com.github.houbb</groupId> <artifactId>nlp-hanzi-similar</artifactId> <version>1.2.0</version></dependency>应用double rate1 = HanziSimilarHelper.similar('末', '未');对应的后果为:0.9696969696969697 更多应用细节,参考开源地址: https://github.com/houbb/nlp-hanzi-similar写在完结前波及的我的项目汉字的类似度计算到这里算是告一段落。 次要波及的材料及我的项目有: 拼音 拆字 四角编码词库 汉字结构词库 汉字偏旁词库 笔画数词库 当然,还能够后果 opencc4j 进行繁简体的解决,此处不再延长。 之后的打算NLP 的畛域还有很多货色须要大家攻克,毕竟中文 NLP 才刚刚开始。 技术尚未胜利,同志仍需致力。 据说最近鹅城的某位黄老爷惹得大家口碑载道。 很多小伙伴说,如果有一款软件能够实现【月丷夫马言卂彳山兀攴人言】的沟通性能,那么我必定会用。 所谓说者无心,听者无意。 写一个通信软件,次要是为了坚固下 netty 的学习,其余的都不重要。 ...

November 25, 2021 · 2 min · jiezi

关于nlp:当代中国最贵的汉字是什么

最贵的汉字“你说,当代中国最贵的汉字是什么?”,有一天共事突然问我。 “【诺】,因为空头支票”,我脱口而出。 “不对。” “【字】,一字千金?” 共事点头。 “爱?” “这个是无价的,不算。” “人才。不是说 21 世纪最贵的是人才吗?” “一个字,你这不算。你咋不说家书抵万金呢?” “算了,不猜了。”,我脑海里为数不多的几个字转了一圈,没有一个合乎的。 我有些纳闷地看着他,示意放弃。 “答案是拆。” “拆?” “对。拆,拆迁的拆。” 说完,共事笑了笑。笑中带着三分世俗,六分狡黠,还有一分苍凉。 "拆,财。一拆,财就有了。" 不过,我却糊涂起来,“那么这个拆,是和你有关系呢?还是和我有关系呢?” “都有关系”,共事顿了顿,“也都没有。” “和我俩有啥关系,咱们把房东的房子拆了周游世界?” "No,咱们明天来拆点别的。不拆房子。" “不拆房子,那拆什么?” “拆字。” “字?” “对。字,汉字的字。” 拆字“汉字,晓得吧?”,共事持续说着。 “废话。小学生都晓得的问题。” “汉字的三要素晓得吗?” “音形义。” “你晓得如何用程序实现两个形近字的判断吗?” “你是没关注老马吧,他前两天刚写了一篇 NLP 形近字的实现算法。” “那篇算法我看了,一般般吧。有些场景不适应。” “比方?” “比方【明】与【冐】,构造不同,偏旁不同。然而他俩像不像?” 实在文化限度了我的想象力,在震惊了 0.9 秒之后,我立即反驳。 “说的笨重,说的你能解决这个问题一样?” 共事笑了笑,“难也不难。这就波及到明天的配角,拆字。” “哦。愿闻其详。” “咱们能够把汉字拆开最根本的组成部分,比方【明】能够拆成【日】【月】,【冐】也是相似的。而后去比拟每一个局部是否雷同,用来计算类似度。” “这倒是挺不错”,我不禁拍板称誉,“那么问题来了,这种拆字程序要多久能力实现呢?” 共事笑了笑,“在下不才,这两天上班期间写好了一个拆字程序。” “秀啊,你给拆一个秦时明月汉时关我瞅瞅。” 共事小手一敲,后果输入 手乀禾日寸日月冂一一水又日寸丷天。 “能够能够。除了 NLP 形近字,你这程序还有啥用?” “用途挺多的,不过最次要的是帅。比方这张我用拆字联合云图主动生成的图片。” 技术总会过期,然而帅,却是一辈子的事件。 “你晓得这个图,是由哪一句话拆分失去的吗?给你个提醒,出自一首词。” 合字想到共事给出的难题,最近日夜难寐,到底要怎么解呢? 正所谓,天下大势,合久必分,分久必合。 既然汉字能拆分,那么,能不能合并呢? 于是花了两天工夫,写了一个汉字的合并程序。 能够把 手乀禾日寸日月冂一一水又日寸丷天 合并为 秦时明月汉时关。 共事看了后,感觉挺乏味。 “你这个怎么实现的,有点意思。” “不难,和汉字的拆分逻辑反过来就行。” ...

November 24, 2021 · 1 min · jiezi

关于nlp:NLP-中文形近字相似度算法开源实现

我的项目简介nlp-hanzi-similar 为汉字提供相似性的计算。 创作目标有一个小伙伴说本人在做语言认知科学方向的课题钻研,看了我以前写的 NLP 中文形近字类似度计算思路 就想问下有没有源码或者相干材料。 国内对于文本的类似度计算,开源的工具是比拟丰盛的。 然而对于两个汉字之间的类似度计算,国内根本一片空白。国内的参考的材料少的可怜,国外相干文档也是如此。 于是将以前写的类似度算法整顿开源,心愿能帮到这位小伙伴。 本我的项目旨在抛砖引玉,实现一个根本的类似度计算工具,为汉字 NLP 奉献一点绵薄之力。 个性fluent 办法,一行代码搞定所有高度自定义,容许用户定义本人的实现词库自定义,适应各种利用场景丰盛的实现策略默认实现了基于 四角编码+拼音+汉字结构+汉字偏旁+笔画数 的类似度比拟。 变更日志变更日志疾速开始须要jdk1.7+ maven 3.x+ maven 引入<dependency> <groupId>com.github.houbb</groupId> <artifactId>nlp-hanzi-similar</artifactId> <version>1.0.0</version></dependency>疾速开始根本用法HanziSimilarHelper.similar 获取两个汉字的类似度。 double rate1 = HanziSimilarHelper.similar('末', '未');后果为: 0.9629629629629629自定义权重默认是依据 四角编码+拼音+汉字结构+汉字偏旁+笔画数 进行类似度比拟。 如果默认的零碎权重无奈满足你的需要,你能够通过自定义权重调整: double rate = HanziSimilarBs.newInstance() .jiegouRate(10) .sijiaoRate(8) .bushouRate(6) .bihuashuRate(2) .pinyinRate(1) .similar('末', '未');自定义类似度有些状况下,零碎的计算是无奈满足的。 用户能够在根目录下 hanzi_similar_define.txt 进行自定义。 入人 0.9人入 0.9这样在计算 人 和 入 的类似度时,会优先以用户自定义的为准。 double rate = HanziSimilarHelper.similar('人', '入');此时的后果为用户自定义的值。 疏导类阐明为了便于用户自定义,HanziSimilarBs 反对用户进行自定义配。 HanziSimilarBs 中容许自定义的配置列表如下: 序号属性阐明1bihuashuRate笔画数权重2bihuashuData笔画数数据3bihuashuSimilar笔画数类似度策略4jiegouRate构造权重5jiegouData构造数据6jiegouSimilar构造类似度策略7bushouRate部首权重8bushouData部首数据9bushouSimilar部首类似度策略10sijiaoRate四角编码权重12sijiaoData四角编码数据13sijiaoSimilar四角编码类似度策略14pinyinRate拼音权重15pinyinData拼音数据16pinyinSimilar拼音类似度策略17hanziSimilar汉字类似度外围策略18userDefineData用户自定义数据所有的配置都能够基于接口,用户进行自定义。 疾速体验阐明如果 java 语言不是你的次要开发语言,你能够通过上面的 exe 文件疾速体验一下。 ...

November 22, 2021 · 2 min · jiezi

关于nlp:微软亚洲研究院NLP领域最新研究一览

编者按:EMNLP(Conference on Empirical Methods in Natural Language Processing)是计算语言学和自然语言解决畛域的顶级国内学术会议。往年的 EMNLP 大会于11月7日-11日正式在线上召开。在本届大会中,微软亚洲研究院有多篇论文入选,明天咱们精选了其中的6篇来为大家进行简要介绍。欢送感兴趣的读者浏览论文原文,一起理解自然语言解决畛域的前沿停顿! CAST: 通过对形象语法树的层次化切分与重建来加强代码摘要的生成 论文链接:https://arxiv.org/abs/2108.12987 代码链接:https://github.com/DeepSoftwa... 代码摘要生成工作旨在了解实在的代码片段,并主动生成天然语句,进而实现形容这段代码的性能。因为摘要可能精简地形容代码的性能、可读性强,所以良好的摘要能够帮忙开发者更便捷地了解、重用和保护代码,大大提高生产效率。然而,事实中的摘要却存在着缺失、谬误和未及时更新等问题,而且人为标注代码的摘要须要具备肯定的专业知识背景,整个过程耗时耗力。因而,主动为代码生成摘要尤为重要。 近年来,很多钻研人员应用各种技术建模富含语法和构造信息的形象语法树(AST), 以此来更好地生成代码摘要。然而,因为程序的复杂性,形象语法树个别又大又深、难以建模。现有办法也存在着树的构造被毁坏、训练代价大、信息失落等诸多限度。为此,微软亚洲研究院的研究员们提出了一种层次化切分和重组 AST 的办法——CAST。其外围在于将 AST 层次化地切分成适合粒度的子树,使得每个子树蕴含绝对残缺的语义;独立建模子树后再依照切分前子树的绝对地位,重新聚合子树的表征。这样能够使 AST 的构造更容易被建模,代码的语义可能更加残缺地被构建,生成的摘要体现的语义也更加全面。 (图1:代码及其形象语法树(AST),切分的子树以及构造树的示意图) CAST 模型抉择了罕用的序列到序列的架构,次要蕴含三个模块:AST 的编码器、代码编码器和摘要解码器。AST 的编码器用来建模代码的语义和构造信息;代码编码器用来建模变量名层面的词汇和语义信息;解码器则联合两个编码器失去的代码表征以及复制机制来生成代码摘要。 (图2:CAST 模型的架构示意图) 研究员们在两个公开的数据集、四种掂量指标下进行了自动化测试,并且发展了人工测评试验。大量试验后果证实了该办法的有效性。 (表1:在两个数据集、四种自动化指标下的试验后果) (表2:人工评估下的试验后果,括号外为均分(满分4分),括号内为方差) 嵌入语言联盟(Representation Sprachbund)的发现及其对多语言预训练的作用 论文链接:https://arxiv.org/abs/2109.00271 作为古代自然语言解决(NLP)中一个重要技术分支,多语言 NLP 旨在使现有 NLP 技术解脱语言品种的限度,可能应用一个模型同时解决上百种语言的工作。目前多语言预训练模型的外围挑战在于:现存的许多数据集都仅有英语训练数据,而其余泛滥应用人数较少的低资源语言上仅有测试数据。如果应用英语数据对多语言模型进行微调,在其余语言上测试,所失去的后果和英语上的构造存在较大的差距。面对上述挑战,微软亚洲研究院的研究员们从语言学实践中的 Sprachbund 受到启发,设计出了如下图所示的多语言 NLP 新范式。 (图3:嵌入语言联盟发现与预训练的流程) Sprachbund 是一个德语语言学术语,示意没有亲属关系的语言,因为长期共处于一个地区而在语言构造上产生独特区域特色的景象。研究员们认为预训练时语言之间较大的差异性是导致跨语言模型体现较差的起因。因而,研究员们提出了 Representation Sprachbund 的概念,用来指一系列具备类似嵌入示意的语言。研究员们通过跨语言预训练模型提取出语言的嵌入示意,将语言示意进行聚类为多个 Representation Sprachbund,针对每一类嵌入示意类似的 Representation Sprachbund 语言进行预训练。在 XGLUE 和 XTREME 等多个跨语言基准工作上发展的试验表明,本文的办法可能在基线模型根底上获得显著晋升。 (表3:在跨语言基准工作上的后果) 本文另一个重要的奉献是摸索了预训练语言模型失去的语言嵌入示意散布与语言学实践的关系,包含 Language Family, Sprachbund 和语言语法。 (图4:语言嵌入示意的可视化剖析) 本文通过可视化剖析揭示了语言嵌入示意丰盛的语言学性质。研究员们心愿将来进一步摸索基于深度学习的多语言 NLP 与经典语言学实践的分割。 ...

November 14, 2021 · 2 min · jiezi

关于nlp:EMNLP-2021-LayoutReader基于ReadingBank的阅读序列抽取模型

编者按:浏览序列抽取是文档智能剖析中一项十分重要的工作,其旨在通过抽取扫描文档或数字商业文档中的单词并从新进行排序,将本来独立的单词组合成读者能够了解的文本。但因为日常工作生存中应用的文档,往往模板和格局各不相同,所以在呈现简单格局时,依照传统办法进行排列往往无奈获得较好的成果。因而,微软亚洲研究院自然语言计算组的研究员们构建了首个大规模浏览序列数据集 ReadingBank,并基于 ReadingBank 提出了浏览序列抽取模型 LayoutReader。本文将对 ReadingBank 和 LayoutReader 的实现原理进行简要介绍,欢送感兴趣的读者点击浏览原文理解论文中的更多详情,本文已被 EMNLP 2021 作为长文录取。 浏览序列抽取是指通过抽取扫描文档或数字商业文档中的单词并从新进行排序,将本来独立的单词组合成读者能够了解的文本。对于大部分电子文档,如网页、Word 文档等,获取正确的浏览序列并不艰难,只有剖析源代码即可。然而许多扫描文档或 PDF 文档并不具备这样的信息。因而,谬误的浏览序列不仅让读者无奈了解,还会导致文档智能剖析难以进行,因为文档智能剖析是将扫描文档或数字商业文档中的要害信息抽取,把非结构化的信息更加结构化,进而实现自动化文档了解的。 然而,现有的文档智能分析模型仍依赖文档内容的输出程序,若要害信息局部呈现错乱,很有可能导致模型判断谬误或脱漏信息。因而,浏览序列抽取是文档智能剖析中一项十分重要的工作。 日常工作、生存中的文档具备各种不同的模版和格局,为了提取浏览序列,传统办法往往间接将单词依照从左到右、从上到下的程序进行排列或通过人工来匹配模版。但当呈现多栏、表格等格局时,传统办法通常就会生效。若为了应答品种繁多的文档类型,则须要引入大规模预训练语言模型,借助文档中的文本信息、布局地位等信息进行浏览序列抽取。 图1:ReadingBank 数据集中文档图片的浏览序列示意图 因为现有数据集存在着不能满足预训练要求且人工标注构建新数据集的老本过低等问题。所以,微软亚洲研究院自然语言计算组的研究员们利用 Word 文档中的 XML 源码,构建了首个大规模浏览序列数据集 ReadingBank,并基于 ReadingBank 提出了浏览序列抽取模型 LayoutReader。 首个大规模浏览序列数据集ReadingBank以后多模态信息抽取模型(LayoutLM、LayoutLMv2)通常依赖文档中的文字内容和对应的地位。所以ReadingBank包含两局部:依照正确浏览顺序排列的文字内容(浏览序列),以及这些文字在以后页面内的地位。 文档收集Word 文档有两种格局,别离为 .doc 和 .docx,这里只应用 .docx 文档,因为须要借助其解压缩后的 XML 源码。研究员们通过文档长度和语言检测 API 过滤掉低质量的文本和非英文的文档,最终共爬取了210,000个英文 .docx 文档,并随机抽取了其中的500,000页作为数据集 获取浏览序列浏览序列是以后文档中依照正确浏览顺序排列的文字内容,如何在不借助人工标注的状况下失去正确的浏览程序是个难题。为此,研究员们借助了 Word 文档中的 XML 源码,构建出了正确的浏览序列。XML 源码中记录了 Word 文档中的所有信息,并依照文档自身的浏览程序顺次排列。于是,研究员们首先借助了开源工具 python-docx 解析网络上爬取的 .docx 文档,而后逐个段落、逐个单元格遍历整个文档,进而取得浏览序列。 获取对应地位信息尽管 Word 文档蕴含了正确的浏览程序信息,然而 XML 源码并不记录对应的地位,而是当用户打开文档时再进行实时渲染。为了固定文字取得精确的地位信息,研究员们借助了 PDF Metamorphosis .Net 工具,将 Word 文档转换为 PDF,再通过 PDF 解析器,获取文字在 PDF 页面内的地位。 ...

November 8, 2021 · 2 min · jiezi

关于nlp:性能加速最高可达28倍这个NLP工具包不容错过

导读PaddleNLP 是兼具科研学习和产业实际能力的 Python NLP 工具包,提供中文畛域丰盛的预训练模型和部署工具,被高校、企业开发者广泛应用。近日,PaddleNLP v2.1正式公布,为开发者带来三项重要更新: 开箱即用的工业级NLP预置工作能力Taskflow:八大经典场景一键预测。预训练时代的微调新范式利用:三行代码显著晋升小样本学习效果。高性能预测减速:文本生成工作高达28倍减速成果。传送门: https://github.com/PaddlePadd... PaddleNLP整体开源能力速览PaddleNLP是飞桨生态的自然语言解决开发库,旨在晋升文本畛域的开发效率,为开发者带来模型构建、训练及预测部署的全流程优质体验。 PaddleNLP性能全景图 PaddleNLP我的项目自公布以来,就受到宽广NLPer的关注。在2021年6月PaddleNLP官网直播打卡课中,有7000+ 用户加入PaddleNLP的我的项目学习和实际,减速了本身科研和业务实际过程,同时也带动PaddleNLP屡次登上GitHub Trending榜单。 那么最近的2021年10月份更新,PaddleNLP又给大家带来哪些惊喜呢?下文将为您逐个细细解读。 PaddleNLP全新降级深刻解读**开箱即用的工业级NLP预置工作能力——Taskflow** 依靠于百度在多年语言与常识畛域的业务积淀,PaddleNLP面向NLP八种工作场景,聚合了泛滥百度自研的算法以及社区开源模型,并凭借飞桨外围框架的能力降级提供开箱即用、极致优化的高性能一键预测能力——Taskflow。 本次Taskflow降级笼罩自然语言了解(NLU)和生成(NLG)两大场景共八大工作,包含中文分词、词性标注、命名实体辨认、句法分析、文本纠错、情感剖析、生成式问答和智能写诗。 这些高质量模型的背地,一方面聚合了百度在语言与常识畛域多年的业务积淀和当先的开源成绩:如词法剖析工具LAC、句法分析工具DDParser、情感剖析零碎Senta、文心ERNIE系列家族模型、凋谢域对话预训练模型PLATO、文本常识关联框架解语等;另一方面也涵盖了开源社区优良的中文预训练模型如CPM等。 将来Taskflow会随着PaddleNLP的版本迭代一直裁减技能,如凋谢域对话、文本翻译、信息抽取等能力,以满足更多NLP开发者的需要。 如下图所示,通过PaddleNLP Taskflow,只须要一行代码,传入工作名称即可主动抉择最优的预置模型,并且以极致优化的形式实现推理,开发者能够不便地集成到上游的利用中。 Taskflow应用示意图 https://github.com/PaddlePadd... **预训练时代的微调新范式利用:三行代码晋升小样本学习效果** Few-Shot Learning(以下简称FSL)是机器学习的一个子畛域。在仅有多数监督样本的状况下,训练失去强泛化能力的模型,实现对新数据的分类。 联合最新的Prompt Tuning的思维,PaddleNLP中集成了三大前沿FSL算法: EFL(Entailment as Few-Shot Learner)[1],将 NLP Fine-tune工作对立转换为二分类的文本蕴含工作;PET(Pattern-Exploiting Training)[2],通过人工构建模板,将分类工作转成完形填空工作;P-Tuning[3]:主动构建模板,将模版的构建转化为间断参数优化问题。应用小样本学习策略,仅仅32条样本即可在电商评论分类工作上获得87%的分类精度[4]。此外,PaddleNLP集成 R-Drop 策略作为 API,只须要减少三行代码即可在原工作上疾速涨点,如图所示: https://github.com/PaddlePadd... **高性能预测减速:文本生成场景高达28倍减速成果** PaddleNLP与NVDIA强强联合,以FasterTransformer[5]为根底,提供了Faster系列的推理API,重点拓展了更多支流网络结构适配与解码策略反对。同时联合飞桨外围框架2.1版本全新的自定义OP的性能,提供了与飞桨框架无缝连接的应用体验。 FasterTransformer Decoding Workflow (1) 大幅晋升生成工作的推理能力在Transformer机器翻译、GPT文本生成两个工作中,别离比照应用动态图版本的性能和内置Faster系列的推理API后,不同batch size下预测性能减速比,从比照数据能够看到无论Transformer还是GPT,均可失去高达28倍推理速度晋升! PaddleNLP Transformer翻译模型减速优化前后的 Nsight Profling比照图 (2)反对丰盛的经典解码策略PaddleNLP v2.1提供工业界支流的解码减速反对,包含经典的Beam Search,以及多个Sampling-based的解码形式:如Diverse Sibling Search[6]、T2T版本的Beam Search实现[7]、Top-k/Top-p Sampling等。丰盛的减速策略能够满足对话、翻译等工业场景的理论利用,同时PaddleNLP的减速实现也在百度外部通过了大规模互联网业务的实在考验。 表1:PaddleNLP 2.1 反对减速的模型构造与解码策略 更多PaddleNLP减速应用文档能够参考: ...

October 14, 2021 · 1 min · jiezi

关于nlp:NLP应用于司法系统综述

How Does NLP Benefit Legal System: A Summary of Legal Artificial Intelligence Abstract司法人员常常思考应用rule-based和symbol-based办法解决工作,NLP研究者次要思考data-driven和embedding办法。 在这篇文章中就次要探讨Legal AI的历史、现况、和将来的钻研方向。 进行了一些试验来对现有的工作进行更有深度的剖析,剖析他们的优缺点,并揭示一些将来的钻研方向。 可解释性强的symbolic models的效率不高,embedding-methods有更好的性能,但通常没有好的解释性,在一些道德相干的问题上有比拟大的问题:经典性别和种族偏见。 咱们总结了symbol-based methods和embedding-based办法独特面临的三个次要的挑战: 常识建模(Knowledge Modeling)。因为司法文本格式化水平好(well formalized)有很多的domain 常识和概念。用好这些knowledge很重要。司法推理(Legal Reasoning)。LegalAI必须严格遵循法律条文。因而联合事后定义的规定和AI技术对于司法推理就十分重要。可解释性(Interpretability)。本文的钻研奉献次要如下: 从NLP研究者和司法人员两个角度,来形容现存的工作。形容三个经典的利用,包含裁决预测(judgment prediction),类似案件匹配(similar case matching)和司法问题答复(legal question answering)来强调为什么这两种办法对于LeaglAI比拟重要。在多个数据集上进行了沉重的试验,来揭示怎么利用NLP技术和司法常识去克服LegalAI中的挑战。这些实现能够在github上找到。https://github.com/thunlp/CLAIM总结了LegalAI数据集,能够被看作是benchmark。数据集在github中颁布,还有一些比拟有浏览价值的司法paper。https://github.com/thunlp/LegalPapers2 Embedding-based Methods2.1 Character, Word, Concept Embeddings字和词嵌入很重要。 间接从司法案情形容中学习出业余词汇很艰难。为了克服这种艰难,能够同时捕获语法信息和司法常识。 knowledge graph methods在司法畛域很有前景,然而在理论应用之前,还是有两个次要的挑战: 结构LegalAI的常识图谱(knowledge graph)很简单。很多状况下,没有提前制作好的knowledge graph能够应用,研究者须要从零开始构建。另外,有一些不同的司法概念在不同的国家里有不同的涵义。一些研究者尝试去嵌入(embed)司法词典,这是一种可替换的办法。一个泛化水平高的司法常识图谱在模式上和其余常常在NLP中应用的常识图谱不太一样。现有的常识图谱关怀实体(entity)和概念(concept)之间的关系(relationship),但LegalAI更多地专一于解释司法概念。这两种挑战让LegalAI通过embedding进行常识建模不平庸(non-trivial)。研究者在将来会尝试去克服这些艰难。 2.2 Pretrained Language Models预训练的语言模型(Pretrained language model,PLM)比方BERT,最近集中于很多NLP的畛域。鉴于预训练模型的胜利,在LegalAI中应用预训练模型是一个很正当很间接的抉择。然而在司法文本中,这里还有一些不同,如果间接应用这些PLM会导致不好的性能。这些不同就来自于司法文本中所蕴含的术语和常识。为了解决这些问题,Zhong(2019)提出了一个中文司法文档的预训练模型,包含民事和(civil)刑事(criminal)案件的文档。针对司法畛域设计的PLM给LegalAI工作提供了一个更有品质的baseline零碎。咱们在试验中比照不同的BERT模型利用于LegalAI工作。 对于在将来摸索LegalAI中的PLM,研究者能够把指标放在整合knowledge进入PLM。整合knowledge进入预训练模型能够帮忙推理司法概念之间。很多工作曾经做了,去把general domain融入模型。 3. Symbol-based Methodssymbol-based methods也被叫做structured prediction methods。 符号化的司法常识包含:事件(events)和关系(relationship),这些能够提供可解释性。 深度学习办法能够用于进步symbol-based methods的性能。 3.1 Information Extraction信息提取(information extraction,IE)曾经被宽泛地在NLP中被钻研。IE强调从文本中提取有价值的信息,一些技术比方:实体辨认(entity recognition),关系提取(relation extraction),事件提取(event extraction)。 为了更好的应用司法文本,研究者尝试应用本体论(ontology)或者寰球一致性(global consistency)在LegalAI的命名实体辨认(named entity recognition)工作中。为了从司法文本中提取关系和事件,研究者尝试去应用不同的办法,包含:人工规定(hand-crafted rules),CRF(不晓得这是啥),联结模型比方SVM,CNN,GRU,或者(scale-free identifier network)(不晓得这是啥)。 ...

October 1, 2021 · 2 min · jiezi

关于nlp:贪心京东NLP实训营一期完结

download:贪婪京东NLP实训营一期【完结】实现一名合格的NLP工程师,从线上实习开始实现企业真是我的项目,取得京东颁发的我的项目实习证实

September 7, 2021 · 1 min · jiezi

关于nlp:美团商品知识图谱的构建及应用

商品常识图谱作为新批发行业数字化的基石,提供了围绕商品的精准结构化了解,对业务利用起到了至关重要的作用。相比于美团大脑中原有的围绕商户的图谱而言,商品图谱需应答更加扩散、简单、海量的数据和业务场景,且面临着信息起源品质低、数据维度多、依赖常识以及专业知识等挑战。本文将围绕批发商品常识图谱,介绍美团在商品层级建设、属性体系建设、图谱建设人效晋升等方向的摸索,心愿对大家有所帮忙或启发。背景美团大脑近年来,人工智能正在疾速地扭转人们的生存,背地其实有两大技术驱动力:深度学习和常识图谱。咱们将深度学习演绎为隐性的模型,它通常是面向某一个具体任务,比如说下围棋、辨认猫、人脸识别、语音辨认等等。通常而言,在很多工作上它可能获得很优良的后果,同时它也有一些局限性,比如说它须要海量的训练数据,以及弱小的计算能力,难以进行跨工作的迁徙,并且不具备较好的可解释性。在另一方面,常识图谱作为显式模型,同样也是人工智能的一大技术驱动力,它可能宽泛地实用于不同的工作。相比深度学习,常识图谱中的常识能够积淀,具备较强的可解释性,与人类的思考更加贴近,为隐式的深度模型补充了人类的常识积攒,和深度学习互为补充。因而,寰球很多大型的互联网公司都在常识图谱畛域踊跃进行布局。 美团连贯了数亿用户和数千万商户,背地也蕴含着丰盛的日常生活相干常识。2018年,美团常识图谱团队开始构建美团大脑,着力于利用常识图谱技术赋能业务,进一步改善用户体验。具体来说,美团大脑会对美团业务中波及到的千万级别商家、亿级别的菜品/商品、数十亿的用户评论,以及背地百万级别的场景进行深刻的了解和结构化的常识建模,构建人、店、商品、场景之间的常识关联,从而造成生存服务畛域大规模的常识图谱。现阶段,美团大脑已笼罩了数十亿实体,数百亿三元组,在餐饮、外卖、酒店、金融等场景中验证了常识图谱的有效性。 在新批发畛域的摸索美团逐渐冲破原有边界,在生存服务畛域摸索新的业务,不仅局限于通过外卖、餐饮帮大家“吃得更好”,近年来也逐渐拓展到批发、出行等其余畛域,帮大家“生存更好”。在批发畛域中,美团先后落地了美团闪购、美团买菜、美团优选、团好货等一系列相应的业务,逐渐实现“万物到家”的愿景。为了更好地反对美团的新批发业务,咱们须要对背地的批发商品建设常识图谱,积攒结构化数据,深刻对批发畛域内商品、用户、属性、场景等的了解,以便能更好地为用户提供批发商品畛域内的服务。 相比于围绕商户的餐饮、外卖、酒店的等畛域,批发商品畛域对于常识图谱的建设和利用提出了更大的挑战。一方面,商品数量更加宏大,笼罩的畛域范畴也更加广阔。另一方面,商品自身所具备的显示信息往往比拟稠密,很大水平上须要联合生存中的常识常识来进行推理,方可将暗藏在背地的数十维的属性进行补齐,实现对商品残缺的了解。在下图的例子中,“乐事黄瓜味”这样简略的商品形容其实就对应着丰盛的隐含信息,只有对这些常识进行了结构化提取和相应的常识推理后,才可能更好的反对上游搜寻、举荐等模块的优化。 商品图谱建设的指标咱们针对美团批发业务的特点,制订了多层级、多维度、跨业务的批发商品常识图谱体系。 多层级 在不同业务的不同利用场景下,对于“商品”的定义会有所差异,须要对各个不同颗粒度的商品进行了解。因而,在咱们的批发商品常识图谱中,建设了五层的层级体系,具体包含: L1-商品SKU/SPU:对应业务中所售卖的商品颗粒度,是用户交易的对象,往往为商户下挂的商品,例如“望京家乐福所售卖的蒙牛低脂高钙牛奶250ml盒装”。这一层级也是作为商品图谱的最底层的基石,将业务商品库和图谱常识进行买通关联。L2-规范商品:形容商品自身客观事实的颗粒度,例如“蒙牛低脂高钙牛奶250ml盒装”,无论通过什么渠道在什么商户购买,商品自身并没有任何区别。商品条形码则是在规范商品这层的主观根据。在这一层级上,咱们能够建模围绕规范商品的主观常识,例如同一个规范商品都会具备同样的品牌、口味、包装等属性。L3-形象商品:进一步咱们将规范商品向上形象的商品系列,例如“蒙牛低脂高钙牛奶”。在这一层级中,咱们不再关注商品具体的包装、规格等,将同系列的商品聚合为形象商品,承载了用户对于商品的主观认知,包含用户对商品系列的别名俗称、品牌认知、主观评估等。L4-主体品类:形容商品主体的实质品类,列如“鸡蛋”、“奶油草莓”、“台式烤肠”等。这一层作为商品图谱的后盾类目体系,以主观的形式对商品畛域的品类进行建模,承载了用户对于商品的需要,例如各品牌各产地的鸡蛋都可能满足用户对于鸡蛋这个品类的需要。L5-业务类目:相比于主体品类的后盾类目体系,业务类目作为前台类目体系会根据业务以后的倒退阶段进行人工定义和调整,各个业务会依据以后业务阶段的特点和需要建设对应的前台类目体系。多维度 商品属性视角:围绕商品自身,咱们须要有海量的属性维度来对商品进行形容。商品属性维度次要分为两类:一类是通用的属性维度,包含品牌、规格、包装、产地等;另一类是品类特有的属性维度,例如对于牛奶品类咱们会关注脂肪含量(全脂/低脂/脱脂牛奶)、存储形式(常温奶、冷藏奶)等。商品属性次要是刻画了商品的主观常识,往往会建设在规范商品这一层级上。用户认知视角:除了主观的商品属性维度以外,用户往往对于商品会有一系列的主观认知,例如商品的别名俗称(“小黑瓶”、“高兴水”)、对于商品的评估(“香甜可口”、“入口即化”、“性价比高”)、商品的清单/榜单(“进口食品榜单”、“冬季消暑常备”)等维度。这些主观认知往往会建设在形象商品这一层级上。品类/类目视角:从品类/类目标视角来看,不同品类/类目也会有各自不同的关注点。在这一层级上,咱们会建模各个品类/类目下有哪些典型的品牌、用户关注哪些典型属性、不同品类的复购周期是多长时间等。跨业务 美团大脑商品常识图谱的指标是心愿可能对主观世界中的商品常识进行建模,而非局限于单个业务之中。在商品图谱的五层体系中,规范商品、形象商品、品类体系都是与业务解耦的,围绕着主观商品所建设的,包含围绕这些层级建设的各维度数据也均是刻画了商品畛域的主观常识。 在利用于各个业务当中时,咱们将主观的图谱常识向上关联至业务前台类目,向下关联至业务商品SPU/SKU,则能够实现各个业务数据的接入,实现各个业务数据和主观常识之间的联通,提供更加全面的跨业务的全景数据视角。利用这样的数据,在用户方面咱们能够更加全面的建模、剖析用户对于业务、品类的偏好,对于价格、品质等的敏感水平,在商品方面咱们能够更精确的建模各品类的复购周期、地区/节令/节日偏好等。 商品图谱建设的挑战商品常识图谱的构建的挑战次要来源于以下三个方面: 信息起源品质低:商品自身所具备的信息比拟匮乏,往往以题目和图片为主。尤其在美团闪购这样LBS的电商场景下,商户须要上传大量的商品数据,对于商品信息的录入存在很多信息不残缺的状况。在题目和图片之外,商品详情尽管也蕴含着大量的常识信息,然而其品质往往参差不齐,并且构造各异,从中进行常识开掘难度极高。数据维度多:在商品畛域有泛滥的数据维度须要进行建设。以商品属性局部为例,咱们不仅须要建设通用属性,诸如品牌、规格、包装、口味等维度,同时还要笼罩各个品类/类目下特定关注的属性维度,诸如脂肪含量、是否含糖、电池容量等,整体会波及到上百维的属性维度。因而,数据建设的效率问题也是一大挑战。依赖常识/专业知识:人们在日常生活中因为有很丰盛的常识常识积攒,能够通过很简短的形容获取其背地暗藏的商品信息,例如在看到“乐事黄瓜”这样一个商品的时候晓得其实是乐事黄瓜味的薯片、看到“唐僧肉”的时候晓得其实这不是一种肉类而是一种零食。因而,咱们也须要摸索联合常识常识的语义了解办法。同时,在医药、个护等畛域中,图谱的建设须要依赖较强的专业知识,例如疾病和药品之间的关系,并且此类关系对于准确度的要求极高,须要做到所有常识都准确无误,因而也须要较好的专家和算法相结合的形式来进行高效的图谱构建。商品图谱建设在理解了图谱建设的指标和挑战后,接下来咱们将介绍商品图谱数据建设的具体计划。 层级体系建设品类体系建设 实质品类形容了商品实质所属的最细类别,它聚合了一类商品,承载了用户最终的生产需要,如“高钙牛奶”、“牛肉干”等。实质品类与类目也是有肯定的区别,类目是若干品类的汇合,它是形象后的品类概念,不可能明确到具体的某类商品品类上,如“乳制品”、“水果”等。 品类打标:对商品图谱的构建来说,要害的一步便是建设起商品和品类之间的关联,即对商品打上品类标签。通过商品和品类之间的关联,咱们能够建设起商品库中的商品与用户需要之间的关联,进而将具体的商品展现到用户背后。上面简略介绍下品类打标办法: 品类词表构建:品类打标首先须要构建一个初步的商品品类词表。首先,咱们通过对美团的各个电商业务的商品库、搜寻日志、商户标签等数据源进行分词、NER、新词发现等操作,取得初步的商品候选词。而后,通过标注大量的样本进行二分类模型的训练(判断一个词是否是品类)。此外,咱们通过联合被动学习的办法,从预测的后果中挑选出难以辨别的样本,进行再次标注,持续迭代模型,直到模型收敛。品类打标:首先,咱们通过对商品题目进行命名实体辨认,并联合上一步中的品类词表来获取商品中的候选品类,如辨认“蒙牛脱脂牛奶 500ml”中的“脱脂牛奶”、“牛奶”等。而后,在取得了商品以及对应的品类之后,咱们利用监督数据训练品类打标的二分类模型,输出商品的SPU_ID和候选品类TAG形成的Pair,即<SPU_ID,TAG>,对它进行是否匹配的预测。具体的,咱们一方面利用联合业务中丰盛的半结构化语料构建围绕标签词的统计特色,另一方面利用命名实体辨认、基于BERT的语义匹配等模型产出高阶相关性特色,在此基础上,咱们将上述特色输出到终判模型中进行模型训练。品类标签后处理:在这一步中,咱们对模型打上的品类进行后处理的一些策略,如基于图片相关性、联合商品题目命名实体辨认后果等的品类荡涤策略。通过上述的三个步骤,咱们便能够建设起商品与品类之间的分割。 品类体系:品类体系由品类和品类间关系形成。常见的品类关系包含同义词和上下位等。在构建品类体系的过程中,罕用的以下几种办法来进行关系的补全。咱们次要应用上面的一些办法: 基于规定的品类关系开掘。在百科等通用语料数据中,有些品类具备固定模式的形容,如“玉米又名苞谷、苞米棒子、玉蜀黍、珍珠米等”、“榴莲是驰名寒带水果之一”,因而,能够应用规定从中提取同义词和上下位。基于分类的品类关系开掘。相似于上文中提到的品类打标办法,咱们将同义词和上下位构建为<TAG, TAG>的样本,通过在商品库、搜寻日志、百科数据、UGC中开掘的统计特色以及基于Sentence-BERT失去的语义特色,应用二分类模型进行品类关系是否成立的判断。对于训练失去的分类模型,咱们同样通过被动学习的形式,选出后果中的难分样本,进行二次标注,进而一直迭代数据,进步模型性能。基于图的品类关系推理。在取得了初步的同义词、上下位关系之后,咱们应用已有的这些关系构建网络,应用GAE、VGAE等办法对网络进行链路预测,从而进行图谱边关系的补全。 规范/形象商品 规范商品是形容商品自身客观事实的颗粒度,和销售渠道和商户无关,而商品条形码是规范商品这层的主观根据。标品关联行将同属于某个商品条形码的业务SKU/SPU,都正确关联到该商品条形码上,从而在规范商品层级上建模相应的主观常识,例如规范商品对应的品牌、口味和包装等属性。 上面通过一个案例来阐明标品关联的具体任务和计划。 案例:下图是一个公牛三米插线板的规范商品。商家录入信息的时候,会把商品间接关联到商品条码上。通过商户录入数据实现了一部分的标品关联,但这部分比例比拟少,且存在大量的链接缺失,链接谬误的问题。另外,不同的商家对于同样的标品,商品的题目的形容是千奇百怪的。咱们的指标是补充缺失的链接,将商品关联到正确的标品上。 针对标品关联工作,咱们构建了商品畛域的同义词判断模型:通过远监督的形式利用商户曾经提供的大量有关联的数据,作为已有的常识图谱结构远监督的训练样本。在模型中,正例是置信度比拟高的标品码;负例是原始数据中商品名或者图像相似但不属于同一标品的SPU。结构准确率比拟高的训练样本之后,通过BERT模型进行同义词模型训练。最初,通过模型自主去噪的形式,使得最终的准确率可能达到99%以上。总体能做到品牌,规格,包装等维度敏感。 形象商品是用户认知的层面,作为用户所评论的对象,这一层对用户偏好建模更加无效。同时,在决策信息的展现上,形象商品粒度也更合乎用户认知。例如下图所示冰淇淋的排行榜中,列举了用户认知中形象商品对应的SKU,而后对应展现不同形象商品的特点、举荐理由等。形象商品层整体的构建形式,和规范商品层比拟相似,采纳标品关联的模型流程,并在数据结构局部进行规定上的调整。 属性维度建设对一个商品的全面了解,须要涵盖各个属性维度。例如“乐事黄瓜味薯片”,须要开掘它对应的品牌、品类、口味、包装规格、标签、产地以及用户评论特色等属性,能力在商品搜寻、举荐等场景中精准触达用户。商品属性开掘的源数据次要蕴含商品题目、商品图片和半结构化数据三个维度。 商品题目蕴含了对于商品最重要的信息维度,同时,商品题目解析模型能够利用在查问了解中,对用户疾速深刻了解拆分,为上游的召回排序也能提供高阶特色。因而,这里咱们着重介绍一下利用商品题目进行属性抽取的办法。 商品题目解析整体能够建模成文本序列标注的工作。例如,对于商品题目“乐事黄瓜薯片”,指标是了解题目文本序列中各个成分,如乐事对应品牌,黄瓜对应口味,薯片是品类,因而咱们应用命名实体辨认(NER)模型进行商品题目解析。然而商品题目解析存在着三大挑战:(1)上下文信息少;(2)依赖常识常识;(3)标注数据通常有较多的乐音。为了解决前两个挑战,咱们首先尝试在模型中引入了图谱信息,次要蕴含以下三个维度: 节点信息:将图谱实体作为词典,以Soft-Lexicon形式接入,以此来缓解NER的边界切分谬误问题。关联信息:商品题目解析依赖常识常识,例如在不足常识的状况下,仅从题目“乐事黄瓜薯片”中,咱们无奈确认“黄瓜”是商品品类还是口味属性。因而,咱们引入常识图谱的关联数据缓解了常识常识缺失的问题:在常识图谱中,乐事和薯片之间存在着“品牌-售卖-品类”的关联关系,然而乐事跟黄瓜之间则没有间接的关系,因而能够利用图构造来缓解NER模型常识常识短少的问题。具体来说,咱们利用Graph Embedding的技术对图谱进行的嵌入表征,利用图谱的图构造信息对图谱中的单字,词进行示意,而后将蕴含了图谱构造信息的嵌入示意和文本语义的表征进行拼接交融,再接入到NER模型之中,使得模型可能既思考到语义,也思考到常识常识的信息。节点类型信息:同一个词能够代表不同的属性,比方“黄瓜”既能够作为品类又能够作为属性。因而,对图谱进行Graph Embedding建模的时候,咱们依据不同的类型对实体节点进行拆分。在将图谱节点表征接入NER模型中时,再利用注意力机制依据上下文来抉择更合乎语义的实体类型对应的表征 ,缓解不同类型下词语含意不同的问题,实现不同类型实体的交融。 接下来咱们探讨如何缓解标注乐音的问题。在标注过程中,少标漏标或错标的问题无奈防止,尤其像在商品题目NER这种标注比较复杂的问题上,尤为显著。对于标注数据中的乐音问题,采纳以下形式对乐音标注优化:不再采取原先非0即1的Hard的训练形式,而是采纳基于置信度数据的Soft训练形式,而后再通过Bootstrapping的形式迭代穿插验证,而后依据以后的训练集的置信度进行调整。咱们通过试验验证,应用Soft训练+Bootstrapping多轮迭代的形式,在噪声比例比拟大的数据集上,模型成果失去了显著晋升。具体的办法可参见咱们在NLPCC 2020较量中的论文《Iterative Strategy for Named Entity Recognition with Imperfect Annotations》。 效率晋升常识图谱的构建往往是针对于各个领域维度的数据独自制订的开掘形式。这种开掘形式重人工,比拟低效,针对每个不同的畛域、每个不同的数据维度,咱们都须要定制化的去建设工作相干的特色及标注数据。在商品场景下,开掘的维度泛滥,因而效率方面的进步也是至关重要的。咱们首先将常识开掘工作建模为三类分类工作,包含节点建模、关系建模以及节点关联。在整个模型的训练过程中,最须要进行效率优化的其实就是上述提到的两个步骤:(1)针对工作的特征提取;(2)针对工作的数据标注。 针对特征提取局部,咱们摒弃了针对不同开掘工作做定制化特色开掘的形式,而是尝试将特色和工作解耦,构建跨工作通用的图谱开掘特色体系,利用海量的特色库来对指标的节点/关系/关联进行表征,并利用监督训练数据来进行特色的组合和抉择。具体的,咱们构建的图谱特色体系次要由四个类型的特色组形成: 规定模板型特色次要是利用人工先验常识,交融规定模型能力。统计散布型特色,能够充分利用各类语料,基于不同语料不同层级维度进行统计。句法分析型特色则是利用NLP畛域的模型能力,引入分词、词性、句法等维度特色。嵌入示意型特色,则是利用高阶模型能力,引入BERT等语义了解模型的能力。 针对数据标注局部,咱们次要从三个角度来晋升效率。 通过半监督学习,充沛的利用未标注的数据进行预训练。通过被动学习技术,抉择对于模型来说可能提供最多信息增益的样本进行标注。利用近程监督办法,通过已有的常识结构远监督样本进行模型训练,尽可能的施展出已有常识的价值。人机联合-业余图谱建设以后医药衰弱行业结构性正在发生变化,消费者更加偏向于应用在线医疗解决方案和药品配送服务,因而医药业务也逐步成为了美团的重要业务之一。相比于普通商品常识图谱的建设,药品畛域常识具备以下两个特点:(1)具备极强的专业性,须要有相干背景常识能力判断相应的属性维度,例如药品的实用症状等。(2)准确度要求极高,对于强专业性常识不容许出错,否则更容易导致严重后果。因而咱们采纳将智能模型和专家常识联合的形式来构建药品常识图谱。 药品图谱中的常识能够分为弱专业知识和强专业知识两类,弱专业知识即个别人可能较容易获取和了解的常识,例如药品的应用办法、适用人群等;而强专业知识则是须要具备业余背景的人才可能判断的常识,例如药品的主治疾病、适应症状等。因为这两类数据对专家的依赖水平不同,因而咱们别离采取不同的开掘链路: 弱专业知识:对于药品图谱的弱专业知识开掘,咱们从说明书、百科知识等数据源中提取出相应的信息,并联合通过专家常识积淀进去的规定策略,借助通用语义模型从中提取相应的常识,并通过专家的批量抽检,实现数据的建设。强专业知识:对于药品图谱的强专业知识开掘,为了确保相干常识百分百精确,咱们通过模型提取出药品相干属性维度的候选后,将这些候选常识给到专家进行全量质检。在这里,咱们次要是通过算法的能力,尽可能减少业余药师在根底数据层面上的精力破费,进步专家从半结构化语料中提取专业知识的效率。在药品这类专业性强的畛域,专业知识的表述和用户习惯往往存在差别。因而咱们除了开掘强弱专业知识外,还须要填补专业知识和用户之间的差别,能力将药品图谱更好的与上游利用联合。为此,咱们从用户行为日志以及畛域日常对话等数据源中,开掘了疾病、症状和效用的别名数据,以及药品通用名的俗称数据,来买通用户习惯和业余表述之间的通路。 商品图谱的落地利用自从谷歌将常识图谱利用于搜索引擎,并显著晋升了搜寻品质与用户体验,常识图谱在各垂直畛域场景都表演起了重要的角色。在美团商品畛域中,咱们也将商品图谱无效的利用在围绕商品业务的搜寻、举荐、商家端、用户端等多个上游场景当中,接下来咱们举几个典型的案例进行介绍。 结构化召回商品图谱的数据,对于商品的了解很有帮忙。例如,在商品搜寻中, 如用户在搜寻头疼腰疼时,通过结构化的常识图谱,能力晓得什么药品是有止疼效用的;用户在搜寻可爱多草莓、黄瓜薯片时,须要依赖图谱的常识常识来了解用户真正需要是冰淇淋和薯片,而不是草莓和黄瓜。 排序模型泛化性图谱的类目信息、品类信息、属性信息,一方面能够作为比拟强有力的相关性的判断办法和干涉伎俩,另一方面能够提供不同粗细粒度的商品聚合能力,作为泛化性特色提供到排序模型,能无效地晋升排序模型的泛化能力,对于用户行为尤为稠密的商品畛域来说则具备着更高的价值。具体的特色应用形式则包含: 通过各颗粒度进行商品聚合,以ID化特色接入排序模型。在各颗粒度聚合后进行统计特色的建设。通过图嵌入示意的形式,将商品的高维向量示意和排序模型联合。 多模态图谱嵌入现有的钻研工作曾经在多个畛域中证实了,将常识图谱的数据进行嵌入示意,以高维向量示意的形式和排序模型联合,能够无效地通过引入内部常识达到缓解排序/举荐场景中数据稠密以及冷启动问题的成果。然而,传统的图谱嵌入的工作往往漠视了常识图谱中的多模态信息,例如商品畛域中咱们有商品的图片、商品的题目、商家的介绍等非简略的图谱节点型的常识,这些信息的引入也能够进一步晋升图谱嵌入对举荐/排序的信息增益。 ...

September 3, 2021 · 1 min · jiezi

关于nlp:关键词提取TFIDF一

系列文章&check; 词向量 &cross;Adam,sgd &cross; 梯度隐没和梯度爆炸 &cross;初始化的办法 &cross; 过拟合&欠拟合 &cross; 评估&损失函数的阐明 &cross; 深度学习模型及罕用任务说明 &cross; RNN的工夫复杂度 &cross; neo4j图数据库 分词、词向量 TfidfVectorizer根本介绍TF-IDF是一种统计办法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要水平。字词的重要性随着它在文件中呈现的次数成正比减少,但同时会随着它在语料库中呈现的频率成反比降落。比方:为了取得一篇文档的关键词,咱们能够如下进行对给定文档,咱们进行"词频"(Term Frequency,缩写为TF)给每个词计算一个权重,这个权重叫做"逆文档频率"(Inverse Document Frequency,缩写为IDF),它的大小与一个词的常见水平成反比。算法明细根本步骤 1、计算词频。思考到文章有长短之分,为了便于不同文章的比拟,进行"词频"标准化。词频:TF = 文章中某词呈现的频数 词频标准化:2、计算逆文档频率。如果一个词越常见,那么分母就越大,逆文档频率就越小越靠近0。逆文档频率:其中,语料库(corpus),是用来模仿语言的应用环境。3、计算TF-IDF。能够看到,TF-IDF与一个词在文档中的呈现次数成正比,与该词在整个语言中的呈现次数成反比$TF-IDF = TF * IDF$算法优缺点长处: TF-IDF算法的长处是简略疾速,后果比拟符合实际状况。毛病 单纯以"词频"掂量一个词的重要性,不够全面,有时重要的词可能呈现次数并不多。这种算法无奈体现词的地位信息,呈现地位靠前的词与呈现地位靠后的词,都被视为重要性雷同,这是不正确的。对于文档中呈现次数较少的重要人名、地名信息提取成果不佳利用场景利用场景简介 1)搜索引擎;2)关键词提取;3)文本相似性;4)文本摘要可执行实例# python:3.8# sklearn:0.23.1# 1、CountVectorizer 的作用是将文本文档转换为计数的稠密矩阵from sklearn.feature_extraction.text import CountVectorizercorpus = [ 'This is the first document.', 'This document is the second document.', 'And this is the third one.', 'Is this the first document?',]vectorizer = CountVectorizer()X = vectorizer.fit_transform(corpus)# 查看每个单词的地位print(vectorizer.get_feature_names())#['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']# 查看后果print(X.toarray())# [[0 1 1 1 0 0 1 0 1]# [0 2 0 1 0 1 1 0 1]# [1 0 0 1 1 0 1 1 1]# [0 1 1 1 0 0 1 0 1]]# 2、TfidfTransformer:应用计算 tf-idffrom sklearn.feature_extraction.text import TfidfTransformertransform = TfidfTransformer() Y = transform.fit_transform(X) print(Y.toarray()) # 输入tfidf的值# [[0. 0.46979139 0.58028582 0.38408524 0. 0. 0.38408524 0. 0.38408524]# [0. 0.6876236 0. 0.28108867 0. 0.53864762 0.28108867 0. 0.28108867]# [0.51184851 0. 0. 0.26710379 0.51184851 0. 0.26710379 0.51184851 0.26710379]# [0. 0.46979139 0.58028582 0.38408524 0. 0. 0.38408524 0. 0.38408524]]# 3、TfidfVectorizer:TfidfVectorizer 相当于 CountVectorizer 和 TfidfTransformer 的联合应用from sklearn.feature_extraction.text import TfidfVectorizercorpus = [ 'This is the first document.', 'This document is the second document.', 'And this is the third one.', 'Is this the first document?',]vectorizer = TfidfVectorizer() #构建一个计算词频(TF)X = vectorizer.fit_transform(corpus)print(vectorizer.get_feature_names())# ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']print(X.shape)# (4, 9)参数项阐明CountVectorizer ...

August 28, 2021 · 1 min · jiezi

关于nlp:ACL-2021-百度NLP开源语言与视觉一体的统一模态预训练方法登顶各类榜单

百度独创地提出了语言与视觉一体的预训练方法 UNIMO,提供了一种新的对立模态学习范式,突破了文本、图像和图文对等数据间的边界,让机器能够像人一样利用大规模异构模态数据,学习语言常识与视觉常识并互相加强,从而实现感知与认知一体的通用 AI 能力。 百度在2021年深度学习开发者峰会 WAVE SUMMIT 上开源了语言与视觉一体的预训练模型 ERNIE-UNIMO,其外围办法 UNIMO 曾经被 NLP 顶级会议 ACL 2021主会正式录用为 oral 长文。 在机器之心7月31日举办的 ACL 2021论文分享会上,本文第一作者李伟具体介绍了他们的这项研究成果,感兴趣的同学能够点扫描下方二维码查看回顾视频。 AI 零碎是否像人一样,应用一个对立的大脑模型,实现感知认知一体的通用能力?基于此出发点,百度提出的 UNIMO 试图构建面向各种不同模态的对立预训练模型。 论文地址:\https://arxiv.org/abs/2012.15409\代码地址:\https://github.com/PaddlePadd... 此办法独创的同时还能学习大量的文本、图像、图文对数据,通过跨模态比照学习,无效的让语言常识与视觉常识进行对立示意和互相加强。UNIMO 在语言了解与生成、跨模态了解与生成,4类场景共13个工作上超过支流的文本预训练模型和跨模态预训练模型,同时登顶视觉问答榜单 VQA、文本推理榜单 aNLI 等权威榜单,首次验证了通过非平行的文本与图像等繁多模态数据,可能让语言常识与视觉常识互相加强。目前 UNIMO 曾经逐渐在百度的产品中落地利用。 UNIMO办法介绍 大数据是深度学习取得成功的要害根底之一。依据利用数据的模态不同,深度学习应用领域大体包含:在文本数据上进行自然语言解决,在视觉数据上进行视觉利用,在图文数据上进行跨模态利用。显然,人类大脑对各种模态数据的学习并非独立的,比方,人类大脑在看到图片之后可能主动联想到相干的语言常识,反之亦然。对各种模态数据的死记硬背,使得人类可能充沛学习各类语言、视觉、语音常识并互相加强,通过对立的模型展现出弱小的智能程度。那么,基于深度学习的 AI 零碎是否也能像人一样同时学习异构模态数据呢?如果可能实现,无疑将进一步关上深度学习对大规模数据利用的边界,从而进一步晋升 AI 零碎的感知与认知一体的通用 AI 能力。 为此,百度提出面向异构模态数据的对立预训练方法 UNIMO,同时应用文本、图像和图文对数据进行训练,学习文本和图像的对立语义示意,从而具备同时解决多种繁多模态和跨模态上游工作的能力。UNIMO 的外围模块是一个Transformer 网络,在具体训练过程中,文本、图像和图文对三种模态数据随机混合在一起,其中图像被转换为指标(object)序列,文本被转换为词(token)序列,图文对被转换为指标序列和词序列的拼接。UNIMO 对三种类型数据进行对立解决,在指标序列或者词序列上基于掩码预测进行自监督学习,并且基于图文对数据进行跨模态比照学习,从而实现图像与文本的对立示意学习。进一步的,这种联结学习办法也让文本常识和视觉常识相互加强,从而无效晋升文本语义示意和视觉语义示意的能力。 异构模态的对立预训练最大的挑战是如何逾越不同模态间的语义鸿沟从而实现语义示意的对立。如下图所示,UNIMO 提出了翻新的跨模态比照学习办法,同时引入相关联的图文对数据、文本数据和图像数据进行联结比照学习。具体地,UNIMO 通过文本改写的形式,对图文对进行数据增广,取得大量的正例和强负例图文对数据。同时为了更好的利用文本和图像数据,UNIMO 通过文本与图像检索,取得相干的图像和文本作为正例。这样利用裁减后的多种类型的正例以及高质量强负例,UNIMO 在对立的语义空间上进行联想比照,从而可能学习到准确对齐的跨模态语义示意。 UNIMO试验后果 在试验方面,UNIMO 应用了大量的文本、图像和图文数据进行联结学习,同时在各种繁多模态和跨模态上游工作上进行验证。预训练数据局部,文本语料包含 Wikipedia、BookCorpus、OpenWebText 等共 54G 语料;图像数据是从互联网爬取的170万张图像;而图文对数据则包含 COCO Caption、Visual Genome、Conceptual Caption、SBU Caption。上游工作既包含图文搜寻、视觉问答、图形容生成、视觉推断等跨模态工作,也包含文本分类、浏览了解、文本摘要、问题生成等各种文本工作。模型上,Base 基于12层的 Transformer,而 Large 应用24层。 ...

August 16, 2021 · 1 min · jiezi

关于nlp:架构级理解BERT二探求机翻的内幕Seq2Seq

上文咱们曾经介绍了LSTM,它就是一个革新过的RNN模型,通过LSTM可能比拟好的将一段文本表征为向量。那么要实现机器翻译这个工作,咱们的机器不仅要读懂文本的意思,还须要被动的生成文本。 Char level and Word level这里简要介绍一下句子的宰割。句子能够宰割成字符级别和单词级别,之前咱们所讲的都是单词级别的;二者各有利弊。 字符级别:“I miss you” => /s I m i s s y o u /e。其中/s示意起始符,/e示意终止符。字符级别的益处就是,因为字符的数量是很少的,所以能够对每一个字符间接做one-hot编码而不须要做embedding(此处不了解的能够先学习word2vec模型)。那么害处就是一句话被宰割成进去造成的序列就比拟长了,在RNN中会存在忘记。单词级别:“I miss you” => /s I miss you /e。益处是序列长度比拟短,此处的长度为5。害处就是须要大量的训练集做embedding,而embedding会造成过拟合。RNN文本生成器接下来为了模型的繁难(其实就是模型图里少画一层embedding层罢了),对立采取字符级别的宰割。 如图,输出文本是“the cat sat on the ma”,此时RNN模型的输入h曾经失去,那么此时我做一个softmax就能够失去一个概率向量,选取概率最大的那个维度对应的字符,就能够预测失去基于the cat sat on the ma前面的字符。那么同理,当我失去the cat sat on the mat字符串之后,再进行一次迭代,不就又能够失去前面的字符了嘛!直到生成的字符是终止符时进行。这样咱们就实现了文本生成! 训练RNN文本预测器给定一段文本P:the cat sat on the mat,而后输出the cat sat on the ma。通过下面的形容咱们晓得此时文本预测器可能预测出下一个最可能呈现的字符,比方预测呈现字符a,而P中的t其实就是标签。通过计算CrossEntropy(a,t)即可失去误差,通过反向流传即可更新模型参数。 Seq2Seq模型是由编码器Encoder和解码器Decoder组成的,编码采纳的就是RNN,解码采纳的其实就是上文的文本生成器,采纳的模型也是RNN。 此处是须要实现将英文转化为德文,那么先将英文go away输出LSTM中最终失去的状态向量h和记忆信息c。将这两个数据作为Decoder的初始输出传入。 因为起始符是确定的,所以将起始符作为x0输出(为防止遗记RNN模型,上面再放一张RNN的图)。 将起始符输出之后必然会失去一个h0,通过h0就能够进行预测了,同样也是通过softmax将其转化为概率向量而后选取概率最大的字符作为后果。那么此时预测进去的字符持续作为x1输出进行下一步的计算,周而复始,直至输入的字符是终止符时进行。 Seq2Seq模型的训练其实和文本预测器的训练一样,不同的中央就在于文本预测器只更新了decoder的参数,而Seq2Seq会将Encoder的参数也一并更新。此处的训练形式其实有点拉胯,之后咱们会提到BERT的预训练形式。 最初再来看Seq2Seq的整体结构图就比拟好了解了。 Seq2Seq一点改良因为咱们晓得LSTM在记忆力方面是比SimpleRNN要好的,然而当序列长度增大之后,依旧会存在对晚期的输出忘记的状况。那么咱们能够应用Bi-LSTM,也就是双向的LSTM来取代LSTM,使得对文本的向量化表征更加全面,信息不会失落。显然这种双向的LSTM是用来革新Seq2Seq中Encoder局部,可能使编码进去的向量示意的信息更全面;而Decoder中不能也没有必要应用Bi-LSTM。 ...

August 6, 2021 · 1 min · jiezi

关于nlp:架构级理解BERT逃不掉的RNN

前言写这一个系列的动因就是本人想深刻理解一下BERT的原理。BERT是怎么被构想进去的?比拟适宜刚入门的小白浏览,读完之后会发现其实不过如此。那么既然是架构级的,本系列不会过多的波及代码级的或者说公式级的,更多的是设计形式以及设计的起因。本系列将分成以下几个模块, 逃不掉的RNN探究机翻的底细:Seq2SeqAttention is ALL you needTransformer是谁?This is BERT时序数据回忆咱们晓得的全连贯层,他实际上做的就是将一堆input转换为一堆output,这些input之间没有工夫上的关系,而是将所有input揉在一起输出到模型中。而对于时序数据,比方一段话,人在浏览的时候是单向的、随着工夫将input一一输出,并且很多时候input的长度是未知的。所以咱们就须要一个新的架构来解决这一类的时序数据。 Simple RNN为什么须要RNN?假如咱们须要解决一个文本分类工作。要想对文本进行分类,那么咱们必须将这个文本数字化或者说向量化,并且须要保障这个向量可能表征这句话,蕴含了这句话中所有的特色。而通过RNN就可能将一个句子中的所有信息都交融起来,表征成一个向量。 下面就是RNN的架构图,咱们一步一步来讲。首先是咱们的输出,显然是一串文本:the cat sat ... mat。那么对于某个单词而言,比方the,想要参加后续的运算,首先须要将其向量化,这里能够用到word2vec等算法,通过语义的形式将单词转化为一个向量x0。而后将x0输出矩阵A,外部过程如下, 将x0与ht-1(此处因为x0是第一个,ht-1实践上来说不存在,那么能够通过一些解决比方将其置零之类代替)连接起来,和矩阵A相乘,再进行tanh激活函数计算,失去h0。而后将h0和x1输出到矩阵A又反复上述计算,周而复始(所以RNN叫循环神经网络,上一步的输入又作为下一步的输出)。显然,h0中存储着x0的状态,h1中存储着x0和x1的状态,以此类推,最初一个输入ht中应该存储着后面所有xi(单词)的信息。这样,ht相当于征集了所有村民的意见,就能够作为代表拿去评估,实现二分类的工作。 此处思考一个问题:为什么须要tanh激活? 假如没有tanh,为不便探讨,咱们假如所有的x都是零向量,那么ht ≈ A×ht-1。易得h100 = A100h0。易得Ax = x,A100x = 100x,若A的特征值稍大于1,那么A100就间接爆炸了;若稍小于1,那么A100预计就间接变成零矩阵了。所以须要tanh进行一个相似于正则化的工作。 毛病使人提高,RNN存在什么毛病呢?=>RNN的记忆力特地短,什么是记忆力?之前咱们说“最初一个输入ht中应该存储着后面所有xi(单词)的信息”,的确,然而当序列长度变大,对于最后面的x所遗留下来的特色可能曾经被笼罩掉了。能够通过计算h~100~对于x0的导数来判断之间的相关性,计算可得,导数靠近于0。 所以咱们能够发现,simpleRNN在解决短距离的文本时成果较好,当序列长度变大之后,成果就不太好了。所以引出LSTM。 革新SimpleRNN => LSTM可见LSTM其实也是一类RNN罢了,此处我不会具体解释其原理,因为Attention is ALL you need,RNN能够被attention取代了。 首先来看LSTM的架构, 仔细观察发现,其实和简略RNN没有很大区别,其实就是把之前单纯的乘矩阵A转化为一系列更为简单的操作。所以SimpleRNN能够被LSTM齐全替换掉,就像替换某个整机一样。外部的大抵过程如下。 为了补救SimpleRNN 记忆力失落的问题,LSTM将记忆放在一个传输带上,也就是下图中的Conveyor Belt,也就是左下方的C~t-1~,记忆的更新形式如图右下方所示,其中能够发现f向量,这是LSTM中的忘记门,他能够管制哪些信息疏忽,哪些信息保留。忘记门也保障了长距离记忆始终存在。 最初是LSTM的输入,在记忆信息C的根底上进行肯定的加工之后失去ht。同样和SimpleRNN相似,将上一步的输入作为输出传入下一层。

August 6, 2021 · 1 min · jiezi

关于nlp:java-实现中英文拼写检查和错误纠正可我只会写-CRUD-啊

简略的需要邻近上班,小明忙完了明天的工作,正筹备上班回家。 一条音讯闪动了起来。 “最近发现公众号的拼写查看性能不错,帮忙用户发现错别字,体验不错。给咱们零碎也做一个。” 看着这条音讯,小明在心田默默问候了一句。 “我 TND 的会做这个,就间接去人家总部下班了,在这受你的气。” “好的”,小明回复到,“我先看看” 明天,天王老子来了我也得上班,耶稣也留不住。 小明想着,就回家了。 沉着剖析说到这个拼写查看,小明其实是晓得的。 本人没吃过猪肉,还是见过猪跑的。 平时看过一些公众号大佬分享,说是公众号推出了拼写查看性能,当前再也不会有错别字了。 起初,小明还是在他们的文章中看到了不少错别字。起初,就没有起初了。 为什么不去问一问万能的 github 呢? 小明关上了 github 发现如同没有成熟的 java 相干的开源我的项目,有的几颗星,用起来不太释怀。 预计 NLP 是搞 python 的比拟多吧,java 实现中英文拼写检查和谬误纠正?可我只会写 CRUD 啊! 小明默默地点起了一根华子…… 窗外的夜色如水,不禁陷入了深思,我来自何方?去往何处?人生的意义又是什么? 尚有余热的烟灰落在了小明某东买的拖鞋上,把他脑海中脱缰的野马烫的一伶俐。 没有任何思路,没有任何脉络,还是先洗洗睡吧。 那一夜,小明做了一个长长的美梦。梦里没有任何的错别字,所有的字句都坐落在正确的地位上…… 转折第二天,小明关上了搜寻框,输出 spelling correct。 可喜的是,找到了一篇英文拼写纠正算法解说。 吾尝终日而思矣,不如顷刻之所学也。小明叹了一句,就看了起来。 算法思路英文单词次要有 26 个英文字母组成,所以拼写的时候可能呈现谬误。 首先能够获取正确的英文单词,节选如下: apple,16192applecart,41applecarts,1appledrain,1appledrains,1applejack,571applejacks,4appleringie,1appleringies,1apples,5914applesauce,378applesauces,1applet,2每一行用逗号分隔,前面是这个单词呈现的频率。 以用户输出 appl 的为例,如果这个单词不存在,则能够对其进行 insert/delete/replace 等操作,找到最靠近的单词。(实质上就是找到编辑间隔最小的单词) 如果输出的单词存在,则阐明正确,不必解决。 词库的获取那么英文词库去哪里取得呢? 小明想了想,于是去各个中央查了一圈,最初找到了一个比较完善的英文单词频率词库,共计 27W+ 的单词。 节选如下: aa,1831aah,45774aahed,1aahing,30aahs,23...zythums,1zyzzyva,2zyzzyvas,1zzz,76zzzs,2 外围代码获取用户以后输出的所有可能状况,外围代码如下: /** * 构建出以后单词的所有可能谬误状况 * * @param word 输出单词 * @return 返回后果 * @since 0.0.1 * @author 老马啸东风 */private List<String> edits(String word) { List<String> result = new LinkedList<>(); for (int i = 0; i < word.length(); ++i) { result.add(word.substring(0, i) + word.substring(i + 1)); } for (int i = 0; i < word.length() - 1; ++i) { result.add(word.substring(0, i) + word.substring(i + 1, i + 2) + word.substring(i, i + 1) + word.substring(i + 2)); } for (int i = 0; i < word.length(); ++i) { for (char c = 'a'; c <= 'z'; ++c) { result.add(word.substring(0, i) + c + word.substring(i + 1)); } } for (int i = 0; i <= word.length(); ++i) { for (char c = 'a'; c <= 'z'; ++c) { result.add(word.substring(0, i) + c + word.substring(i)); } } return result;}而后和词库中正确的单词进行比照: ...

July 21, 2021 · 4 min · jiezi

关于nlp:越学越有趣『手把手带你学NLP』系列项目07-机器翻译的那些事儿

课程简介 “手把手带你学NLP”是基于飞桨PaddleNLP的系列实战我的项目。本系列由百度多位资深工程师精心打造,提供了从词向量、预训练语言模型,到信息抽取、情感剖析、文本问答、结构化数据问答、文本翻译、机器同传、对话零碎等实际我的项目的全流程解说,旨在帮忙开发者更全面清晰地把握百度飞桨框架在NLP畛域的用法,并可能触类旁通、灵便应用飞桨框架和PaddleNLP进行NLP深度学习实际。 6月,百度飞桨 & 自然语言解决部携手推出了12节NLP视频课,课程中具体解说了本实际我的项目。 观看课程回放请戳:https://aistudio.baidu.com/ai... 欢送来课程QQ群(群号:758287592)交换吧~~ 背景介绍 机器翻译是利用计算机将一种自然语言(源语言)转换为另一种自然语言(目标语言)的过程。 本我的项目是机器翻译畛域支流模型 Transformer 的 PaddlePaddle 实现,快来基于此我的项目搭建本人的翻译模型吧。 Transformer 是论文《 Attention Is All You Need 》中提出的用以实现机器翻译(Machine Translation)等序列到序列(Seq2Seq)学习工作的一种全新网络结构,其齐全应用注意力(Attention)机制来实现序列到序列的建模。 图1:Transformer 网络结构图相较于此前 Seq2Seq 模型中宽泛应用的循环神经网络(Recurrent Neural Network, RNN),应用Self Attention进行输出序列到输入序列的变换次要具备以下劣势: 计算复杂度小特色维度为 d 、长度为 n 的序列,在 RNN 中计算复杂度为 O(n d d) (n 个工夫步,每个工夫步计算 d 维的矩阵向量乘法),在Transformer中计算复杂度为 O(n n d) (n 个工夫步两两计算 d 维的向量点积或其余相关度函数),n 通常要小于 d 。计算并行度高RNN 中以后工夫步的计算要依赖前一个工夫步的计算结果;Self-Attention 中各工夫步的计算只依赖输出,不依赖之前工夫步输入,各工夫步能够齐全并行。容易学习长距离依赖(long-range dependencies)RNN 中相距为 n 的两个地位间的关联须要 n 步能力建设;Self-Attention 中任何两个地位都间接相连;门路越短信号流传越容易。Transformer 构造已被广泛应用在 Bert 等语义示意模型中,获得了显著效果。 ...

July 8, 2021 · 3 min · jiezi

关于nlp:机器都能写SQL了CURD-boysgirls慌不慌

背景结构化查询语言(Structured Query Language)简称SQL,是一种非凡目标的编程语言,是一种数据库查问和程序设计语言,用于存取数据以及查问、更新和治理关系数据库系统。CURD代表创立(Create)、更新(Update)、读取(Retrieve)和删除(Delete)操作。 大量利用业务代码,总是一些curd的货色。随着人工智能倒退,机器生成代码曾经变成可能,前段时间GitHub官网和openAI联结为程序员们送上编程神器——GitHub Copilot。程序员只有写下一段正文,Github Copilot就能够补全剩下的代码、提出改良的倡议。 明天咱们来看另一种可能性:咱们输出一串汉字,计算机帮咱们从数据库中间接获取咱们要的统计数据。这样连代码都不必机器生成了,计算机间接能够帮终端用户解决一些罕用的数据分析需要了。先来看下最终成果 零碎搭建咱们先来形容下零碎搭建过程,最初再介绍一下原理,搭建过程很简略,大家有工夫能够本人上手试验下,这里用到了百度的Sugar可视化服务以及云数据库MemFireDB 咱们先登录MemFireDB,将曾经筹备好的数据上传上去,这里咱们筹备三张表,stockbars股票原始信息、stockrsvs咱们计算的rsv指标、stockkdj咱们计算的kdj指标,具体如何上传数据以及计算指标能够参看另外一篇文章 https://juejin.cn/post/697920... 咱们进入百度Sugar配置数据源以及数据模型,配置数据源时用到的数据库IP在MemFireDB控制台中获取,这里咱们须要把表stockrsvs和stockkdjs两个表进行内连贯,连贯字段用stock_id和date关联好的数据能够点击“查看数据”进行预览 关上数据模型的“智能问答”选项,数据模型会先变为“待训练”,后变为“训练实现”,默认应用数据字段的「物理字段名称」以及「数据模型中的显示名称」来匹配数据字段,如果须要通过更多的说法来对数据字段进行匹配,能够对数据字段配置同义词这里还能够配置每个字段的同义词。 最初、创立“AI摸索页面”,勾选曾经开启了“智能问答”选项的数据模型即可实现下面视频中的成果,是不是很简略 好了,零碎搭建完了,是不是急不可待的想晓得零碎实现的原理呢,这里用到了数据技术以及人工智能的NL2SQL技术,数据库系统提供了数据的存取和SQL语句的解析,sugar则提供了自然语言到SQL的转换 技术原理NL2SQL是自然语言解决技术的一个钻研方向,能够将人类的自然语言主动转化为相应的SQL 语句(Structured Query Language结构化查询语言),进而能够与数据库间接交互、并返回交互的后果。比方咱们问:公众 10 万到 20 万之间的车型有几种?NL2SQL能够让机器了解这样的自然语言,并从表格中检索出答案。 NL2SQL,让非专业人士,不须要学习和把握数据库程序语言,就能够自在地查问各种丰盛的数据库:说句话就行。没有条条框框的限度,内容和信息更加丰盛。以前是程序员写一个“模板”,在这个模板里查问内容。NL2SQL的实现,使用了大量前沿的人工智能算法模型,比方使用了多个预训练语言模型,相当于AI大脑,让AI读懂用户语言;使用了图神经网络,让AI“看到”数据库, 一目十行过目不忘,而且更加清晰地分清每个表格内容。 总结最初,前一两年NL2SQL还在一些学术研究阶段,准确率还只有60%左右,明天咱们曾经看到了百度曾经推出了能够商用的零碎,人工智能的倒退太迅速了,他不光代替的是简略的重复劳动,当初连写代码的事件也能够代劳了,小伙伴们,你们颤动么?

July 3, 2021 · 1 min · jiezi

关于nlp:千言数据集文本相似度权威评测网易易智荣登榜首

日前,网易数帆旗下人工智能技术与服务品牌——网易易智在CCF和百度联结举办的“千言数据集:文本类似度”行业测评中击败多支劲旅,荣登榜首。 文本类似度,即辨认两段文本在语义上是否类似,在自然语言解决(NLP)畛域是一个重要钻研方向,目前已大规模商用于智能客服、信息检索、新闻举荐等畛域,如已服务超40万企业客户的网易七鱼智能客服,背地就有这项技术的撑持。 榜单中“网易杭州研究院”为网易易智团队 常识积淀与技术积攒犯罪,网易易智文本类似度雄踞榜首“千言数据集”系列评测是中文自然语言解决畛域的大规模赛事,其中文本类似度开源我的项目收集了来自哈尔滨工业大学的LCQMC、BQ Corpus,以及谷歌的PAWS-X(中文)等公开数据集,冀望对文本类似度模型成果进行综合的评估,推动文本类似度在自然语言解决畛域的利用和倒退。 据理解,这些公开数据集在相干论文的撑持下,对现有的公开文本类似度模型进行了较全面的评估,具备较高的权威性,代表了文本类似度技术钻研的最高水准。 哈尔滨工业大学(深圳)LCQMC数据集工作示例 在本次文本类似度测评中,网易易智联合了多年技术教训积攒,和大规模预训练语言模型的使用,再加上对较量工作进行的针对性优化,获得了目前的优异成绩。 网易易智的参赛队伍示意,这次较量工作次要有2个难点。一个难点是BQ Corpus数据集是金融畛域的数据,该数据集波及到金融行业的大量常识,而通用预训练语言模型难以捕捉到特定行业的潜在常识。为此,团队采纳半监督学习等形式,从网易外部多个业务场景中挖掘出泛金融畛域常识,进而取得金融畛域预训练语言模型,最终在该工作上较大幅度当先于其余参赛团队。 而另一个难点是PAWS-X数据集的品质问题,该数据来自于英文的翻译,翻译内容与实在中文有出入,尤其会对算法造成烦扰的是实体词(如人名、地名)的翻译不对立,即雷同的人名,前一个句子保留英文原文,后一个句子却音译为中文。针对这个数据特点,网易易智利用自研的NER(命名实体辨认)服务进行实体词的辨认与归一化,并利用自研的中文文本纠错服务纠正其中的错别字、语病之后,再进行模型训练,最终在该工作上也获得了第一。 网易易智助力七鱼机器人精准了解客户诉求网易易智基于文本类似度等系列NLP技术构建了一套智能对话零碎,服务团体外部多个业务,如严选客服、IT征询等,并与七鱼业务联结打造智能客服机器人产品,服务团体内部客户。 以九阳股份有限公司为例,其外围诉求之一,是通过高效、精准、人性化的咨询服务保障用户的购物体验,如用户对于小家电产品性能、操作、价格、优惠活动、养护、培修等问题的征询。 为此,九阳接入了网易七鱼在线机器人,在问题匹配率可高达90%以上的根底上,提供更懂用户的智能服务体验。基于网易易智文本类似度算法,七鱼在线机器人实现了外围语义匹配,从而达成BOT、FAQ等性能。此外,通过语义匹配技术,七鱼在线机器人还实现了对知识库的智能开掘与生成。借助这些能力,七鱼在线机器人能够高效、精准地解答不同场景下的客户问题。而在快递畛域,申通快递也接入了七鱼智能客服应答快递征询问题,这是一个与上述金融、小家电齐全不同的畛域,然而使用网易易智同样的技术原理,智能客服疾速实现了类似的成果。 网易易智NLP促成数字业务翻新文本类似度技术的商业价值并不局限于智能客服畛域。据网易易智负责人介绍,文本类似度技术大类归于文本匹配,除了对话引擎里,该技术在网易外部还有更多的利用落地,如网易云音乐中的评论智能开掘、直播/短视频中的歌词匹配以及常识公路业务中的视频选题类似度检测等翻新解决方案利用。 而从整个技术畛域来看,作为一门让机器了解人类语言的技术,NLP素有“人工智能皇冠上的明珠”之称,既是难以攻克的前沿课题,也对数字业务翻新具备重要的意义。除了文本类似度,网易易智也始终在摸索NLP技术与业务翻新的最大公约数,并获得了一些阶段性的成绩。 例如,语义解析技术在软件测试中的应用,显著晋升自动化程度、实现降本增效,这对于数字化软件品质的保障十分无利;文本纠错技术在网易新闻等文稿审校场景中大规模应用,将拼写及语法等谬误及时发现并予以纠正,大幅晋升用户浏览体验,同时升高内容生产的工作量。 将来,网易易智还将联结网易数帆旗下无数团队,摸索NLP在大数据系统中的利用,如反对业务人员与剖析零碎的自然语言交互,使得企业可能更好地施展大数据的价值。

June 21, 2021 · 1 min · jiezi

关于nlp:四大模型革新NLP技术应用揭秘百度文心ERNIE最新开源预训练模型

在5月20日完结的2021深度学习开发者峰会 WAVE SUMMIT 上,百度文心 ERNIE 开源了四大预训练模型。本文对这四大开源预训练模型进行了具体的技术解读。2019年以来,NLP 预训练模型在技术创新和工业利用上一直获得冲破,但以后预训练模型仍有一些痛点困扰着开发者: 仅思考繁多粒度语义建模,不足多粒度常识引入,语义理解能力受限;受限于 Transformer 构造的建模长度瓶颈,无奈解决超长文本;聚焦语言等繁多模态,不足工业实在利用场景针对多个模态如语言、视觉、听觉信息的联结建模能力。5月20日举办的2021深度学习开发者峰会 WAVE SUMMIT 上,依靠飞桨外围框架,百度文心 ERNIE 最新开源四大预训练模型:多粒度语言常识加强模型 ERNIE-Gram、长文本了解模型 ERNIE-Doc、交融场景图常识的跨模态了解模型 ERNIE-ViL、语言与视觉一体的模型 ERNIE-UNIMO。 针对以后预训练模型现存的难点痛点,此次文心 ERNIE 开源的四大预训练模型不仅在文本语义了解、长文本建模和跨模态了解三大畛域获得冲破,还领有宽泛的利用场景和前景,进一步助力产业智能化降级。 文心 ERNIE 开源版地址:https://github.com/PaddlePaddle/ERNIE 文心 ERNIE 官网地址:https://wenxin.baidu.com/ 一、多粒度语言常识加强模型 ERNIE-Gram 从 ERNIE 模型诞生起,百度研究者们就在预训练模型中引入常识,通过常识加强的办法晋升语义模型的能力。本次公布的 ERNIE-Gram 模型正是通过显式引入语言粒度常识,从而晋升模型的成果。具体来说,ERNIE-Gram 提出显式 n-gram 掩码语言模型,学习 n-gram 粒度语言信息,绝对间断的 n-gram 掩码语言模型大幅放大了语义学习空间,(V^n→V_(n-gram),其中 V 为词表大小,n 为建模的 gram 长度),显著晋升预训练模型收敛速度。 ▲ 图1-1 间断 n-gram 掩码语言模型 vs 显式 n-gram 掩码语言模型 此外,在显式 n-gram 语义粒度建模根底上,ERNIE-Gram 提出多层次 n-gram 语言粒度学习,利用 two-stream 双流机制,实现同时学习 n-gram 语言单元内细粒度(fine-grained)语义常识和n-gram语言单元间粗粒度(coarse-grained)语义常识,实现多层次的语言粒度常识学习。 ...

May 31, 2021 · 1 min · jiezi

关于nlp:词向量Word-Embedding原理及生成方法

前言Word Embedding是整个自然语言解决(NLP)中最罕用的技术点之一,广泛应用于企业的建模实际中。咱们应用Word Embedding可能将天然文本语言映射为计算机语言,而后输出到神经网络模型中学习和计算。如何更深刻地了解以及疾速上手生成Word Embedding呢?本文对Word Embedding原理和生成办法进行了解说。 一、Word Embedding初探什么是Word Embedding一句话概述,Word Embedding即词向量,是一种函数映射关系。咱们晓得,在机器学习中,特色都是以数值的模式进行传递的。同样的,在NLP中,文本特色也须要被映射成数值向量。例如,咱们将单词“你好”进行Word Embedding后,能够把其映射成一个5维向量:你好 ——> (0.1, 0.5, 0.3, 0.2, 0.2)。 词向量的映射过程一般来说,咱们采纳“词 ——> 向量空间1 ——> 向量空间2”的映射过程实现文本单词向量化。整个映射过程能够分为两步: 1、词 ——> 向量空间1该步骤解决把一个词转换成vector(数值向量)的问题。例如,将文本单词转换成One-Hot向量。 2、向量空间1 ——> 向量空间2该步骤解决vector的优化问题,即在曾经有了一个vector的状况下,寻求更好的方法优化它。 二、应用One-Hot和SVD求Word Embedding办法One-Hot(词——>向量空间1)One-Hot是目前最常见的用于提取文本特色的办法之一。本文应用One-Hot实现映射过程的第一步,即词——>向量空间1。 咱们将语料库中的每一个词都作为一个特色列,如果语料库中有V个词,则有V个特色列,例如: 在这一映射过程中,One-Hot存在以下毛病:1)容易产生稠密特色;2)容易引发维度爆炸;3)使得词间失去语义关系。 例如,依照常识,旅店(hotel)和汽车旅店(motel)间应该是具备某种相似性的,然而咱们的映射后果却表明他们的向量积为0。旅店(hotel)和汽车旅店(motel)之间的相似性等于其和猫(cat)之间的相似性,这显然是不合理的。 改良方向: 1)尝试将词向量映射到一个更低维的空间; 2)同时放弃词向量在该低维空间中具备语义相似性,如此,越相干的词,它们的向量在这个低维空间里就能靠得越近。 SVD(向量空间1——>向量空间2)1、如何示意出词和词间的关系SVD,即奇怪值合成(Singular Value Decomposition),是在机器学习畛域广泛应用的算法,它不仅能够用于降维算法中的特色合成,也广泛应用于举荐零碎,以及自然语言解决等畛域,是很多机器学习算法的基石。本文应用SVD来解决vector的优化问题。 咱们首先结构了一个亲和矩阵(affinity matrix),先保障在不降维的状况下,可能反映出词和词间的关系。结构亲和矩阵的形式有很多种,这里列举较常见的两种形式。 ✦形式一 假如你有N篇文章,一共有M个去重词,则能够结构亲和矩阵如下: 其中每一个值示意单词在某篇文章中的呈现次数。这个矩阵能够反映词的一些性质。比方一个词是“收获”,那么它可能在“农学”类的文章里呈现得多一些;一个词是“电影”,那么它可能在“艺术”类的文章中呈现得多一些。 ✦形式二 假如咱们有M个去重单词,则可结构M*M的矩阵,其中每个值示意相应的两个单词在一篇文章里独特呈现的次数,例如: 2、对亲和矩阵进行合成有了亲和矩阵,就能够对其进行SVD合成,这个目标就是进行降维了,后果如下: 咱们把原亲和矩阵X(右边)分解成了左边的三局部,左边的三个局部从左到右能够这么了解: ✦ U矩阵:从旧的高维向量空间到低维向量空间的一种转换关系; ✦ 矩阵:方差矩阵。每一列示意低维空间中每一个坐标轴的信息蕴含量。方差越大,阐明在该坐标轴上数据稳定显著,则信息蕴含量越丰盛。在降维时,咱们首先思考保留方差最大的若干个坐标轴; ✦ V矩阵:每个词向量的新示意形式。在和前两个矩阵相乘后,失去最终的词向量示意形式。 此时,左边的矩阵仍然是V维的,还没有实现降维。因而,正如前文所说,咱们取top k大的方差列,将U,和V三个矩阵依照方差从大到小的顺序排列好,这样就能失去最终的降维后的后果了: 3、SVD毛病1)亲和矩阵的维度可能常常变,因为总有新的单词加进来,每加进来一次就要从新做SVD合成,因而这个办法不太通用;2)亲和矩阵可能很稠密,因为很多单词并不会成对呈现。 改良思路: 1)在升高稠密性方面,能够不仅仅关注和一个单词有上下文关系的那些词;2)对于一个模型从没有见过一个单词,则思考从上下文关系中猜到它的信息,以减少通用性。 沿着这两个思路,咱们能够思考引入CBOW和Skip-Gram,来求word embedding。 三、CBOW和Skip-Gram求Word EmbeddingCBOW的全称是continuous bag of words(间断词袋模型),其本质也是通过context word(背景词)来预测一个单词是否是中心词(center word)。Skip-Gram算法则是在给定中心词(center word)的状况下,预测一个单词是否是它的上下文(context)。 ...

May 26, 2021 · 1 min · jiezi

关于nlp:哈工大LTP模型Mac上的安装与使用

一、装置1、一上午半下午的工夫都花在了装置上,最初弄明确了ltp和pyltp不一样,而且成熟的版本是3.4.0。2、(就是这么菜)弄明确了github的一些我的项目下面还能查看历史的release,正儿八经的3.4.0就是从release里边找着的复杂性: python3.6(3.7不行)对编译器也有要求还要批改一些配置资源:在mac上装置pyltp把ltp这个目录替换到pyltp里xcrun:error解决办法ltp网站:里边提供有模型的下载pyltp应用办法LTP命名实体辨认标注集:对照实体辨认之后的后果

January 12, 2021 · 1 min · jiezi

关于nlp:BookCorpus196640本纯文本书籍的数据集可用于训练GPT等大型语言模型

假如咱们想训练一个世界通用的GPT模型,就像OpenAI一样。因为没有数据,所以通常很难办到。 当初有数据集了——————BookCorpus的"books3",也叫做"all of bibliotik in plain .txt form"数据集。间接下载链接:https://the-eye.eu/public/AI/... Book3数据集数据集的品质十分高,作者为了构建数据集,花了一周工夫修理了epub2txt脚本,在https://github.com/shawwn/scrap中能够查看这个名为“epub2txt-all”的工具。 新脚本的特点:正确保留构造,与目录十分匹配;正确出现数据表(默认状况下 html2txt 次要为表生成垃圾查找后果),正确保留代码构造,使源代码和相似内容在视觉上保持一致,将编号列表从"1\"转换为"1"。通过"ftfy.fix_text()使用在全文上 (这是 OpenAI 对 GPT 的用处)运行全文,将Unicode的撇号替换为ascii编码的撇号;将 Unicode 椭圆扩大到"..."(三个独自的 ascii 字符)。本数据集特点:蕴含196,640本书籍全副txt格局链接更牢靠,可间接下载。链接:books3 tar.gz文件,37Gb以下是对于BookCorpus的介绍,您能够通过本我的项目源码用其余的书目链接自制数据集,也能够在其中下载其余优良的数据集。 BookCorpushttps://github.com/soskek/boo... BookCorpus是一个风行的大型文本语料库,特地适宜在无人监督下学习句子的编码/解码器。然而,BookCorpus 目前不再散发... 此存储库的数据起源包含smashwords.com的数据,是 BookCorpus 的原始起源。收集的句子可能有局部不同,但数量会更大或简直雷同。如果您在工作中应用这个新语料库,请指定它是个正本。 如何应用筹备可用的书籍的 URL。在此存储库曾经有一个列表,因为该列表是在 2019 年 1 月 19 日至 20 日收集的快照 I (@soskek) 。你能够依据须要决定是否应用url_list.jsonl python -u download_list.py > url_list.jsonl & 下载文件。如果不是txt文件,则会从epub提取文本信息。txt`epub--trash-bad-countepub` python download_files.py --list url_list.jsonl --out out_txts --trash-bad-count 后果将保留到--out`out_txts` 后处理应用每行句子格局制作串联文本。 python make_sentlines.py out_txts > all.txt 如果要将它们标记成微软的布林火分段词请运行以下。您能够抉择其余选项。 python make_sentlines.py out_txts | python tokenize_sentlines.py > all.tokenized.txt 环境python3 is recommendedbeautifulsoup4progressbar2blingfirehtml2textlxmlpip install -r requirements.txt后记在下载37GB的压缩包之前,请先看阐明链接。 ...

November 2, 2020 · 1 min · jiezi

关于nlp:Autoregressive-LM与Autoencoder-LM

摘录自知乎XLNet:运行机制及和Bert的异同比拟 1.自回归语言模型(Autoregressive LM)在ELMO/BERT进去之前,通常讲的语言模型其实是依据上文内容预测下一个可能追随的单词,就是常说的自左向右的语言模型工作,或者反过来也行,就是依据下文预测后面的单词,这种类型的LM被称为自回归语言模型。GPT就是典型的自回归语言模型。ELMO只管看上去利用了上文,也利用了下文,然而实质上依然是自回归LM,这个跟模型具体怎么实现有关系。ELMO是做了两个方向(从左到右以及从右到左两个方向的语言模型),然而是别离有两个方向的自回归LM,而后把LSTM的两个方向的隐节点状态拼接到一起,来体现双向语言模型这个事件的。所以其实是两个自回归语言模型的拼接,实质上依然是自回归语言模型。 自回归语言模型有长处有毛病,毛病是只能利用上文或者下文的信息,不能同时利用上文和下文的信息,当然,貌似ELMO这种双向都做,而后拼接看上去可能解决这个问题,因为交融模式过于简略,所以成果其实并不是太好。它的长处,其实跟上游NLP工作无关,比方生成类NLP工作,比方文本摘要,机器翻译等,在理论生成内容的时候,就是从左向右的,自回归语言模型人造匹配这个过程。而Bert这种DAE模式,在生成类NLP工作中,就面临训练过程和利用过程不统一的问题,导致生成类的NLP工作到目前为止都做不太好。 2. 自编码语言模型(Autoencoder LM)自回归语言模型只能依据上文预测下一个单词,或者反过来,只能依据下文预测后面一个单词。相比而言,Bert通过在输出X中随机Mask掉一部分单词,而后预训练过程的次要工作之一是依据上下文单词来预测这些被Mask掉的单词,如果你对Denoising Autoencoder比拟相熟的话,会看出,这的确是典型的DAE的思路。那些被Mask掉的单词就是在输出侧退出的所谓乐音。相似Bert这种预训练模式,被称为DAE LM。 这种DAE LM的优缺点正好和自回归LM反过来,它能比拟天然地融入双向语言模型,同时看到被预测单词的上文和下文,这是益处。毛病次要在输出侧引入[Mask]标记,导致预训练阶段和Fine-tuning阶段不统一的问题,因为Fine-tuning阶段是看不到[Mask]标记的。DAE吗,就要引入乐音,[Mask] 标记就是引入乐音的伎俩,这个失常。 3. XLNET运行机制XLNet的出发点就是:是否交融自回归LM和DAE LM两者的长处。就是说如果站在自回归LM的角度,如何引入和双向语言模型等价的成果;如果站在DAE LM的角度看,它自身是融入双向语言模型的,如何抛掉外表的那个[Mask]标记,让预训练和Fine-tuning保持一致。当然,XLNet还讲到了一个Bert被Mask单词之间互相独立的问题,我置信这个不太重要,起因前面会说。当然,我认为这点不重要的事件,纯正是个人观点。

September 10, 2020 · 1 min · jiezi

关于nlp:A-Survey-on-Deep-Learning-for-Named-Entity-Recognition2020阅读笔记

1. Summary文章次要介绍了NER的资源(NER语料及工具),并从distributed representation for input,context encoder和tag decoder三个维度介绍了目前现有的工作,并调研了目前最具代表性的深度学习办法。最初提出了目前NER零碎面临的挑战以及将来的钻研方向。 2. Introduction(1) NEs通常分为两种:generic NEs (e.g., person and location) and domain-specific NEs (e.g., proteins, enzymes, and genes)。(2) 支流NER办法有以下四种: Rule-based approaches: which do not need annotated data as they rely on hand-crafted rules.Unsupervised learning approaches: which rely on unsupervised algorithms without hand-labeled training examples.Feature-based supervised learning approaches: which rely on supervised learning algorithms with careful feature engineering.Deep-learning based approaches: which automatically discover representations needed for the classification and/or detection from raw input in an end-to-end manner.3. Motivation近年来深度学习办法在多个畛域获得微小的胜利,在NER零碎上利用深度学习办法也胜利在多个NER工作上达成SOTA。作者冀望通过比拟不同的深度学习架构,以获知哪些因素影响了NER的性能。 ...

August 31, 2020 · 1 min · jiezi

关于nlp:零基础入门NLP-基于深度学习的文本分类2

介绍在上一节中, 介绍了FastText中的两种词向量办法, CBoW和Skip-gram. 这里咱们介绍一种相似的办法word2vec, 并应用Gensim来训练咱们的word2vec. word2vec来自Google的Tomas Mikolov等人于2013年在论文Distributed Representations of Words and Phrases and their Compositionality中提出了word2vec词示意办法, word2vec能够分为两种CBoW和Skip-gram模型, 但和上一节中提到的CBoW和Skip-gram有所不同. 能够构想, 依照上一节的思路, 咱们训练CBoW或Skip-gram模型, 最终网络输入的是每个词概率分布(softmax的输入), 而通常而言, 咱们的字典都蕴含了大量的词, 这会导致大量的softmax计算, 显然, 这是很难承受的. 那么如何提高效率呢.上面就介绍两种提高效率的两种办法 Hierarchical Softmaxword2vec也应用了CBoW和Skip-gram来训练模型, 但并没有采纳传统的DNN构造. 最先优化应用的数据结构是用霍夫曼树来代替暗藏层和输入层的神经元,霍夫曼树的叶子节点起到输入层神经元的作用,叶子节点的个数即为词汇表的小大。 而外部节点则起到暗藏层神经元的作用。 具体如何用霍夫曼树来进行CBOW和Skip-Gram的训练咱们在下一节讲,这里咱们先温习下霍夫曼树。 霍夫曼树的建设其实并不难,过程如下: 输出:权值为(w1,w2,...wn)的n个节点 输入:对应的霍夫曼树 将(w1,w2,...wn)看做是有n棵树的森林,每个树仅有一个节点。在森林中抉择根节点权值最小的两棵树进行合并,失去一个新的树,这两颗树散布作为新树的左右子树。新树的根节点权重为左右子树的根节点权重之和。将之前的根节点权值最小的两棵树从森林删除,并把新树退出森林。反复步骤2和3直到森林里只有一棵树为止。上面咱们用一个具体的例子来阐明霍夫曼树建设的过程,咱们有(a,b,c,d,e,f)共6个节点,节点的权值散布是(20,4,8,6,16,3)。 首先是最小的b和f合并,失去的新树根节点权重是7.此时森林里5棵树,根节点权重别离是20,8,6,16,7。此时根节点权重最小的6,7合并,失去新子树,顺次类推,最终失去上面的霍夫曼树。 个别失去霍夫曼树后咱们会对叶子节点进行霍夫曼编码,因为权重高的叶子节点越凑近根节点,而权重低的叶子节点会远离根节点,这样咱们的高权重节点编码值较短,而低权重值编码值较长。这保障的树的带权门路最短,也合乎咱们的信息论,即咱们心愿越罕用的词领有更短的编码。如何编码呢?个别对于一个霍夫曼树的节点(根节点除外),能够约定左子树编码为0,右子树编码为1.如上图,则能够失去c的编码是00。 假如字典蕴含$N$个词, 则应用哈夫曼二叉树之前的softmax层的复杂度为$O(N)$, 而应用哈夫曼二叉树后, 复杂度降为$O(log(N))$. Negative SampleHierarchical Softmax的确能够在很大水平上进步模型的效率, 应用霍夫曼树来代替传统的神经网络,能够进步模型训练的效率。然而如果咱们的训练样本里的中心词w是一个很生僻的词,那么就得在霍夫曼树中辛苦的向下走很久了。能不能不用搞这么简单的一颗霍夫曼树,将模型变的更加简略呢? nagative sampling(负采样)就是一种代替Hierarchical softmax的办法. 比方咱们有一个训练样本,中心词是$w$,它四周上下文共有2c个词,记为context(w)。因为这个中心词w,确实和context(w)相干存在,因而它是一个实在的正例。通过Negative Sampling采样,咱们失去neg个和w不同的中心词$w_i,i=1,2,..neg$,这样context(w)和$w_i$就组成了neg个并不实在存在的负例。利用这一个正例和neg个负例,咱们进行二元逻辑回归,失去负采样对应每个词$w_i$对应的模型参数$\theta_i$,和每个词的词向量。 从下面的形容能够看出,Negative Sampling因为没有采纳霍夫曼树,每次只是通过采样neg个不同的中心词做负例,就能够训练模型,因而整个过程要比Hierarchical Softmax简略。 具体细节能够查阅paper 应用gensim训练word2vec导入库 import loggingimport randomimport numpy as npimport torchlogging.basicConfig(level=logging.INFO, format='%(asctime)-15s %(levelname)s: %(message)s')# set seed def seed_all(seed): random.seed(seed) np.random.seed(seed) torch.cuda.manual_seed(seed) torch.manual_seed(seed) seed_all(0)划分数据 ...

July 31, 2020 · 2 min · jiezi

关于nlp:零基础入门NLP-基于深度学习的文本分类1

学习指标学习FastText的应用和根底调参应用穿插验证进步精度文本示意办法Part2传统文本示意办法的缺点在上一节种, 介绍了几种文本示意办法 One-hotBag of words(BoW)N-gramTF-IDF以上的办法在肯定水平上能够很好的示意文本, 但它们只能挖掘出文本种很无限的信息, 它们更关注文档种单词的统计特色, 而漠视了单词间互相的关系, 并且或多或少存在维度过高的问题. 另外, 通过以上的形式训练的模型, 简直无奈迁徙到其余工作, 因为不同的工作具备不同的字典, 而咱们简直无奈批改训练好的模型中的字典. 这节中, 我会介绍基于深度学习中的其中一种形式FastText, 它更高效, 表达能力也更强. FastText介绍FastText是一个用于高效的词示意和句子分类的库, fasttext提供了2种模型来计算词示意, 别离是cbow和skip-gram. 上面对这两种模型进行简要介绍 在介绍之前, 还须要理解一个概念, Word Embedding. 因为cbow和skip-gram都是word embedding的具体实现形式. word embedding其实更上一节当中的词示意办法很像, 它其实就是词的向量化表现形式, 就好比咱们用RGB3个值来示意一个像素一样. 那么为什么须要embedding呢, 比方在人类语言中, 词cat和dog都是动物, 两者比拟靠近, 那么如何示意两个词比拟类似呢. 再比方intelligent和clever都能够示意聪慧的, 具备雷同的含意; 还有很多这种单词之间的语义关系. 而word embedding能够将这种语义关系进行量化, 从而解决这个问题, 在word embedding中, 咱们期待同一个类别的词向量在嵌入空间中应该靠的比拟近, 即相互之间的间隔比拟小; 没有关系的词应该相距很远等等. 那么如何在思考单词之间的语义信息下对单词进行量化呢, 这就是接下来介绍的内容了 CBOW(continuous bag of words)CBOW也叫间断词袋模型, 它是由一个3层的全连贯神经网络形成, 如下图所示它将每个单词的上下文作为输出, 来预测与上下文绝对应的单词. 比方上面的这个例子: Have a great day 咱们将great作为网络输出, 尝试应用单个上下文输出great来预测指标单词day. 具体来说, 应用输出单词的one-hot向量输出, 而后评估指标单词(day)的one-hot向量与网络输入的损失. 在预测指标单词的one-hot向量的过程中, 网络学习指标单词的向量示意(隐层的输入). ...

July 27, 2020 · 2 min · jiezi

关于nlp:零基础入门NLP-基于深度学习的文本分类1

学习指标学习FastText的应用和根底调参应用穿插验证进步精度文本示意办法Part2传统文本示意办法的缺点在上一节种, 介绍了几种文本示意办法 One-hotBag of words(BoW)N-gramTF-IDF以上的办法在肯定水平上能够很好的示意文本, 但它们只能挖掘出文本种很无限的信息, 它们更关注文档种单词的统计特色, 而漠视了单词间互相的关系, 并且或多或少存在维度过高的问题. 另外, 通过以上的形式训练的模型, 简直无奈迁徙到其余工作, 因为不同的工作具备不同的字典, 而咱们简直无奈批改训练好的模型中的字典. 这节中, 我会介绍基于深度学习中的其中一种形式FastText, 它更高效, 表达能力也更强. FastText介绍FastText是一个用于高效的词示意和句子分类的库, fasttext提供了2种模型来计算词示意, 别离是cbow和skip-gram. 上面对这两种模型进行简要介绍 在介绍之前, 还须要理解一个概念, Word Embedding. 因为cbow和skip-gram都是word embedding的具体实现形式. word embedding其实更上一节当中的词示意办法很像, 它其实就是词的向量化表现形式, 就好比咱们用RGB3个值来示意一个像素一样. 那么为什么须要embedding呢, 比方在人类语言中, 词cat和dog都是动物, 两者比拟靠近, 那么如何示意两个词比拟类似呢. 再比方intelligent和clever都能够示意聪慧的, 具备雷同的含意; 还有很多这种单词之间的语义关系. 而word embedding能够将这种语义关系进行量化, 从而解决这个问题, 在word embedding中, 咱们期待同一个类别的词向量在嵌入空间中应该靠的比拟近, 即相互之间的间隔比拟小; 没有关系的词应该相距很远等等. 那么如何在思考单词之间的语义信息下对单词进行量化呢, 这就是接下来介绍的内容了 CBOW(continuous bag of words)CBOW也叫间断词袋模型, 它是由一个3层的全连贯神经网络形成, 如下图所示它将每个单词的上下文作为输出, 来预测与上下文绝对应的单词. 比方上面的这个例子: Have a great day 咱们将great作为网络输出, 尝试应用单个上下文输出great来预测指标单词day. 具体来说, 应用输出单词的one-hot向量输出, 而后评估指标单词(day)的one-hot向量与网络输入的损失. 在预测指标单词的one-hot向量的过程中, 网络学习指标单词的向量示意(隐层的输入). ...

July 27, 2020 · 2 min · jiezi

关于nlp:零基础入门NLP-基于机器学习的文本分类

任何分类问题, 都须要从数据中开掘有用的特色, 文本分类也不例外. 这里会介绍几种从文本中提取特色的形式. 也是解决文本最根底的办法. 文本示意办法在机器学习算法的训练过程中,假如给定$N$个样本,每个样本有$M$个特色,这样组成了$N×M$的样本矩阵,而后实现算法的训练和预测。同样的在计算机视觉中能够将图片的像素看作特色,每张图片看作hight×width×3的特色图,一个三维的矩阵来进入计算机进行计算。 然而在自然语言畛域,上述办法却不可行:文本是不定长度的。文本示意成计算机可能运算的数字或向量的办法个别称为词嵌入(Word Embedding)办法。词嵌入将不定长的文本转换到定长的空间内,是文本分类的第一步。 One-hot独热标签one-hot通常被用来编码不同类别, 一个编码的每一位对应一个类别, 且只有其中一位是1, 其余均为0. 依照雷同的思维, 咱们也能够用one-hot编码来示意每一个单词. 比方上面两句话 句子1:我 爱 北 京 天 安 门句子2:我 喜 欢 上 海首先会统计两句话中的所有字的类别, 并将每个类别编号 { '我': 1, '爱': 2, '北': 3, '京': 4, '天': 5, '安': 6, '门': 7, '喜': 8, '欢': 9, '上': 10, '海': 11}在这里共包含11个字,因而每个字能够转换为一个11维度稠密向量: 我:[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]爱:[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]...海:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]这种思路看似是正当的, 但存在显著的2个问题 ...

July 25, 2020 · 2 min · jiezi

关于nlp:美团搜索中NER技术的探索与实践

1. 背景命名实体辨认(Named Entity Recognition,简称NER),又称作“专名辨认”,是指辨认文本中具备特定意义的实体,次要包含人名、地名、机构名、专有名词等。NER是信息提取、问答零碎、句法分析、机器翻译、面向Semantic Web的元数据标注等应用领域的重要根底工具,在自然语言解决技术走向实用化的过程中占有重要的位置。在美团搜寻场景下,NER是深度查问了解(Deep Query Understanding,简称 DQU)的底层根底信号,次要利用于搜寻召回、用户用意辨认、实体链接等环节,NER信号的品质,间接影响到用户的搜寻体验。 上面将简述一下实体辨认在搜寻召回中的利用。在O2O搜寻中,对商家POI的形容是商家名称、地址、品类等多个相互之间相关性并不高的文本域。如果对O2O搜索引擎也采纳全副文本域命中求交的形式,就可能会产生大量的误召回。咱们的解决办法如下图1所示,让特定的查问只在特定的文本域做倒排检索,咱们称之为“结构化召回”,可保障召回商家的强相关性。举例来说,对于“海底捞”这样的申请,有些商家地址会形容为“海底捞左近几百米”,若采纳全文本域检索这些商家就会被召回,显然这并不是用户想要的。而结构化召回基于NER将“海底捞”辨认为商家,而后只在商家名相干文本域检索,从而只召回海底捞品牌商家,精准地满足了用户需要。 有别于其余利用场景,美团搜寻的NER工作具备以下特点: 新增实体数量宏大且增速较快:本地生存服务畛域倒退迅速,新店、新商品、新服务品类层出不穷;用户Query往往夹杂很多非标准化表白、简称和热词(如“无忧无虑”、“吸猫”等),这对实现高准确率、高覆盖率的NER造成了很大挑战。畛域相关性强:搜寻中的实体辨认与业务供应高度相干,除通用语义外需退出业务相干常识辅助判断,比方“剪了个头发”,通用了解是泛化形容实体,在搜寻中却是个商家实体。性能要求高:从用户发动搜寻到最终后果出现给用户工夫很短,NER作为DQU的根底模块,须要在毫秒级的工夫内实现。近期,很多基于深度网络的钻研与实际显著进步了NER的成果,但这些模型往往计算量较大、预测耗时长,如何优化模型性能,使之能满足NER对计算工夫的要求,也是NER实际中的一大挑战。2. 技术选型针对O2O畛域NER 工作的特点,咱们整体的技术选型是“实体词典匹配+模型预测”的框架,如图下2所示。实体词典匹配和模型预测两者解决的问题各有偏重,在以后阶段缺一不可。上面通过对三个问题的解答来阐明咱们为什么这么选。 为什么须要实体词典匹配? 答:次要有以下四个起因: 一是搜寻中用户查问的头部流量通常较短、表达形式简略,且集中在商户、品类、地址等三类实体搜寻,实体词典匹配虽简略但解决这类查问准确率也可达到 90%以上。 二是NER畛域相干,通过开掘业务数据资源获取业务实体词典,通过在线词典匹配后可保障辨认后果是畛域适配的。 三是新业务接入更加灵便,只需提供业务相干的实体词表就可实现新业务场景下的实体辨认。 四是NER上游应用方中有些对响应工夫要求极高,词典匹配速度快,根本不存在性能问题。 有了实体词典匹配为什么还要模型预测? 答:有以下两方面的起因: 一是随着搜寻体量的一直增大,中长尾搜寻流量表述简单,越来越多OOV(Out Of Vocabulary)问题开始呈现,实体词典曾经无奈满足日益多样化的用户需要,模型预测具备泛化能力,可作为词典匹配的无效补充。 二是实体词典匹配无奈解决歧义问题,比方“黄鹤楼美食”,“黄鹤楼”在实体词典中同时是武汉的景点、北京的商家、香烟产品,词典匹配不具备消歧能力,这三种类型都会输入,而模型预测则可联合上下文,不会输入“黄鹤楼”是香烟产品。 实体词典匹配、模型预测两路后果是怎么合并输入的? 答:目前咱们采纳训练好的CRF权重网络作为打分器,来对实体词典匹配、模型预测两路输入的NER门路进行打分。在词典匹配无后果或是其门路打分值显著低于模型预测时,采纳模型辨认的后果,其余状况依然采纳词典匹配后果。 在介绍完咱们的技术选型后,接下来会开展介绍下咱们在实体词典匹配、模型在线预测等两方面的工作,心愿能为大家在O2O NER畛域的摸索提供一些帮忙。 3. 实体词典匹配传统的NER技术仅能解决通用畛域既定、既有的实体,但无奈应答垂直畛域所特有的实体类型。在美团搜寻场景下,通过对POI结构化信息、商户评论数据、搜寻日志等独有数据进行离线开掘,能够很好地解决畛域实体辨认问题。通过离线实体库一直的丰盛欠缺累积后,在线应用轻量级的词库匹配实体辨认形式简略、高效、可控,且能够很好地笼罩头部和腰部流量。目前,基于实体库的在线NER识别率能够达到92%。 3.1 离线开掘美团具备丰盛多样的结构化数据,通过对畛域内结构化数据的加工解决能够取得高精度的初始实体库。例如:从商户根底信息中,能够获取商户名、类目、地址、售卖商品或服务等类型实体。从猫眼娱乐数据中,能够获取电影、电视剧、艺人等类型实体。然而,用户搜寻的实体名往往夹杂很多非标准化表白,与业务定义的规范实体名之间存在差别,如何从非标准表白中开掘畛域实体变得尤为重要。 现有的新词开掘技术次要分为无监督学习、有监督学习和近程监督学习。无监督学习通过频繁序列产生候选集,并通过计算紧密度和自由度指标进行筛选,这种办法尽管能够产生充沛的候选汇合,但仅通过特色阈值过滤无奈无效地均衡准确率与召回率,事实利用中通常筛选较高的阈值保障精度而就义召回。先进的新词开掘算法大多为有监督学习,这类算法通常波及简单的语法分析模型或深度网络模型,且依赖领域专家设计繁多规定或大量的人工标记数据。近程监督学习通过开源知识库生成大量的标记数据,尽管肯定水平上缓解了人力标注老本高的问题。然而小样本量的标记数据仅能学习简略的统计模型,无奈训练具备高泛化能力的简单模型。 咱们的离线实体开掘是多源多办法的,波及到的数据源包含结构化的商家信息库、百科词条,半结构化的搜寻日志,以及非结构化的用户评论(UGC)等。应用的开掘办法也蕴含多种,包含规定、传统机器学习模型、深度学习模型等。UGC作为一种非结构化文本,蕴含了大量非标准表白实体名。上面咱们将具体介绍一种针对UGC的垂直畛域新词主动开掘办法,该办法次要蕴含三个步骤,如下图3所示: Step1:候选序列开掘。频繁间断呈现的词序列,是潜在新型词汇的无效候选,咱们采纳频繁序列产生短缺候选汇合。 Step2:基于近程监督的大规模有标记语料生成。频繁序列随着给定语料的变动而扭转,因而人工标记老本极高。咱们利用畛域已有累积的实体词典作为近程监督词库,将Step1中候选序列与实体词典的交加作为训练正例样本。同时,通过对候选序列剖析发现,在上百万的频繁Ngram中仅约10%左右的候选是真正的高质新型词汇。因而,对于负例样本,采纳负采样形式生产训练负例集[1]。针对海量UGC语料,咱们设计并定义了四个维度的统计特色来掂量候选短语可用性: 频率:有意义的新词在语料中该当满足肯定的频率,该指标由Step1计算失去。紧密度:次要用于评估新短语中间断元素的共现强度,包含T散布测验、皮尔森卡方测验、逐点互信息、似然比等指标。信息度:新发现词汇应具备实在意义,指代某个新的实体或概念,该特色次要思考了词组在语料中的逆文档频率、词性散布以及停用词散布。完整性:新发现词汇该当在给定的上下文环境中作为整体解释存在,因而应同时思考词组的子集短语以及超集短语的紧密度,从而掂量词组的完整性。在通过小样本标记数据构建和多维度统计特征提取后,训练二元分类器来计算候选短语预估品质。因为训练数据负例样本采纳了负采样的形式,这部分数据中混合了大量高质量的短语,为了缩小负例噪声对短语预估品质分的影响,能够通过集成多个弱分类器的形式缩小误差。对候选序列汇合进行模型预测后,将得分超过肯定阈值的汇合作为正例池,较低分数的汇合作为负例池。 Step3: 基于深度语义网络的短语品质评估。在有大量标记数据的状况下,深度网络模型能够主动无效地学习语料特色,并产出具备泛化能力的高效模型。BERT通过海量自然语言文本和深度模型学习文本语义表征,并通过简略微调在多个自然语言了解工作上刷新了记录,因而咱们基于BERT训练短语品质打分器。为了更好地晋升训练数据的品质,咱们利用搜寻日志数据对Step2中生成的大规模正负例池数据进行近程领导,将有大量搜寻记录的词条作为有意义的关键词。咱们将正例池与搜寻日志重合的局部作为模型正样本,而将负例池减去搜寻日志汇合的局部作为模型负样本,进而晋升训练数据的可靠性和多样性。此外,咱们采纳Bootstrapping形式,在首次失去短语品质分后,从新依据已有短语品质分以及近程语料搜寻日志更新训练样本,迭代训练晋升短语品质打分器成果,无效缩小了伪正例和伪负例。 在UGC语料中抽取出大量新词或短语后,参考AutoNER[2]对新开掘词语进行类型预测,从而裁减离线的实体库。 3.2 在线匹配原始的在线NER词典匹配办法间接针对Query做双向最大匹配,从而取得成分辨认候选汇合,再基于词频(这里指实体搜寻量)筛选输入最终后果。这种策略比拟简陋,对词库准确度和覆盖度要求极高,所以存在以下几个问题: 当Query蕴含词库未笼罩实体时,基于字符的最大匹配算法易引起切分谬误。例如,搜索词“海坨山谷”,词库仅能匹配到“海坨山”,因而呈现“海坨山/谷”的谬误切分。粒度不可控。例如,搜索词“星巴克咖啡”的切分后果,取决于词库对“星巴克”、“咖啡”以及“星巴克咖啡”的笼罩。节点权重定义不合理。例如,间接基于实体搜寻量作为实体节点权重,当用户搜寻“信阳菜馆”时,“信阳菜/馆”的得分大于“信阳/菜馆”。为了解决以上问题,在进行实体字典匹配前引入了CRF分词模型,针对垂直畛域美团搜寻制订分词准则,人工标注训练语料并训练CRF分词模型。同时,针对模型分词谬误问题,设计两阶段修复形式: 联合模型分词Term和基于畛域字典匹配Term,依据动静布局求解Term序列权重和的最优解。基于Pattern正则表达式的强修复规定。最初,输入基于实体库匹配的成分辨认后果。 4. 模型在线预测对于长尾、未登录查问,咱们应用模型进行在线辨认。 NER模型的演进经验了如下图5所示的几个阶段,目前线上应用的主模型是BERT[3]以及BERT+LR级联模型,另外还有一些在摸索中模型的离线成果也证实无效,后续咱们会综合思考性能和收益逐渐进行上线。搜寻中NER线上模型的构建次要面临三个问题: 性能要求高:NER作为根底模块,模型预测须要在毫秒级工夫内实现,而目前基于深度学习的模型都有计算量大、预测工夫较长的问题。畛域强相干:搜寻中的实体类型与业务供应高度相干,只思考通用语义很难保障模型辨认的准确性。标注数据不足: NER标注工作绝对较难,需给出实体边界切分、实体类型信息,标注过程费时费力,大规模标注数据难以获取。针对性能要求高的问题,咱们的线上模型在降级为BERT时进行了一系列的性能调优;针对NER畛域相干问题,咱们提出了交融搜寻日志特色、实体词典信息的常识加强NER办法;针对训练数据难以获取的问题,咱们提出一种弱监督的NER办法。上面咱们具体介绍下这些技术点。 4.1 BERT模型BERT是谷歌于2018年10月公开的一种自然语言解决办法。该办法一经公布,就引起了学术界以及工业界的宽泛关注。在成果方面,BERT刷新了11个NLP工作的以后最优成果,该办法也被评为2018年NLP的重大进展以及NAACL 2019的best paper[4,5]。BERT和早前OpenAI公布的GPT办法技术路线基本一致,只是在技术细节上存在稍微差别。两个工作的次要奉献在于应用预训练+微调的思路来解决自然语言解决问题。以BERT为例,模型利用包含2个环节: 预训练(Pre-training),该环节在大量通用语料上学习网络参数,通用语料包含Wikipedia、Book Corpus,这些语料蕴含了大量的文本,可能提供丰盛的语言相干景象。微调(Fine-tuning),该环节应用“工作相干”的标注数据对网络参数进行微调,不须要再为指标工作设计Task-specific网络从头训练。将BERT利用于实体辨认线上预测时面临一个挑战,即预测速度慢。咱们从模型蒸馏、预测减速两个方面进行了摸索,分阶段上线了BERT蒸馏模型、BERT+Softmax、BERT+CRF模型。 4.1.1 模型蒸馏 咱们尝试了对BERT模型进行剪裁和蒸馏两种形式,后果证实,剪裁对于NER这种简单NLP工作精度损失重大,而模型蒸馏是可行的。模型蒸馏是用简略模型来迫近简单模型的输入,目标是升高预测所需的计算量,同时保障预测成果。Hinton在2015年的论文中论述了核心思想[6],简单模型个别称作Teacher Model,蒸馏后的简略模型个别称作Student Model。Hinton的蒸馏办法应用伪标注数据的概率分布来训练Student Model,而没有应用伪标注数据的标签来训练。作者的观点是概率分布相比标签可能提供更多信息以及更强束缚,可能更好地保障Student Model与Teacher Model的预测成果达到统一。在2018年NeurIPS的Workshop上,[7]提出一种新的网络结构BlendCNN来迫近GPT的预测成果,实质上也是模型蒸馏。BlendCNN预测速度绝对原始GPT晋升了300倍,另外在特定工作上,预测准确率还略有晋升。对于模型蒸馏,根本能够失去以下论断: ...

July 24, 2020 · 2 min · jiezi

关于nlp:零基础入门NLP-新闻文本分类数据读取与数据分析

数据下载下载数据 !wget https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531810/train_set.csv.zip!wget https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531810/test_a.csv.zip!wget https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531810/test_a_sample_submit.csv解压数据, 共蕴含3个文件, 训练数据(train_set.csv), 测试数据(test_a.csv), 后果提交样例文件(test_a_sample_submit.csv) !mkdir /content/drive/My\ Drive/competitions/NLPNews!unzip /content/test_a.csv.zip -d /content/drive/My\ Drive/competitions/NLPNews/test!unzip /content/train_set.csv.zip -d /content/drive/My\ Drive/competitions/NLPNews/train!mv /content/test_a_sample_submit.csv /content/drive/My\ Drive/competitions/NLPNews/submit.csv!mv /content/drive/My\ Drive/competitions/NLPNews/test/test_a.csv /content/drive/My\ Drive/competitions/NLPNews/test.csv!mv /content/drive/My\ Drive/competitions/NLPNews/test/train_set.csv /content/drive/My\ Drive/competitions/NLPNews/train.csv读取数据import pandas as pdimport osfrom collections import Counterimport matplotlib.pyplot as plt%matplotlib inlineroot_dir = '/content/drive/My Drive/competitions/NLPNews' train_df = pd.read_csv(root_dir+'/train.csv', sep='\t')train_df['word_cnt'] = train_df['text'].apply(lambda x: len(x.split(' ')))train_df.head(10) label text word_cnt 0 2 2967 6758 339 2021 1854 3731 4109 3792 4149 15... 1057 1 11 4464 486 6352 5619 2465 4802 1452 3137 5778 54... 486 2 3 7346 4068 5074 3747 5681 6093 1777 2226 7354 6... 764 3 2 7159 948 4866 2109 5520 2490 211 3956 5520 549... 1570 4 3 3646 3055 3055 2490 4659 6065 3370 5814 2465 5... 307 5 9 3819 4525 1129 6725 6485 2109 3800 5264 1006 4... 1050 6 3 307 4780 6811 1580 7539 5886 5486 3433 6644 58... 267 7 10 26 4270 1866 5977 3523 3764 4464 3659 4853 517... 876 8 12 2708 2218 5915 4559 886 1241 4819 314 4261 166... 314 9 3 3654 531 1348 29 4553 6722 1474 5099 7541 307 ... 1086 查看数据train_df['word_cnt'] = train_df['word_cnt'].apply(int)train_df['word_cnt'].describe()count 200000.000000mean 907.207110std 996.029036min 2.00000025% 374.00000050% 676.00000075% 1131.000000max 57921.000000Name: word_cnt, dtype: float64plt.hist(train_df['word_cnt'], bins=255)plt.title('word counts statistics')plt.xlabel('word counts')plt.show() ...

July 22, 2020 · 2 min · jiezi

关于nlp:零基础入门NLP-新闻文本分类赛题理解

赛题背景本次新人赛是Datawhale与天池联结发动的0根底入门系列赛事第三场 —— 零根底入门NLP之新闻文本分类挑战赛。 赛题以自然语言解决为背景,要求选手依据新闻文本字符对新闻的类别进行分类,这是一个经典文本分类问题。通过这道赛题能够疏导大家走入自然语言解决的世界,带大家接触NLP的预处理、模型构建和模型训练等知识点。 为更好的疏导大家入门,咱们同时为本赛题定制了系列学习计划,其中包含数据迷信库、通用流程和baseline计划学习三局部。通过对本计划的残缺学习,能够帮忙把握数据比赛基本技能。同时咱们也将提供专属的视频直播学习通道。 赛题数据赛题以新闻数据为赛题数据,数据集报名后可见并可下载。赛题数据为新闻文本,并依照字符级别进行匿名解决。整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐的文本数据。 赛题数据由以下几个局部形成:训练集20w条样本,测试集A包含5w条样本,测试集B包含5w条样本。为了预防选手人工标注测试集的状况,咱们将较量数据的文本依照字符级别进行了匿名解决。解决后的赛题训练数据如下: labeltext657 44 66 56 2 3 3 37 5 41 9 57 44 47 45 33 13 63 58 31 17 47 0 1 1 69 26 60 62 15 21 12 49 18 38 20 50 23 57 44 45 33 25 28 47 22 52 35 30 14 24 69 54 7 48 19 11 51 16 43 26 34 53 27 64 8 4 42 36 46 65 69 29 39 15 37 57 44 45 33 69 54 7 25 40 35 30 66 56 47 55 69 61 10 60 42 36 46 65 37 5 41 32 67 6 59 47 0 1 1 68在数据集中标签的对应的关系如下: ...

July 21, 2020 · 1 min · jiezi

图计算黑科技打开中文词嵌入训练实践新模式

在自然语言解决畛域,文本示意学习技术能够帮忙咱们将事实世界转化为计算机能够解决的数据,以求更精准地建设学习模型。而在中文搜索场景下,同音词、易混词、错别字等文本的召回和类似度匹配始终存在着辣手的问题,本文将尝试从图计算的角度来进行中文词向量的训练,并获得了踊跃的成果,心愿与大家一起分享交换。文章作者:翟彬旭,腾讯云大数据高级研发工程师。一、技术背景在中文搜索场景下,同音词、易混词、错别字等文本的召回和类似匹配是一个常见且辣手的问题。NLP(自然语言解决)社区对文本的匹配和召回曾经经验从晚期的基于分词和倒排索引的全文检索过渡到现在风行的文本向量检索。 向量检索通过训练和学习文本的分布式表征失去文本向量,能够解决倒排索引无奈解决的语义类似度匹配问题,而且针对高维向量的大规模疾速检索在业界曾经有相当成熟的解决方案,如Faiss、Nmslib等。 但目前业内罕用的示意学习办法很少思考中文场景下因为输入法输出谬误、发音问题等导致的文本类似匹配问题。 例如,在笔者所在的腾讯云企业画像产品研发过程中,就常常遇到相似的需要。当用户在咱们的产品中搜寻“腾迅科技集团股份有限责任公司”时,此时用户心愿搜寻的企业工商注册名称应该是“腾讯科技(深圳)有限公司”,但因为输入法谬误(将“腾讯”错输为“腾迅”)、认知谬误(将“有限责任公司”误认为“集团股份有限责任公司”)等起因,导致用户输出无奈匹配到想要的搜寻后果,甚至呈现OOV的状况(“腾迅”可能不在词表中)。 如何在无需过多思考语义类似度的前提下解决中文词形学示意学习的问题是本文探讨的重点话题。 二、词嵌入训练的演进在统计学习模型中,应用词嵌入(Word Embedding)实现自然语言解决工作,是NLP畛域里的一项关键技术。常见的词嵌入(又称为文本表征)训练方法及次要特点如下图所示。 图1. 文本分布式表征办法概览 晚期的词嵌入钻研次要包含One-hot编码、TF-IDF等词袋模型。词袋模型(Bag of Words, BOW)是指疏忽文档的语法和语序等因素,将文档仅仅看成是若干无序单词的汇合,并且每个词都是独立的。 这些办法都属于离散表示法,当词汇表宏大时,会占用很大的存储空间,词汇表的大小决定了向量的维度大小,存在维数劫难问题。此外,这类办法无奈通过任何计算失去词语之间的类似度,因而词向量之间不存在关联关系。 鉴于词袋表示法存在维度劫难、语义鸿沟的问题,Yoshua Bengio等人在[1]中证实应用神经网络训练的语言模型能够生成更好的词向量,并且提出了很多优化训练的办法。 如下图所示,整个网络分为两局部,第一局部是利用词特色矩阵C取得词的分布式示意(即词嵌入)。第二局部是将示意context的n个词的词嵌入拼接起来,通过一个暗藏层和一个输入层,最初通过softmax输入以后的p(wt|context)(以后上下文语义的概率分布,最大化要预测的那个词的概率,就能够训练此模型)。 这一模型框架岂但训练了一个用神经网络示意的语言模型,而且作为语言模型的副产物还取得了词语的词嵌入(存在矩阵C中)。 图2. 经典的自然语言模型(Bengio et al., 2003) 经典语言模型的训练存在计算量大的问题(次要集中在隐含层到输入层的全连贯层以及输入层的softmax计算上),具体实现较为艰难,针对这些问题,Mikolov等人[2,3]在语言模型的根底上进行了简化并给出了Cbow和skip-gram两种架构的word2vec模型,同时在具体学习过程中能够采纳两种升高复杂度的近似办法——Hierarchical Softmax和Negative Sampling。 如下图所示,这种架构大大简化了计算量。不过,word2vec训练进去的词向量与单词是一对一的动态映射关系,一词多义问题没有解决。 图3. word2vector模型构造 为了解决一词多义问题,ELMO模型[4]被提出来,它通过语言模型进行学习,失去一个词嵌入示意,在理论应用词嵌入时,依据上下文单词的语义再去调整单词的词嵌入示意,从而使得单词在不同的上下文语境失去不同的词嵌入示意。 网络结构采纳双向LSTM网络。其中前向双层LSTM和逆向LSTM别离代表正方向和反方向编码器,输出别离是单词的上文和下文。一个句子输出到训练好的网络中,最终将失去每个单词三个不同的嵌入示意:双向LSTM中的两层词嵌入示意以及单词的词嵌入示意。其中双向LSTM中的两层词嵌入示意别离编码了单词的句法信息和语义信息。在做理论工作时,网络中单词对应的词嵌入示意将被提取进去作为新特色补充到理论工作中去。 ELMO依据上下文动静调整后的embedding不仅可能找出对应的雷同语义的句子,而且还能够保障找出的句子中的同义词对应的词性也是雷同的。不过,ELMO应用LSTM提取特色的能力不如起初的Transformer,其双向语言模型采取的是用简略的拼接来交融特色,一体化特色交融体现欠佳。 图4. ELMO模型示意图 BERT[5]作为动静词嵌入示意学习的集大成者,是一种双向交融特色的模型。 BERT提出两个工作:MLM(Masked Language Model)和NSP(Next Sentence Predict)。前者是词级别的,其采取的办法是,随机挡住15%的单词,让模型去预测这个单词,可能训练出深度的双向词嵌入向量示意;后者是句子级别的,也是一个二分类工作,其采取的办法是,将两个句子的序列串连作为模型的输出,预测后一句是否是前一句文本的下文,这一办法可能学习句子之间的关系,捕获句子级别的示意。因而BERT失去的词嵌入示意融入了更多的语法、词法以及语义信息,而且动静地扭转词嵌入也可能让单词在不同的语境下具备不同的词嵌入。 不过,BERT 对数据规模要求较高,如果没有足够大的语料,则很难达到预期的成果;其计算量很大,所需老本较高。 图5. BERT模型构造示意图 目前曾经存在的次要词向量模型都是基于东方语言,这些东方语言的外部组成都是拉丁字母,然而,因为中文书写和东方语言齐全不同,中文词语存在同音字、错别字等场景,而且中文字符外部的偏旁部首以及发音也蕴含了很强的语义信息,因而,如何无效利用中文字符外部的语义信息来训练词向量,成为近些年钻研的热点[6,7,8]。 这里的典型代表是2018年蚂蚁金服提出的基于中文笔画的cw2vec模型[6]。文中将中文笔画划分为5类,相似于fasttext[9]的思维,每个词语应用n-gram 窗口滑动的办法将其示意为多个笔画序列。每个 gram 和词语都被示意成向量,用来训练和计算他们之间的类似度。为了简化计算文中也采纳了负采样的办法,试验也获得了良好的成果。 图6. cw2vec模型示意图 三、存在的问题及解决方案从以上相干工作能够看出,以后次要的词嵌入表征学习办法次要集中在从文本语料的上下文语义角度学习词嵌入,对于其余角度如中文词形学角度的钻研较少。采纳这些办法训练学习失去的词向量,即便在中文编辑间隔较近、发音雷同的词语,在词嵌入空间的间隔也相差甚远。 例如,以腾讯AILab公布的百万词向量为例,该版词向量模型能够较好地捕获中文词语间的语义类似度,但对于子词和同音字的类似度量场景,成果欠佳,如下图所示。 图7. 词向量类似度计算示例 在无需过多思考语义类似度的前提下,本文提出从图计算的角度训练学习文本的向量表征,解决中文词形学类似匹配的问题。算法基本原理如下。 将罕用汉字及业务场景下的词库构建无向带权图:每个词语和汉字作为图中一个节点,同时退出子词和拼音节点,顺次在图中的“词语-子词-单字-拼音”节点间建设连边(如图8所示),依据字词之间在拼音和形成上的编辑间隔(此处可依据业务需要灵便设置,亦可间接独自训练权重模型)为节点之间的连边赋予权重。 特地地,本文重点在同音字、平舌音、翘舌音以及子词序列等类型的节点间建设了连边,以保障同音字、易混字在图中可达,同时子词(subword)的引入在肯定水平上保留了文本的语序特色。而后采纳node2vec或metapath2vec等skip-gram类模型学习失去各节点的向量示意,以此作为字符的分布式表征。 图8. 构图示例 ...

July 13, 2020 · 3 min · jiezi

中文预训练模型ERNIE20模型下载及安装

2019年7月,百度ERNIE再升级,发布持续学习的语义理解框架ERNIE 2.0,及基于此框架的ERNIE 2.0预训练模型, 它利用百度海量数据和飞桨(PaddlePaddle)多机多卡高效训练优势,通过深度神经网络与多任务学习等技术,持续学习海量数据和知识。基于该框架的艾尼(ERNIE)预训练模型,已累计学习10亿多知识,包括词法、句法、语义等多个维度的自然语言知识,有很强的通用语义表示能力,适用于各种NLP应用场景,效果提升明显,使用高效、便捷。 本篇内容教大家如何下载和使用! 一、预训练模型下载ERNIE 2.0 英文 Base 模型https://ernie.bj.bcebos.com/E...包含预训练模型参数、词典 vocab.txt、模型配置 ernie_config.jsonERNIE 2.0 英文 Large 模型https://ernie.bj.bcebos.com/E...包含预训练模型参数、词典 vocab.txt、模型配置 ernie_config.json 二、数据下载中文数据:https://ernie.bj.bcebos.com/t... 英文数据:由于数据集协议问题,在这里无法直接提供英文数据集。GLUE 的数据下载方式请参考GLUE 主页(https://gluebenchmark.com/tas... GLUE 提供的数据下载代码(https://gist.github.com/W4nga... )。假设所有数据集下载放置的路径为$GLUE_DATA,将数据下载完毕后,执行sh ./script/en_glue/preprocess/cvt.sh $GLUE_DATA将完成所有数据的格式转换,默认转换后的数据会输出到文件夹./glue_data_processed/。 三、PaddlePaddle安装本项目依赖于 Paddle Fluid 1.5,请参考安装指南(https://www.paddlepaddle.org.... )进行安装。【重要】安装后,需要及时的将 CUDA、cuDNN、NCCL2 等动态库路径加入到环境变量 LD_LIBRARY_PATH 之中,否则训练过程中会报相关的库错误。具体的paddlepaddle配置细节请查阅:https://www.paddlepaddle.org.... 如果您想了解更多的 Paddle 的相关信息,例如针对实际问题建模、搭建自己网络等,这里有更多的来自官方的文档供您参考:• 基本概念 :介绍了 Fluid 的基本使用概念• 准备数据 :介绍使用 Fluid 训练网络时,数据的支持类型及传输方法• 配置简单的网络: 介绍如何针对问题建模,并利用 Fluid 中相关算子搭建网络• 训练神经网络:介绍如何使用 Fluid 进行单机训练、多机训练、以及保存和载入模型变量• 模型评估与调试:介绍在 Fluid 下进行模型评估和调试的方法ERNIE的其他依赖列在requirements.txt文件中,使用以下命令安装 pip install -r requirements.txt 划重点!查看ERNIE模型使用的完整内容和教程,请点击下方链接,建议Star收藏到个人主页,方便后续查看。GitHub:https://github.com/PaddlePadd... 版本迭代、最新进展都会在GitHub第一时间发布,欢迎持续关注! 也邀请大家加入ERNIE官方技术交流QQ群:760439550,可在群内交流技术问题,会有ERNIE的研发同学为大家及时答疑解惑。

November 5, 2019 · 1 min · jiezi

最强中文NLP预训练模型艾尼ERNIE官方揭秘附视频

“最近刚好在用ERNIE写毕业论文”“感觉还挺厉害的”“为什么叫ERNIE啊,这名字有什么深意吗?”“我想让艾尼帮我写作业”看了上面火热的讨论,你一定很好奇“艾尼”、“ERNIE”到底是个啥? 自然语言处理( Natural Language Processing,简称NLP )被誉为人工智能“皇冠上的明珠”。NLP为各类企业及开发者提供用于文本分析及挖掘的核心工具,已经广泛应用在电商、文化娱乐、金融、物流等行业客户的多项业务中。 而艾尼(ERNIE),可谓是目前NLP领域的最强中文预训练模型。 9月5日,百度资深研发工程师龙老师,就通过直播带开发者走近最强中文NLP预训练模型ERNIE,在线上解读了一系列艾尼ERNIE的强大特性,并现场与同为NLP模型的BERT直接PK,让开发者连连感叹,希望能把ERNIE运用到自己的工作与生活之中。 错过了直播没关系,让我们来回顾一下课上都讲了什么~ 什么是艾尼(ERINE)?艾尼(ERNIE)是百度自研的持续学习语义理解框架,该框架支持增量引入词汇(lexical)、语法 (syntactic) 、语义(semantic)等3个层次的自定义预训练任务,能够全面捕捉训练语料中的词法、语法、语义等潜在信息。 这些任务通过多任务学习对模型进行训练更新,每当引入新任务时,该框架可在学习该任务的同时,不遗忘之前学到过的知识。这也意味着,该框架可以通过持续构建不同的预训练任务,持续提升模型效果。因此ERNIE具有了更好的语义理解能力。 ERNIE 2.0持续学习语义理解框架 ERNIE好用么?好不好用,摆事实才知道。 直播环节中,龙老师直接用填空题的形式展示了ERNIE与BERT在填空方面的表现。 例如题目:中国历史上唯一的正统女皇帝是?[?],下面是直播中两种算法的表现: ERNIE的结果是“武则天”,而BERT的结果是“宋太帝”。ERNIE能输出“武则天”说明它确实能学到“武则天”与“女皇帝”之间的关联。 而BERT输出的“宋太帝”虽然每个字“宋”、“太”、“帝”都与“皇帝”相关,但是连在一起就不是一个完整的词,而且也不能与“女皇帝”的形成照应。 再如,陈晓的妻子是?[?] ERNIE用答案向我们证明了自己不只懂百科,也懂八卦。 通过上面的DEMO测试,我们也就引出了这样一个问题: ERNIE和BERT最大的区别是什么?ERNIE1.0能够充分学习词语、短语、命名实体识别中字与字之间的关系,将其整体进行掩码。而BERT不具备这样的能力。ERNIE2.0则通过持续构造辅助任务让ERNIE进行学习,会的任务越多能力越强大。 这与BERT只靠一两个任务进行预训练的思路是完全不同的。就像小学生做题,一直只练一种题型肯定是不行的,需要多种题型都会做,既要有专项突破也要有综合练习,这样才能成为真正的学霸。 随着多样的训练数据的增加,ERNIE通过持续学习就能够学得越来越好。 ERNIE作为模型,也需要与深度学习框架深度配合,才能实现最佳的效果。百度开源的深度学习框架飞桨(PaddlePaddle)对ERNIE模型有非常好的定制优化,使得其加速比达到77%,可以说是ERNIE背后的神助攻。 ERNIE借助飞桨PaddlePaddle多机分布式训练优势,利用79亿tokens训练数据(约1/4的 XLNet 数据)和64张V100(约1/8的XLNet 硬件算力)训练的ERNIE 2.0预训练模型不仅实现了在中英文16个任务上的最优效果,而且为开发人员定制自己的 NLP 模型提供了方案。 目前,百度开源了ERNIE 2.0的Fine-tuning代码和英文预训练模型。 本次基于艾尼ERNIE的直播,同步在爱奇艺、IT大咖说、BiliBili、虎牙、斗鱼五个平台同步直播,收到了近3W开发者的关注与讨论。 直播回放视频已经上线,欢迎大家继续学习~ 回顾ERNIE的原理、优势以及案例,请戳回放视频:http://play.itdks.com/watch/8...http://play.itdks.com/watch/8591895 在11月,ERNIE的线下培训课程也会在上海、成都等地分别落地,欢迎关注“百度NLP”公众号,关注最新报名信息~ 划重点!查看ERNIE模型使用的完整内容和教程,请点击下方链接,建议点击Star收藏到个人主页,方便后续查看。GitHub:https://github.com/PaddlePaddle/ERNIE 版本迭代、最新进展都会在GitHub第一时间发布,欢迎持续关注!也邀请大家加入ERNIE官方技术交流QQ群:760439550,可在群内交流技术问题,会有ERNIE的研发同学为大家及时答疑解惑。

November 4, 2019 · 1 min · jiezi

IJCAI-2019-论文中国团队占-38北大南大榜上有名

场景描述:AI 顶会 IJCAI 2019 已于 8 月 16 日圆满落幕。在连续 7 天的技术盛会中,与会者在工作坊了解了 AI 技术在各个领域的应用场景,聆听了 AI 界前辈的主题演讲,还有机会在圆桌会中了解, AI 发展历史故事以及最新进展与趋势。此外,会议收录的论文无疑是最受关注的内容,我们特此分领域整理了多篇精选论文,与大家分享。关键词:IJCAI 2019 论文 人工智能顶级会议 IJCAI 2019 于 8 月 10 日至 8 月 16 日 ,在中国澳门举行并圆满落幕。 在 8 月 13 日的开幕式上,大会主办方对本次大会的论文收录情况进行了梳理。大会主席 Thomas Eiter 公布了以下信息:今年的 IJCAI 共收到 4752 篇论文提交,最终收录数量达到了历史新高 850 篇,录取率为 17.9% 。 随后大会的程序委员主席 Sarit Kraus 对论文的情况作了详细的说明,相比于去年收录的 3470 篇,今年增长率为 37% ,收录的 850 篇论文中,有 327 篇来自中国,占比 38%。 在论文的主题上,机器学习依然是最热的一个领域,收录数量为 438 篇,超过半数,此外论文数量最多的领域依次为计算机视觉,机器学习应用,自然语言处理。 提交论文中,共有 2516 篇为机器学习领域今年共有 73 位领域主席以及 740 位高级程序委员会成员以及 2696 位程序委员会成员参与论文评审。由他们评审出来的优秀论文都有哪些呢? ...

August 20, 2019 · 1 min · jiezi

滴滴开源DELTAAI开发者可轻松训练自然语言模型

8月2日消息,自然语言处理领域顶级会议ACL2019在意大利弗洛伦萨继续召开。会上滴滴正式宣布开源基于深度学习的语音和自然语言理解模型训练平台DELTA,以进一步帮助AI开发者创建、部署自然语言处理和语音模型,构建高效的解决方案,助力NLP应用更好落地。 DELTA是滴滴第22个开源项目。自然语言处理模型和语音模型是很多AI系统与用户交互的接口,此次滴滴正式这一开源深度学习模型训练框架,旨在进一步降低开发者创建、部署自然语言处理系统和语音模型的难度。 滴滴自然语言处理首席科学家Kevin Knight在ACL2019现场 DELTA主要基于TensorFlow构建,能同时支持NLP(自然语言处理)和语音任务及数值型特征的训练。整合了包括文本分类、命名实体识别、自然语言推理、问答、序列到序列文本生成、语音识别、说话人验证、语音情感识别等重要算法模型,形成一致的代码组织架构,整体包装统一接口。 用户准备好模型训练数据,并指定好配置Configuration,模型训练pipeline可以根据配置进行数据处理,并选择相应的任务和模型,进行模型训练。在训练结束之后,自动生成模型文件保存。该模型文件形成统一接口,可以直接上线使用,快速产品化,能让从研究到生产变得更容易。 值得注意的是,除可支持多种模型的训练,DELTA还支持灵活配置,开发者可基于DELTA搭建成多达几十种的复杂的模型;此外,DELTA在多种常用任务上提供了稳定高效的benchmark,用户可以简单快速的复现论文中的模型的结果,同时也可以在此基础上扩展新的模型。在模型构建完成后,用户可以使用DELTA的部署流程工具,迅速完成模型上线。从论文到产品部署无缝衔接。 目前AI开发者可登陆Github(https://github.com/didi/delta...,利用DELTA加快实验进度,部署用于文本分类、命名实体识别、自然语言推理、问答、序列到序列文本生成、语音识别、说话人验证、语音情感识别等任务的系统。用户亦可在滴滴的开源平台上(https://didi.github.io/)获取更多滴滴开源项目的相关信息。 实际上,NLP和语音技术在滴滴已经有广泛的应用。通过大量应用了包括自然语言处理、深度学习、知识图谱、语音、推荐等技术,滴滴自建了基于AI的智能客服系统,能利用人工智能技术辅助人工客服,提高人工客服处理问题的效率,并减少人工客服在重复、简单问题上的处理量。此外,基于语音识别以及自然语言理解技术,滴滴也在构建驾驶员语音助手,日本和澳洲的滴滴司机即将能用语音直接“免接触”接单。而在未来,这一语音助手也将支持全方位的语音交互服务,包括影音娱乐、信息查询、车内环境调节,到乘客通信、客服,甚至是加油、充电或维保服务。与此同时,滴滴也在积极推进相关能力的开放,通过提供一站式自然语言处理工具、一站式机器人开放平台,帮助行业合作伙伴更好地实现AI应用落地。

August 7, 2019 · 1 min · jiezi

NLP入门十一从文本中提取时间

在我们的日常生活和工作中,从文本中提取时间是一项非常基础却重要的工作,因此,本文将介绍如何从文本中有效地提取时间。 举个简单的例子,我们需要从下面的文本中提取时间: 6月28日,杭州市统计局权威公布《2019年5月月报》,杭州市医保参保人数达到1006万,相比于2月份的989万,三个月暴涨16万人参保,傲视新一线城市。我们可以从文本有提取6月28日,2019年5月, 2月份这三个有效时间。 通常情况下,较好的解决思路是利用深度学习模型来识别文本中的时间,通过一定数量的标记文本和合适的模型。本文尝试利用现有的NLP工具来解决如何从文本中提取时间。 本文使用的工具为哈工大的pyltp,可以在Python的第三方模块中找到,实现下载好分词模型cws.model和词性标注pos.model这两个模型文件。 话不多说,我们直接上Python代码,如下: # -*- coding: utf-8 -*-import osfrom pyltp import Segmentorfrom pyltp import Postaggerclass LTP(object): def __init__(self): cws_model_path = os.path.join(os.path.dirname(__file__), 'cws.model') # 分词模型路径,模型名称为`cws.model` pos_model_path = os.path.join(os.path.dirname(__file__), 'pos.model') # 词性标注模型路径,模型名称为`pos.model` self.segmentor = Segmentor() # 初始化实例 self.segmentor.load(cws_model_path) # 加载模型 self.postagger = Postagger() # 初始化实例 self.postagger.load(pos_model_path) # 加载模型 # 分词 def segment(self, text): words = list(self.segmentor.segment(text)) return words # 词性标注 def postag(self, words): postags = list(self.postagger.postag(words)) return postags # 获取文本中的时间 def get_time(self, text): # 开始分词及词性标注 words = self.segment(text) postags = self.postag(words) time_lst = [] i = 0 for tag, word in zip(postags, words): if tag == 'nt': j = i while postags[j] == 'nt' or words[j] in ['至', '到']: j += 1 time_lst.append(''.join(words[i:j])) i += 1 # 去重子字符串的情形 remove_lst = [] for i in time_lst: for j in time_lst: if i != j and i in j: remove_lst.append(i) text_time_lst = [] for item in time_lst: if item not in remove_lst: text_time_lst.append(item) # print(text_time_lst) return text_time_lst # 释放模型 def free_ltp(self): self.segmentor.release() self.postagger.release()if __name__ == '__main__': ltp = LTP() # 输入文本 sent = '6月28日,杭州市统计局权威公布《2019年5月月报》,杭州市医保参保人数达到1006万,相比于2月份的989万,三个月暴涨16万人参保,傲视新一线城市。' time_lst = ltp.get_time(sent) ltp.free_ltp() # 输出文本中提取的时间 print('提取时间: %s' % str(time_lst)) 接着,我们测试几个例子。 ...

July 14, 2019 · 2 min · jiezi

BERT的几个可能的应用

BERT是谷歌公司于2018年11月发布的一款新模型,它一种预训练语言表示的方法,在大量文本语料(维基百科)上训练了一个通用的“语言理解”模型,然后用这个模型去执行想做的NLP任务。一经公布,它便引爆了整个NLP界,其在11个主流NLP任务中都取得优异的结果,因此成为NLP领域最吸引人的一个模型。简单来说,BERT就是在训练了大量的文本语料(无监督)之后,能够在对英语中的单词(或中文的汉字)给出一个向量表示,使得该单词(或汉字)具有一定的语义表示能力,因此,BERT具有一定的先验知识,在NLP任务中表现十分抢眼。 在文章利用bert-serving-server搭建bert词向量服务(一) 中,作者简洁明了地介绍了如何利用bert-serving-server来获取中文汉字的词向量,这大大降低了一般从业者使用BERT的门槛。 结合笔者这段时间的工作体会以及思考,笔者尝试着给出BERT的几个可能的应用,如下: NLP基本任务查找相似词语提取文本中的实体问答中的实体对齐由于笔者才疏学浅且撰写文章时间仓促,文章中有不足之处,请读者多多批评指正! NLP基本任务 BERT公布已经半年多了,现在已经成为NLP中的深度学习模型中必不可少的工具,一般会加载在模型中的Embedding层。由于篇幅原因,笔者不再介绍自己的BERT项目,而是介绍几个BERT在基本任务中的Github项目: 英语文本分类: BERT-Classification-Tutorial中文情感分类: BERT_Chinese_Classification中文命名实体识别(NER): bertNER可以看到,BERT已经广泛应用于NLP基本任务中,在开源项目中导出可以见到它的身影,并且这些项目的作者也写了非常细致的代码工程,便于上手。 在具体讲述下面的三个应用前,我们先了解下BERT应用的项目结构,如下: 其中,bert_client_lmj.py为调用BERT词向量服务,具体可参考文章利用bert-serving-server搭建bert词向量服务(一) ,完整的Python代码如下: # -*- coding:utf-8 -*-from bert_serving.client import BertClientfrom sklearn.metrics.pairwise import cosine_similarityclass Encoding(object): def __init__(self): self.server_ip = "127.0.0.1" self.bert_client = BertClient(ip=self.server_ip) def encode(self, query): tensor = self.bert_client.encode([query]) return tensor def query_similarity(self, query_list): tensors = self.bert_client.encode(query_list) return cosine_similarity(tensors)[0][1]if __name__ == "__main__": ec = Encoding() print(ec.encode("中国").shape) print(ec.encode("美国").shape) print("中国和美国的向量相似度:", ec.query_similarity(["中国", "美国"])) 查找相似词语 利用词向量可以查找文章中与指定词语最相近的几个词语。具体的做法为:现将文章分词,对分词后的每个词,查询其与指定词语的相似度,最后按相似度输出词语即可。我们的示例文章为老舍的《养花》,内容如下: 我爱花,所以也爱养花。我可还没成为养花专家,因为没有工夫去研究和试验。我只把养花当做生活中的一种乐趣,花开得大小好坏都不计较,只要开花,我就高兴。在我的小院子里,一到夏天满是花草,小猫只好上房去玩,地上没有它们的运动场。花虽然多,但是没有奇花异草。珍贵的花草不易养活,看着一棵好花生病要死,是件难过的事。北京的气候,对养花来说不算很好,冬天冷,春天多风,夏天不是干旱就是大雨倾盆,秋天最好,可是会忽然闹霜冻。在这种气候里,想把南方的好花养活,我还没有那么大的本事。因此,我只养些好种易活、自己会奋斗的花草。不过,尽管花草自己会奋斗,我若是置之不理,任其自生自灭,大半还是会死的。我得天天照管它们,像好朋友似的关心它们。一来二去,我摸着一些门道:有的喜阴,就别放在太阳地里;有的喜干,就别多浇水。摸着门道,花草养活了,而且三年五载老活着、开花,多么有意思啊!不是乱吹,这就是知识呀!多得些知识决不是坏事。我不是有腿病吗,不但不利于行,也不利于久坐。我不知道花草们受我的照顾,感谢我不感谢;我可得感谢它们。我工作的时候,我总是写一会儿就到院中去看看,浇浇这棵,搬搬那盆,然后回到屋里再写一会儿,然后再出去。如此循环,让脑力劳动和体力劳动得到适当的调节,有益身心,胜于吃药。要是赶上狂风暴雨或天气突变,就得全家动员,抢救花草,十分紧张。几百盆花,都要很快地抢到屋里去,使人腰酸腿疼,热汗直流。第二天,天气好了,又得把花都搬出去,就又一次腰酸腿疼,热汗直流。可是,这多么有意思呀!不劳动,连棵花也养不活,这难道不是真理吗?送牛奶的同志进门就夸“好香”,这使我们全家都感到骄傲。赶到昙花开放的时候,约几位朋友来看看,更有秉烛夜游的味道——昙花总在夜里开放。花分根了,一棵分为几棵,就赠给朋友们一些。看着友人拿走自己的劳动果实,心里自然特别欢喜。当然,也有伤心的时候,今年夏天就有这么一回。三百棵菊秧还在地上(没到移入盆中的时候),下了暴雨,邻家的墙倒了,菊秧被砸死三十多种,一百多棵。全家人几天都没有笑容。有喜有忧,有笑有泪,有花有果,有香有色,既须劳动,又长见识,这就是养花的乐趣。指定词语为“开心”,查询《养花》一文中与“开心”最为接近的5个词语,完整的Python代码如下:(find_similar_words.py) # -*- coding:utf-8 -*-import jiebafrom bert_client_lmj import Encodingfrom operator import itemgetter# 读取文章with open('./doc.txt', 'r', encoding='utf-8') as f: content = f.read().replace('\n', '')ec = Encoding()similar_word_dict = {}# 查找文章中与'开心'的最接近的词语words = list(jieba.cut(content))for word in words: print(word) if word not in similar_word_dict.keys(): similar_word_dict[word] = ec.query_similarity([word, '开心'])# 按相似度从高到低排序sorted_dict = sorted(similar_word_dict.items(), key=itemgetter(1), reverse=True)print('与%s最接近的5个词语及相似度如下:' % '开心')for _ in sorted_dict[:5]: print(_)输出的结果如下: ...

June 7, 2019 · 2 min · jiezi

NLP入门十使用LSTM进行文本情感分析

情感分析简介 文本情感分析(Sentiment Analysis)是自然语言处理(NLP)方法中常见的应用,也是一个有趣的基本任务,尤其是以提炼文本情绪内容为目的的分类。它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。 本文将介绍情感分析中的情感极性(倾向)分析。所谓情感极性分析,指的是对文本进行褒义、贬义、中性的判断。在大多应用场景下,只分为两类。例如对于“喜爱”和“厌恶”这两个词,就属于不同的情感倾向。 本文将详细介绍如何使用深度学习模型中的LSTM模型来实现文本的情感分析。 文本介绍及语料分析 我们以某电商网站中某个商品的评论作为语料(corpus.csv),该数据集的下载网址为:https://github.com/renjunxiang/Text-Classification/blob/master/TextClassification/data/data_single.csv ,该数据集一共有4310条评论数据,文本的情感分为两类:“正面”和“反面”,该数据集的前几行如下: evaluation,label用了一段时间,感觉还不错,可以,正面电视非常好,已经是家里的第二台了。第一天下单,第二天就到本地了,可是物流的人说车坏了,一直催,客服也帮着催,到第三天下午5点才送过来。父母年纪大了,买个大电视画面清晰,趁着耳朵还好使,享受几年。,正面电视比想象中的大好多,画面也很清晰,系统很智能,更多功能还在摸索中,正面不错,正面用了这么多天了,感觉还不错。夏普的牌子还是比较可靠。希望以后比较耐用,现在是考量质量的时候。,正面物流速度很快,非常棒,今天就看了电视,非常清晰,非常流畅,一次非常完美的购物体验,正面非常好,客服还特意打电话做回访,正面物流小哥不错,辛苦了,东西还没用,正面送货速度快,质量有保障,活动价格挺好的。希望用的久,不出问题。,正面 接着我们需要对语料做一个简单的分析: 数据集中的情感分布;数据集中的评论句子长度分布。 使用以下Python脚本,我们可以统计出数据集中的情感分布以及评论句子长度分布。 import pandas as pdimport matplotlib.pyplot as pltfrom matplotlib import font_managerfrom itertools import accumulate# 设置matplotlib绘图时的字体my_font = font_manager.FontProperties(fname="/Library/Fonts/Songti.ttc")# 统计句子长度及长度出现的频数df = pd.read_csv('./corpus.csv')print(df.groupby('label')['label'].count())df['length'] = df['evaluation'].apply(lambda x: len(x))len_df = df.groupby('length').count()sent_length = len_df.index.tolist()sent_freq = len_df['evaluation'].tolist()# 绘制句子长度及出现频数统计图plt.bar(sent_length, sent_freq)plt.title("句子长度及出现频数统计图", fontproperties=my_font)plt.xlabel("句子长度", fontproperties=my_font)plt.ylabel("句子长度出现的频数", fontproperties=my_font)plt.savefig("./句子长度及出现频数统计图.png")plt.close()# 绘制句子长度累积分布函数(CDF)sent_pentage_list = [(count/sum(sent_freq)) for count in accumulate(sent_freq)]# 绘制CDFplt.plot(sent_length, sent_pentage_list)# 寻找分位点为quantile的句子长度quantile = 0.91#print(list(sent_pentage_list))for length, per in zip(sent_length, sent_pentage_list): if round(per, 2) == quantile: index = length breakprint("\n分位点为%s的句子长度:%d." % (quantile, index))# 绘制句子长度累积分布函数图plt.plot(sent_length, sent_pentage_list)plt.hlines(quantile, 0, index, colors="c", linestyles="dashed")plt.vlines(index, 0, quantile, colors="c", linestyles="dashed")plt.text(0, quantile, str(quantile))plt.text(index, 0, str(index))plt.title("句子长度累积分布函数图", fontproperties=my_font)plt.xlabel("句子长度", fontproperties=my_font)plt.ylabel("句子长度累积频率", fontproperties=my_font)plt.savefig("./句子长度累积分布函数图.png")plt.close()输出的结果如下: ...

May 18, 2019 · 4 min · jiezi

减肥这么难靠人工智能行不行

肥胖已经成为全球性问题,而减肥从来都是口号易喊实践难。很多人工智能公司利用大数据、机器学习、计算机视觉等技术,帮助广大「胖友」管住嘴,迈开腿,同时为其进行个性化瘦身建议。「复联 4」中,雷神索尔挺着大肚腩出现,昔日的男神竟然变成了「死肥宅」。于是很多影迷调侃:「2012 年我发誓要拥有雷神一样的身材,2019 年我终于做到了!」 然而,告诉你一个恐怖故事:雷神的肚腩是假的,可你的啤酒肚却是真材实料。 眼看着夏天来了,很多人又一次把减肥提上了日程。然而,节食,瑜伽,减肥操,轻断食……尝试了十八般武艺,镜子里的你依然自带「游泳圈」。还记得那首「燃烧我的卡路里」,唱出了多少人的心声。 看看身边有多少人,把头像换成了「不瘦十斤,不换头像」,后来发现自己当初太天真,还是默默地换掉;又有多少人在朋友圈晒了几天开水煮白菜和健身照,最后又回归了烧烤蛋糕甜甜圈…… 肥胖是个全球性问题根据世界卫生组织的在 2018 年的报告,肥胖问题已经越来越严重。 自 1975 年以来,世界肥胖人数已增长近三倍。2016 年,18 岁及以上的成年人中逾 19 亿人超重,其中超过 6.5 亿人肥胖。换成比例来说,就是 18 以上的成年人中有 39% 超重,且 13% 为肥胖。 国内身体健康状况也不容乐观,根据中国疾病预防控制中心数据,全国肥胖率为 11.9%,超重率为 30.1%;天津超重率最高,达 40.9%;北京肥胖率最高,为 25.9%。 这些数字再次提醒我们,减轻体重,拥有健康体型刻不容缓。但是,说起来容易做起来难,年复一年,总是越减越肥。 其实,无论减肥的花样有多少,终极要诀总是这六个字:管住嘴,迈开腿。然而,就是这简简单单的六个字,却是很多人努力多年都无法到达的彼岸。 那么如今无处不在的人工智能,有办法解决这一问题吗? 管不住嘴?AI 帮你所谓减肥塑形讲究「七分靠吃,三分靠练」,所以,管住嘴是减肥第一要务。 雀巢、 Poundaweek 等公司都利用大数据与计算机视觉等技术,为广大胖友分析饮食热量、营养,并推荐合理饮食计划,从而帮助他们「管住嘴」。 控制饮食是减肥成功的关键一步。在这个方面,基于数据分析出来的饮食条件,自然要贴合个人的情况。 目前已经有很多饮食方面的 AI 应用。比如用户拍摄食物的照片上传至平台,通过机器学习模型,分析出食物中的卡路里和营养,再结合用户的生活习惯,年龄性别等因素,给出更合理的饮食建议。避免过多热量的摄入。 雀巢还推出了能够建议人们合理饮食的 AI 音箱 迈不开腿? AI 帮你AI 不仅帮大家管住嘴,还要促进大家迈开腿。 现在能够监控大家的硬件和软件都不在少数,其中就有一些产品,利用大数据和人工智能的方法,提醒用户有一个健康的锻炼习惯。 比如利用可穿戴设备,监控用户的活动数据,通过对数据的分析,结合用户的个人习惯,能够定制出实行的智能方案,打造出个性化的健身教练。 Google Coach 会为用户推荐健身方式,跟踪锻炼进度等 这一领域比较著名的就是 Google Coach ,它还能为用户提供一些日常健康提示,例如饮用多少水,何时服用药物或应采取多少步骤。 想吃零食?AI 帮你 Say No国外一些计算机专家正在研究用人工智能技术来塑造一个聊天机器人,旨在帮助超重人群从心底拒绝高热量,接受健康饮食。 现在 App 商店里,计算卡路里的软件很多,但是单纯地计算热量很难让人们放弃眼前的美食。所以,这类聊天机器人的设计者希望,从心理上了解人们为什么为什么想要吃得不健康。 ...

May 14, 2019 · 1 min · jiezi

自然语言处理-L01

基本概念自然语言理解, NLU, Understanding形式化(标准化)的数学符号、模型, 模拟人的语言能力 计算语言学, Computational Linguistics数学模型 自然语言处理, NLP更宽泛的概念。 利用计算机, 对人类的书面和口头形式的自然语言的信息进行处理和加工 语言一个符号系统, 意义(知识) + 规则(语法) 第一系统 --- 语音系统 Sound System第二系统 --- 文字系统(书写系统) Writing System 口头语和书面语 语言和言语 语言单位单个字符, 词(word), 短语(Phrase), 句子(Sentence), 语段, 篇章(Utterence) 自然语言的作用思维的载体, 交流的工具 人类历史以语言文字形式记载和流传的只是占总量的 80% 以上, 图表占的比例很小 基本问题如何让计算机具有语言处理的能力,如何让计算机实现自动的或人机互助的语言处理功能 如何利用计算机处理海量的语言信息,自动处理,知识挖掘,有效利用 学科特点 --- 交叉性学科语言学:形式语言文法,词典、语料库(标注、分词等)、知识库 数学:概率论、统计学、信息论,自动机、Markov模型、HMM模型 计算机科学:自动机器学习,自动人工智能,状态空间的图搜索算法 心理语言学:研究人类理解自然语言的机制 语言学基本知识:语言研究的基本范畴 例子英汉翻译Miss Smith put two books on this table 形态分析 ...

May 12, 2019 · 1 min · jiezi

NLP入门九词义消岐WSD的简介与实现

词义消岐简介 词义消岐,英文名称为Word Sense Disambiguation,英语缩写为WSD,是自然语言处理(NLP)中一个非常有趣的基本任务。 那么,什么是词义消岐呢?通常,在我们的自然语言中,不管是英语,还是中文,都有多义词存在。这些多义词的存在,会让人对句子的意思产生混淆,但人通过学习又是可以正确地区分出来的。 以“小米”这个词为例,如果仅仅只是说“小米”这个词语,你并不知道它实际指的到底是小米科技公司还是谷物。但当我们把词语置于某个特定的语境中,我们能很好地区分出这个词语的意思。比如, 雷军是小米的创始人。在这个句子中,我们知道这个“小米”指的是小米科技公司。比如 我今天早上喝了一碗小米粥。在这个句子中,“小米”指的是谷物、农作物。 所谓词义消岐,指的是在特定的语境中,识别出某个歧义词的正确含义。 那么,词义消岐有什么作用呢?词义消岐可以很好地服务于语言翻译和智能问答领域,当然,还有许多应用有待开发~ 词义消岐实现 在目前的词义消岐算法中,有不少原创算法,有些实现起来比较简单,有些想法较为复杂,但实现的效果普遍都不是很好。比较经典的词义消岐的算法为Lesk算法,该算法的想法很简单,通过对某个歧义词构建不同含义的语料及待判别句子中该词语与语料的重合程度来实现,具体的算法原理可参考网址:https://en.wikipedia.org/wiki/Lesk_algorithm . 在下面的部分中,笔者将会介绍自己想的一种实现词义消岐的算法,仅仅是一个想法,仅供参考。 我们以词语“火箭”为例,选取其中的两个义项(同一个词语的不同含义):NBA球队名 和 燃气推进装置 ,如下: 获取语料 首先,我们利用爬虫爬取这两个义项的百度百科网页,以句子为单位,只要句子中出现该词语,则把这句话加入到这个义项的预料中。爬虫的完整Python代码如下: import requestsfrom bs4 import BeautifulSoupfrom pyltp import SentenceSplitterclass WebScrape(object): def __init__(self, word, url): self.url = url self.word = word # 爬取百度百科页面 def web_parse(self): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \ (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'} req = requests.get(url=self.url, headers=headers) # 解析网页,定位到main-content部分 if req.status_code == 200: soup = BeautifulSoup(req.text.encode(req.encoding), 'lxml') return soup return None # 获取该词语的义项 def get_gloss(self): soup = self.web_parse() if soup: lis = soup.find('ul', class_="polysemantList-wrapper cmn-clearfix") if lis: for li in lis('li'): if '<a' not in str(li): gloss = li.text.replace('▪', '') return gloss return None # 获取该义项的语料,以句子为单位 def get_content(self): # 发送HTTP请求 result = [] soup = self.web_parse() if soup: paras = soup.find('div', class_='main-content').text.split('\n') for para in paras: if self.word in para: sents = list(SentenceSplitter.split(para)) for sent in sents: if self.word in sent: sent = sent.replace('\xa0', '').replace('\u3000', '') result.append(sent) result = list(set(result)) return result # 将该义项的语料写入到txt def write_2_file(self): gloss = self.get_gloss() result = self.get_content() print(gloss) print(result) if result and gloss: with open('./%s_%s.txt'% (self.word, gloss), 'w', encoding='utf-8') as f: f.writelines([_+'\n' for _ in result]) def run(self): self.write_2_file()# NBA球队名#url = 'https://baike.baidu.com/item/%E4%BC%91%E6%96%AF%E6%95%A6%E7%81%AB%E7%AE%AD%E9%98%9F/370758?fromtitle=%E7%81%AB%E7%AE%AD&fromid=8794081#viewPageContent'# 燃气推进装置url = 'https://baike.baidu.com/item/%E7%81%AB%E7%AE%AD/6308#viewPageContent'WebScrape('火箭', url).run()利用这个爬虫,我们爬取了“火箭”这个词语的两个义项的语料,生成了火箭_燃气推进装置.txt文件和火箭_NBA球队名.txt文件,这两个文件分别含有361和171个句子。以火箭_燃气推进装置.txt文件为例,前10个句子如下: ...

May 12, 2019 · 4 min · jiezi

盗版猖獗时代谁会成为终结者

利用机器学习、深度学习和大数据、云计算等技术,实现版权监测、登记及维权,打击盗版行为,终结盗版时代。今天,思否 CEO 的一篇文章,让 CSDN 陷入舆论中心。 起因是,思否的一些作者发现,在CSDN 的下载频道,自己的付费课程被盗版。作为知名的社区交流平台,CSDN 下载频道占据了 30 % 的流量,但在内容监管中,却并不给力。 文章里,作者指出了 CSDN 的侵权和盗版事件绝非个案,而网络上的这种侵权和盗版事件似乎也没有高效的遏制办法。 类似的内容盗版行为,在音乐、影视行业也屡见不鲜。比如今年春节档的科幻大片「流浪地球」,在上映第二天就被爆出盗版资源,以几元的价格在线售卖。而且不是通常所见「盗录」的模糊「枪版」,大部分还是高清片源。 实在猖獗。 打击盗版难在哪里盗版和假冒伪劣产品屡禁不止的原因,在于这些产品往往是免费或者低价的形式分享,在互联网时代,它们的传播更加难以遏制。 在利益驱动下,盗版屡禁不止除了网络环境复杂常常难以发现,还有一个原因在于惩治不力。 根据目前相关规定,即使泄露片源,赔偿金额也不过是合同原价的双倍,甚至更低;此外,针对盗版等侵权行为虽有行政处罚,但缺乏强制措施,威慑力不足。 如果不是多方作者发现并揭露这件事,也许很多人还蒙在鼓里。 从以下数字我们可以看到盗版横行的市场有多大。Frontier Economics 2017 年的一项研究表明,到 2022 年,假冒和盗版商品的总价值可能上涨到 2.81 万亿美元(19.11 万亿人民币。其中,中国占全球仿冒和盗版商品总额的 46%。该研究还估计,到 2022 年,与假冒和盗版有关的净失业人数可能高达 540 万。 面对如此猖獗的盗版产业,似乎必须助人工智能来打击了。 自动化版权保护一家位于巴塞罗那的知识产权和品牌保护创业公司 Red Points ,正在利用技术解决这个全球性的问题。 Red Points 提供品牌保护、反盗版服务公司基于 SaaS 的云解决方案系统会代表客户,在网上搜寻假冒伪劣产品或盗版内容,并自动将其删除,以此为企业进行在线 IP 侵权检测、自动化移除假货信息和盗版内容。 该公司 CEO Urquizu 认为,机器学习工具,如计算机视觉和自然语言处理,可以帮助品牌更快地搜索信息和检测假货,从而实现知识产权保护的自动执行。 「与基于服务的方法相反,只有可扩展的技术解决方案,才能显著应对由知识产权侵权引发的挑战,」Urquizu 说。 该公司反盗版的方法具体分为以下步骤: 跟踪:通过关键字监控系统检测并消除在线 IP 侵权,这些系统由客户通过简单的平台进行管理。此外,版权保护专家会每天识别和更新盗版来源,机器学习也会使用检测记录来添加新的搜索规则,不断进行自我提高。 删除:自动执行版权并跟进来源。一旦发现违规行为,使用自动化规则立即发送删除和接触索引请求,并采取庭外行动制止进一步侵权行为。 报告:发现侵权行为后,客户可收到定制报告,查看自己知识产权保护范围,平台还会识别其他侵权事件趋势并追踪侵权者来源, 反盗版中的追踪环节另外,通过使用机器学习和深度学习技术,公司可以通过线上系统,获取客户的账户历史信息,不断更新,从而能够不断删除新的侵权威胁。如果检测到潜在的侵权威胁,会及时预警客户。 「当品牌保护和反盗版实现自动化时,从检测到侵权事件,到移除侵权内容,平均需要花费四个半小时,而手动完成这个过程通常需要数天或数周,」Urquizu 说。「在有效打击在线假冒产品方面,速度和准确性至关重要,而这只能通过智能技术实现。」 每天,Red Points 的专有软件都会从互联网上删除 100,000 多起非法产品和相关内容。其技术目前帮助 400 多家客户在全球 100 多个市场上处理虚假内容,成功率达 96%。 ...

May 9, 2019 · 1 min · jiezi

使用CRF实现命名实体识别NER

CRF与NER简介 CRF,英文全称为conditional random field, 中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫(Markov)随机场。 较为简单的条件随机场是定义在线性链上的条件随机场,称为线性链条件随机场(linear chain conditional random field). 线性链条件随机场可以用于序列标注等问题,而本文需要解决的命名实体识别(NER)任务正好可通过序列标注方法解决。这时,在条件概率模型P(Y|X)中,Y是输出变量,表示标记序列(或状态序列),X是输入变量,表示需要标注的观测序列。学习时,利用训练数据 集通过极大似然估计或正则化的极大似然估计得到条件概率模型p(Y|X);预测时,对于给定的输入序列x,求出条件概率p(y|x)最大的输出序列y0. 命名实体识别(Named Entity Recognition,简称NER)是信息提取、问答系统、句法分析、机器翻译等应用领域的重要基础工具,在自然语言处理技术走向实用化的过程中占有重要地位。一般来说,命名实体识别的任务就是识别出待处理文本中三大类(实体类、时间类和数字类)、七小类(人名、机构名、地名、时间、日期、货币和百分比)命名实体。常见的实现NER的算法如下: 本文不准备详细介绍条件随机场的原理与实现算法,关于具体的原理与实现算法,可以参考《统计学习算法》一书。我们将借助已实现条件随机场的工具——CRF++来实现命名实体识别。关于用深度学习算法来实现命名实体识别, 可以参考文章:NLP入门(五)用深度学习实现命名实体识别(NER)。 CRF++简介 CRF++是著名的条件随机场的开源工具,也是目前综合性能最佳的CRF工具,采用C++语言编写而成。其最重要的功能我认为是采用了特征模板。这样就可以自动生成一系列的特征函数,而不用我们自己生成特征函数,我们要做的就是寻找特征,比如词性等。关于CRF++的特性,可以参考网址:http://taku910.github.io/crfpp/ 。 安装 CRF++的安装可分为Windows环境和Linux环境下的安装。关于Linux环境下的安装,可以参考文章:CRFPP/CRF++编译安装与部署 。 在Windows中CRF++不需要安装,下载解压CRF++0.58文件即可以使用,下载网址为:https://blog.csdn.net/lilong117194/article/details/81160265 。 使用1. 语料 以我们本次使用的命名实体识别的语料为例,作为CRF++训练的语料(前20行,每一句话以空格隔开。)如下: played VBD Oon IN OMonday NNP O( ( Ohome NN Oteam NN Oin IN OCAPS NNP O) ) O: : OAmerican NNP B-MISCLeague NNP I-MISCCleveland NNP B-ORG2 CD ODETROIT NNP B-ORG1 CD OBALTIMORE VB B-ORG需要注意字与标签之间的分隔符为制表符t,否则会导致feature_index.cpp(86) [max_size == size] inconsistent column size错误。 ...

April 30, 2019 · 5 min · jiezi

windows10下,零基础学习VUE(8)-- 小练习,知识图谱可视化(ltp抽取文本关系,echarts展示图谱)

新坑!echarts的引入graph的设置data.nodesdata.linksltp安装文本解析及节点和关系的json格式生成图谱展示

April 17, 2019 · 1 min · jiezi

windows10下,零基础学习VUE(7)-- 小练习,使用lstm学习红楼梦文本,搭建前端与后端进行参数交互

!!挖坑中<template> <div class=‘index_auto’> <div style=“text-align: center;"> <h1>红楼梦风格文字生成</h1> <p>输入框填入文字作为开头,点击生成,可以续写一小段片段</p> <p> <div>创造性:越高则随意发挥行越强,也就可能越不通顺</div> <div>最大文字数:生成篇章的最大文字数量</div> </p> </div> <p><br><br></p> <div style=“display: flex; justify-content:center;"> <el-row :gutter=“30” > <el-col :span=“12”> <div class=“block”> <span class=“demonstration”>创造性</span> <el-slider show-input v-model=“tmperature” :step=“10”> </el-slider> </div> </el-col> <el-col :span=“12”><div > <span class=“demonstration”>最大文字数</span> <el-slider :max=“max_num” show-input v-model=“maxlen” :step=“50” show-stops> </el-slider> </div></el-col> <el-col :span=“12”><div> <span class=“demonstration”>生成次数</span> <el-slider :max=“max_count” show-input v-model=“gennum” :step=“1” show-stops> </el-slider> </div></el-col> <el-col :span=“12”><div> <span class=“demonstration”>测试</span> <el-slider show-input v-model=“test_to_reply” :step=“1” show-stops> </el-slider> </div></el-col> </el-row> </div> <div style=“height:400px; margin:0 auto; overflow:auto”> <el-row :gutter=“20”> <el-col :span=“10”> <div class=“grid-content”> <el-input type=“textarea” :autosize=”{ minRows: 9, maxRows: 9}” placeholder=“请输入内容” v-model=“textarea1”> </el-input> </div> </el-col> <el-col :span=“4”><div class=“grid-content” style=“display: flex; justify-content:center; align-items:Center;"> <el-button type=“success” @click=“getGentxt” round> Generate HLM TXT </el-button> </div></el-col> <el-col :span=“10”><div class=“grid-content”> <el-tabs v-model=“activeName2” type=“border-card” > <el-tab-pane v-for="(txt,index) in splittxt” :key=“index” :label=“int2string(index)” :name=“int2string(index)"><p>{{txt}}</p></el-tab-pane> </el-tabs> </div></el-col> </el-row> </div> <img v-if=“resultUrl” :src=“resultUrl” class=“avatar”> <p class=“avatar”>{{resultClass}}</p> </div></template> ...

April 15, 2019 · 1 min · jiezi

从0到1,了解NLP中的文本相似度

本文由云+社区发表作者:netkiddy导语AI在2018年应该是互联网界最火的名词,没有之一。时间来到了9102年,也是项目相关,涉及到了一些AI写作相关的功能,为客户生成一些素材文章。但是,AI并不一定最懂你,客户对于AI写出来的文章,多少是会做些修改的。为了更好的衡量出AI文章的可用度,在这儿就会需要存有一个反馈的环节,来看看用户润色后的文章与原始AI文章之间的区别是多大,AI写出来的文章可用性是否足够。由于目前还没精力细究AI写作其中的细节,为了更好地计算每次成文与原文的区分,便花了点小时间看了看文本相似度的知识点,记录于此。本文将从预备知识的概念开始介绍,从距离名词,到文本分词,相似度算法,并将这些概念融合、统一的介绍NLP中文本相似度的知识,期望通过本文,大家可以与我一样,对这些知识有个基本的了解。几个距离在介绍更多的内容之前,我们需要了解文本距离的概念,这些距离是我们在后文比较文本相似度的基础,所以下面将首先形象的为大家介绍几个重要且基础的距离含义。欧几里德距离Euclidean Distance,是最直白的、最容易直观理解的距离度量方法,在二维空间来看,用一句几乎耳熟能详的话来解释就是:两点之间直线最短。这句话中说到的「直线距离」就是欧几里德距离。我们来看下相关数学公式定义。二维的公式: p = sqrt( (x1-y1)^2+(x2-y2)^2 )三维的公式: p = sqrt( (x1-y1)^2+(x2-y2)^2+(x3-y3)^2 )当然,毕竟不是存活于刘慈溪的三体世界之下,我们在小学或者日常所能感知到的多是,二维或者三维空间的距离,当大于3维,从数学理论上的n维空间的公式,在欧几里德空间中,点x =(x1,…,xn)和 y =(y1,…,yn)之间的欧氏距离为: p = sqrt( (x1-y1)^2+(x2-y2)^2+(x3-y3)^2+ … +(xn-yn)^2 )曼哈顿距离Manhattan Distance的命名原因,是从规划为方型建筑区块的城市(如曼哈顿)间,最短的出租车从一个点A到另一个点B的行车路径距离,任何往东三区块、往北六区块的的路径一定最少要走九区块(出租车当然不能穿插过街区),没有其他捷径。抽象到数学角度,从点A(x1, y1)到点B(x2, y2)的曼哈顿距离为两个点上在标准坐标系上的绝对轴距之总和: p = |x1-x2| + |y1-y2|那么,曼哈顿距离和欧几里得距离的区别是什么呢?我们从维基百科拉过来一张图,就可以很直白的看到这二者的区别,假设在下方棋盘一样的图示中,白色方块表示为建筑物,灰色线条表示为道路,那么其中绿色线路表示为黑色两点之间的欧几里德距离(两点之间直线最短),而剩下的红蓝黄三色线路表示的均为为曼哈顿距离:欧几里德距离和曼哈顿距离切比雪夫距离Chebyshev distance得名自俄罗斯数学家切比雪夫。大家对切比雪夫应该多少是觉得有印象的,没错,切比雪夫更被我们熟悉的是中学时候学过的关于他的切比雪夫多项式吧。所谓切比雪夫距离,是将两点之间的距离定义为其各座标数值差的最大值。如果我们以二维空间中两点A(x1,y1)和B(x2,y2)二点为例,其切比雪夫距离: p = max(|x2-x1|, |y2-y1|)更形象的来介绍,切比雪夫距离在二维空间有着一个应用场景:国际象棋中「国王」的行走距离。由于王可以往斜前或斜后方向移动一格,因此可以较有效率的到达目的的格子,我们将国际象棋的棋盘映射到二维直角座标系中,格子的边长定义为1,座标的x轴及y轴和棋盘方格平行,原点恰落在某一格的中心点,则「国王」从一个位置走到其他位置需要的步数恰为这两个位置的切比雪夫距离。下图是棋盘上所有位置距f6位置的切比雪夫距离。国际象棋的国王余弦距离Cosine distance使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比于欧几里德距离,余弦距离更加注重的是两个向量在方向上的差异。首先我们来看一下数学中余弦定理的定义:余弦定理公式关于余弦定理,这儿我们简单来复习下这个初中概念。前几年曾经有过一个地方的高考题出过余弦定理的证明,当时也有人通过向量的方法来证明,两行就得出了答案(其实这儿有点疑问,因为课本中对向量内积是通过余弦定理来证明的,所以从个人来看通过向量内积来证明余弦定理是有些逻辑问题的),那么具体应该如何证明呢?其实很简单,通过一张图就可以证明:余弦定理的证明结合这张图,花2分钟应该就可以得到余弦定理的结论了,其中需要了解的一点事对于bsin(*)的定义,是直接使用了毕氏定理。数学家已经证明,余弦的这种计算方法对n维向量也成立。假定A和B是两个n维向量,A是 [A1, A2, …, An] ,B是 [B1, B2, …, Bn] ,则A与B的夹角的余弦等于:余弦定理的向量计算公式使用这个公式,我们会可以更方便的计算余弦距离。回到余弦距离上来,它与我们上面说的欧几里得距离的区别是什么呢?我们引用一张网上的图片来形象的了解下余弦距离的含义:余弦距离和欧几里得距离在上图中,欧几里德距离dist(A, B)衡量的是空间中两点的绝对距离,跟各个点所在的位置坐标是直接相关的;而余弦距离衡量的是空间向量的夹角,更加体现在方向上的差异,而不是位置。如果我们保持A点位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦距离是保持不变的(因为夹角没有发生变化),而A、B两点的欧几里德距离显然在发生改变,这就是两者之间的不同之处。关于余弦距离和欧几里得距离在现实场景中的区别,我们可以通过下面这个例子来形象的了解。现在有用户A和用户B分别对外卖骑手员工X和员工Y进行了评分。用户A对员工X的评分为2,对员工Y的评分为3,表示到坐标系中为坐标点AB(2, 3);同样用户B对员工X、Y的评分表示为坐标点B(4, 6),因此他们之间的欧几里德距离为: p = sqrt((2 - 4)^2 + (3- 6)^2) = 3.6而他们的余弦距离为: p = (2 4 + 3 6) / ( sqrt( 2^2 + 3^2 ) * sqrt( 4^2 + 6^2 ) ) = 1结合图示如下,其中,点A与点B之间的之间距离为红色线段所示,也就是上述的欧几里得距离。同时,线段0A和线段0B由于斜度相等,也就是夹角为0度,反映出的余弦距离就是cos(0) = 1,说明二者完全相似。用户评分距离图示欧几里得距离和余弦距离各自有不同的计算方式和衡量特征,因此它们适用于不同的数据分析模型:前者能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。后者则倾向于是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)。汉明距离Hamming distance在信息论中,表示为两个「等长」字符串之间对应位置的不同字符的个数。换句话说,汉明距离就是将一个字符串变换成另外一个字符串所需要「替换」的字符个数。如下图所示:0110与1110之间的汉明距离是1;0100与1001之间的汉明距离是3;汉明距离图示分词在了解了上述一系列的距离含义之后,我们已经基本了解了衡量相似度的一个判定方法,但是对于一段文本内容来说,我们对什么来计算距离呢?这就涉及到了第二个基础知识:分词。分词方法为了实现对文本相似度的比较,我们需要分析文本的内容,也就必然会涉及到对文本进行分词处理。而说到分词,其中涉及的内容不比任何一个其他知识点要少,考虑到不是本文重点讲述,此处仅仅简单的列举了下当前分词算法的几种方向,有兴趣的同学可以就此列表再去细细琢磨基于词表的分词方法正向最大匹配法(forward maximum matching method, FMM)逆向最大匹配法(backward maximum matching method, BMM)N-最短路径方法基于统计模型的分词方法基于N-gram语言模型的分词方法基于序列标注的分词方法基于HMM的分词方法基于CRF的分词方法基于词感知机的分词方法基于深度学习的端到端的分词方法工程方案从工程角度来看,目前分词已经有了十分成熟工程实现了,如IK,ansj等,列出一些比较常用的中文分词方案,以供大家学习使用:结巴分词ansj分词器中科院计算所NLPIR 哈工大的LTP清华大学THULAC斯坦福分词器 (Github)Hanlp分词器KCWS分词器文本相似度在介绍完距离和分词之后,接下来,我们就需要来关注计算文本相似度的算法了。总的来说,计算文本相似度的算法共分为4类:基于词向量基于具体字符基于概率统计基于词嵌入的结合我们上文的几种距离,其中欧几里德距离、曼哈顿距离和余弦距离等适合应用于词向量,汉明距离应属于基于字符的文本相似度的度量方法。本文接下来将重点介绍基于余弦复杂度的文本相似度比较算法,和适用于海量数据的simhash文本相似度算法,并给予一定的工程实现方案。余弦复杂度对于多个不同的文本或者短文本对话消息要来计算他们之间的相似度如何,一个好的做法就是将这些文本中词语,映射到向量空间,形成文本中文字和向量数据的映射关系,再通过计算几个或者多个不同的向量的差异的大小,来计算文本的相似度。下面介绍一个详细成熟的向量空间余弦相似度方法计算相似度算法。原理枯燥的原理不如示例来的简单明了,我们将以一个简单的示例来介绍余弦复杂度的原理。现在有下面这样的两句话,从我们直觉感官来看,说的是一模一样的内容,那么我们通过计算其余弦距离来看看其相似度究竟为多少。S1: “为什么我的眼里常含泪水,因为我对这片土地爱得深沉"S2: “我深沉的爱着这片土地,所以我的眼里常含泪水"第一步,分词:我们对上述两段话分词分词并得到下面的词向量:S1: [为什么 我 的 眼里 常含 泪水 因为 我 对 这片 土地 爱得 深沉 ,]S2: [我 深沉 的 爱 着 这片 土地 所以 我 的 眼里 常含 泪水 ,]第二步,统计所有词组:将S1和S2中出现的所有不同词组融合起来,并得到一个词向量超集,如下:[眼里 这片 为什么 我 的 常含 因为 对 所以 爱得 深沉 爱 着 , 泪水 土地]第三步,获取词频:对应上述的超级词向量,我们分别就S1的分词和S2的分词计算其出现频次,并记录:S1: [1 1 1 2 1 1 1 1 0 1 1 0 0 1 1 1]S2: [1 1 0 2 2 1 0 0 1 0 1 1 1 1 1 1]第四步,复杂度计算:通过上述的准备工作,现在我们可以想象在空间中存在着两条线段:SA和SB,二者均从原点([0, 0, …])出发,指向不同的方向,并分别终结于点A [1 1 1 2 1 1 1 1 0 1 1 0 0 1 1 1]和点B[1 1 0 2 2 1 0 0 1 0 1 1 1 1 1 1],其中点A和点B的坐标与我们上述的词频一致。到了这一步,我们可以发现,对于句子S1和S2的相似度问题,已经被我们抽象到如何计算上述两个向量的相似问题了。通过上文介绍的余弦定理,我们知道当两条线段之间形成一个夹角,如果夹角为0度,意味着方向相同、线段重合,我们就认定这是表示两个向量代表的文本完全相等;如果夹角为90度,意味着形成直角,方向完全不相似。因此,我们可以通过夹角的大小,来判断向量的相似程度。夹角越小,就代表越相似。那么对于上述给定的两个属性向量A 和B,其余弦相似性由点积和向量长度给出,其余弦相似度的计算如下所示:余弦相似度计算公式实现下面我们将通过golang来实现一个简单的余弦相似度算法。func CosineSimilar(srcWords, dstWords []string) float64 { // get all words allWordsMap := make(map[string]int, 0) for _, word := range srcWords { if _, found := allWordsMap[word]; !found { allWordsMap[word] = 1 } else { allWordsMap[word] += 1 } } for _, word := range dstWords { if _, found := allWordsMap[word]; !found { allWordsMap[word] = 1 } else { allWordsMap[word] += 1 } } // stable the sort allWordsSlice := make([]string, 0) for word, _ := range allWordsMap { allWordsSlice = append(allWordsSlice, word) } // assemble vector srcVector := make([]int, len(allWordsSlice)) dstVector := make([]int, len(allWordsSlice)) for _, word := range srcWords { if index := indexOfSclie(allWordsSlice, word); index != -1 { srcVector[index] += 1 } } for _, word := range dstWords { if index := indexOfSclie(allWordsSlice, word); index != -1 { dstVector[index] += 1 } } // calc cos numerator := float64(0) srcSq := 0 dstSq := 0 for i, srcCount := range srcVector { dstCount := dstVector[i] numerator += float64(srcCount * dstCount) srcSq += srcCount * srcCount dstSq += dstCount * dstCount } denominator := math.Sqrt(float64(srcSq * dstSq)) return numerator / denominator}结果— PASS: TestCosineSimilar (0.84s) similarity_test.go:23: CosineSimilar score: 0.7660323462854266我们看到,对于上述两句话,在经过余弦计算后,得到的相似度为0.766(其夹角大概是40度),还是比较接近于1,所以,上面的句子S1和句子S2是基本相似的。由此,我们就得到了文本相似度计算的处理流程是:找出两篇文章的关键词;每篇文章各取出若干个关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频;生成两篇文章各自的词频向量;计算两个向量的余弦相似度,值越接近于1就表示越相似;simhash基于余弦复杂度,通过两两比较文本向量来得到两个文本的相似程度是一个非常简单的算法。然而两两比较也就说明了时间复杂度是O(n2),那么在面对互联网海量信息时,考虑到一个文章的特征向量词可能特别多导致整个向量维度很高,使得计算的代价太大,就有些力不从心了。因此,为了在爬取网页时用于快速去重,Google发明了一种快速衡量两个文本集相似度的算法:simhash。简单来说,simhash中使用了一种局部敏感型的hash算法。所谓局部敏感性hash,与传统hash算法不同的是(如MD5,当原始文本越是相似,其hash数值差异越大),simhash中的hash对于越是相似的内容产生的签名越相近。原理simhash的主要思想是降维,将文本分词结果从一个高维向量映射成一个0和1组成的bit指纹(fingerprint),然后通过比较这个二进制数字串的差异进而来表示原始文本内容的差异。下面我们通过图文方式来解释下这个降维和差异计算的过程。simhash算法流程实例在simhash中处理一个文本的步骤如下:第一步,分词:对文本进行分词操作,同时需要我们同时返回当前词组在文本内容中的权重(这基本上是目前所有分词工具都支持的功能)。第二步,计算hash:对于每一个得到的词组做hash,将词语表示为到01表示的bit位,需要保证每个hash结果的位数相同,如图中所示,使用的是8bit。第三步,加权根据每个词组对应的权重,对hash值做加权计算(bit为1则取为1做乘积,bit为0则取为-1做乘积),如上图中,10011111与权重2加权得到[2 -2 -2 2 2 2 2 2];01001011与权重1加权得到[-1 1 -1 -1 1 -1 1 1];01001011与权重4加权后得到[-4 4 -4 -4 4 -4 4 4];第三步,纵向相加:将上述得到的加权向量结果,进行纵向相加实现降维,如上述所示,得到[-3 3 -7 -3 7 -3 7 7]。第四步,归一化:将最终降维向量,对于每一位大于0则取为1,否则取为0,这样就能得到最终的simhash的指纹签名[0 1 0 0 1 0 1 1]第五步,相似度比较:通过上面的步骤,我们可以利用SimHash算法为每一个网页生成一个向量指纹,在simhash中,判断2篇文本的相似性使用的是海明距离。什么是汉明距离?前文已经介绍过了。在在经验数据上,我们多认为两个文本的汉明距离<=3的话则认定是相似的。实现完整代码见Githubfunc SimHashSimilar(srcWordWeighs, dstWordWeights []WordWeight) (distance int, err error) { srcFingerPrint, err := simhashFingerPrint(srcWordWeighs) if err != nil { return } fmt.Println(“srcFingerPrint: “, srcFingerPrint) dstFingerPrint, err := simhashFingerPrint(dstWordWeights) if err != nil { return } fmt.Println(“dstFingerPrint: “, dstFingerPrint) distance = hammingDistance(srcFingerPrint, dstFingerPrint) return}func simhashFingerPrint(wordWeights []WordWeight) (fingerPrint []string, err error) { binaryWeights := make([]float64, 32) for _, ww := range wordWeights { bitHash := strHashBitCode(ww.Word) weights := calcWithWeight(bitHash, ww.Weight) //binary每个元素与weight的乘积结果数组 binaryWeights, err = sliceInnerPlus(binaryWeights, weights) //fmt.Printf(“ww.Word:%v, bitHash:%v, ww.Weight:%v, binaryWeights: %v\n”, ww.Word,bitHash, ww.Weight, binaryWeights) if err != nil { return } } fingerPrint = make([]string, 0) for _, b := range binaryWeights { if b > 0 { // bit 1 fingerPrint = append(fingerPrint, “1”) } else { // bit 0 fingerPrint = append(fingerPrint, “0”) } } return}func calcWithWeight(bitHash string, weight float64) []float64 { bitHashs := strings.Split(bitHash, “”) binarys := make([]float64, 0) for _, bit := range bitHashs { if bit == “0” { binarys = append(binarys, float64(-1)*weight) } else { binarys = append(binarys, float64(weight)) } } return binarys}结果我们使用了调换一段长本文的语序来测试simhash的效果:文本1:“沉默螺旋模式中呈现出民意动力的来源在于人类有害怕孤立的弱点,但光害怕孤立不至于影响民意的形成,” +“主要是当个人觉察到自己对某论题的意见与环境中的强势意见一致(或不一致时),害怕孤立这个变项才会产生作用。 " +“从心理学的范畴来看,社会中的强势意见越来越强,甚至比实际情形还强,弱势意见越来越弱,甚至比实际情形还弱,这种动力运作的过程成–螺旋状"文本2:“从心理学的范畴来看,害怕孤立这个变项才会产生作用。社会中的强势意见越来越强,甚至比实际情形还强,弱势意见越来越弱,” +“主要是当个人觉察到自己对某论题的意见与环境中的强势意见一致(或不一致时),甚至比实际情形还弱,这种动力运作的过程成–螺旋状 " +“但光害怕孤立不至于影响民意的形成,沉默螺旋模式中呈现出民意动力的来源在于人类有害怕孤立的弱点"通过计算,结果得到二者的指纹是一模一样,其汉明距离为0.srcFingerPrint: [1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0]dstFingerPrint: [1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0]— PASS: TestSimHashSimilar (0.85s) similarity_test.go:57: SimHashSimilar distance: 0PASS适用性注意一:我们再来看一个文章主旨类似,但是内容相关性较低的文本比较示例:文本1:“关于区块链和数字货币的关系,很多人或多或少都存在疑惑。简单来说,区块链是比特币的底层运用,而比特币只是区块链的一个小应用而已。” +“数字货币即虚拟货币,最早的数字货币诞生于2009年,其发明者中本聪为了应对经济危机对于实体货币经济的冲击。比特币是最早的数字货币,后来出现了以太币、火币以及莱特币等虚拟货币,这些虚拟货币是不能用来交易的。” +“狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构, 并以密码学方式保证的不可篡改和不可伪造的分布式账本。” +“广义来讲,区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算方式。“文本2:“区块链技术为我们的信息防伪与数据追踪提供了革新手段。区块链中的数据区块顺序相连构成了一个不可篡改的数据链条,时间戳为所有的交易行为贴上了一套不讲课伪造的真是标签,这对于人们在现实生活中打击假冒伪劣产品大有裨益; " +“市场分析指出,整体而言,区块链技术目前在十大金融领域显示出应用前景,分别是资产证券化、保险、供应链金融、场外市场、资产托管、大宗商品交易、风险信息共享机制、贸易融资、银团贷款、股权交易交割。” +“这些金融场景有三大共性:参与节点多、验真成本高、交易流程长,而区块链的分布式记账、不可篡改、内置合约等特性可以为这些金融业务中的痛点提供解决方案。” +“传统的工业互联网模式是由一个中心化的机构收集和管理所有的数据信息,容易产生因设备生命周期和安全等方面的缺陷引起的数据丢失、篡改等问题。区块链技术可以在无需任何信任单个节点的同时构建整个网络的信任共识,从而很好的解决目前工业互联网技术领域的一些缺陷,让物与物之间能够实现更好的连接。“通过计算,当我们选择前top10高频词作为衡量时,结果得到二者的指纹是如下,其汉明距离为4:srcFingerPrint: [1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 0 0 0 1 0 0 0 1]dstFingerPrint: [1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 0 0 0 1 0 1 0 1]— PASS: TestSimHashSimilar (0.84s) similarity_test.go:58: SimHashSimilar distance: 4PASS当我们选择前top50高频词作为衡量时,结果得到二者的指纹是如下,其汉明距离为9:srcFingerPrint: [1 0 1 1 0 1 0 0 0 1 1 1 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 0 1]dstFingerPrint: [1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 1 0 0 0 1]— PASS: TestSimHashSimilar (0.83s) similarity_test.go:58: SimHashSimilar distance: 9PASS所以我们发现了一个对结果判定很重要的参数:分词数量。在上面的示例中,当我们选择10个分词时,其汉明距离仅为4,几乎符合了我们对文本相似(汉明距离3)的判断。而随着topN数量的增加,引入了更多的词组,其汉明距离越来越大,这也说明了,当大文本内容出现时,选择合适的topN分词数量进行比较对结果的影响是十分大的。注意二:另外一点需要需要注意的是,simhash的优点是适用于高维度的海量数据处理,当维度降低,如短文本的相似度比较,simhash并不合适,以我们计算余弦相似度的文本为例,S1: “为什么我的眼里常含泪水,因为我对这片土地爱得深沉"S2: “我深沉的爱着这片土地,所以我的眼里常含泪水"得到的结果如下:srcFingerPrint: [1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 1 0 1 1 0 0 1 0]dstFingerPrint: [1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 0 0 1 0]— PASS: TestSimHashSimilar (0.86s) similarity_test.go:53: SimHashSimilar distance: 12PASS也就是结果的汉明距离为12,远远大于我们预定的汉明距离3,这样的结果跟我们通过预先相似度计算出来的0.76分(相比于1分)相差很远,可见simhash对于短文本的相似度比较还是存在一些偏差的。参考文献http://static.googleuserconte…https://lujiaying.github.io/p...https://www.zhihu.com/questio…此文已由腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号 ...

February 27, 2019 · 5 min · jiezi

NLP入门(七)中文预处理之繁简体转换及获取拼音

在日常的中文NLP中,经常会涉及到中文的繁简体转换以及拼音的标注等问题,本文将介绍这两个方面的实现。 首先是中文的繁简体转换,不需要使用额外的Python模块,至需要以下两个Python代码文件即可:langconv.py 地址: https://raw.githubusercontent.com/skydark/nstools/master/zhtools/langconv.pyzh_wiki.py 地址:https://raw.githubusercontent.com/skydark/nstools/master/zhtools/zh_wiki.py 示例代码如下(将代码文件与langconv.py与zh_wiki.py放在同一目录下):from langconv import *# 转换繁体到简体def cht_2_chs(line): line = Converter(‘zh-hans’).convert(line) line.encode(‘utf-8’) return lineline_cht= ‘‘‘台北市長柯文哲今在臉書開直播,先向網友報告自己3月16日至24日要出訪美國東部4城市,接著他無預警宣布,2月23日要先出訪以色列,預計停留4至5天。雖他強調台北市、以色列已在資安方面有所交流,也可到當地城市交流、參觀產業創新等內容,但柯也說「也是去看看一個小國在這麼惡劣環境,howtosurvive,他的祕訣是什麼?」這番話,也被解讀,頗有更上層樓、直指總統大位的思維。‘‘’line_cht = line_cht.replace(’\n’, ‘’)ret_chs = cht_2_chs(line_cht)print(ret_chs)# 转换简体到繁体def chs_2_cht(sentence): sentence = Converter(‘zh-hant’).convert(sentence) return sentenceline_chs = ‘忧郁的台湾乌龟’line_cht = chs_2_cht(line_chs)print(line_cht)输出的结果如下:台北市长柯文哲今在脸书开直播,先向网友报告自己3月16日至24日要出访美国东部4城市,接着他无预警宣布,2月23日要先出访以色列,预计停留4至5天。虽他强调台北市、以色列已在资安方面有所交流,也可到当地城市交流、参观产业创新等内容,但柯也说「也是去看看一个小国在这么恶劣环境,howtosurvive,他的祕诀是什么?」这番话,也被解读,颇有更上层楼、直指总统大位的思维。憂郁的臺灣烏龜 接着是获取中文汉字的拼音,这方面的Python模块有xpinyin, pypinyin等。本文以xpinyin为例,展示如何获取汉字的拼音。示例代码如下:from xpinyin import Pinyinp = Pinyin()# 默认分隔符为-print(p.get_pinyin(“上海”))# 显示声调print(p.get_pinyin(“上海”, tone_marks=‘marks’))print(p.get_pinyin(“上海”, tone_marks=‘numbers’))# 去掉分隔符print(p.get_pinyin(“上海”, ‘’))# 设为分隔符为空格print(p.get_pinyin(“上海”, ’ ‘))# 获取拼音首字母print(p.get_initial(“上”))print(p.get_initials(“上海”))print(p.get_initials(“上海”, ‘’))print(p.get_initials(“上海”, ’ ‘))输出结果如下:shang-haishàng-hǎishang4-hai3shanghaishang haiSS-HSHS H 本次分享到此结束,感谢大家阅读~注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~

February 1, 2019 · 1 min · jiezi

NLP教程:教你如何自动生成对联

桃符早易朱红纸,杨柳轻摇翡翠群 ——FlyAI Couplets体验对对联Demo: https://www.flyai.com/couplets循环神经网络最重要的特点就是可以将序列作为输入和输出,而对联的上联和下联都是典型的序列文字,那么,能否使用神经网络进行对对联呢?答案是肯定的。本项目使用网络上收集的对联数据集地址作为训练数据,运用Seq2Seq + 注意力机制网络完成了根据上联对下联的任务。项目流程数据处理Seq2Seq + Attention 模型解读模型代码实现训练神经网络数据处理创建词向量字典和词袋字典在原始数据集中,对联中每个汉字使用空格进行分割,格式如下所示: 室 内 崇 兰 映 日,林 间 修 竹 当 风 翠 岸 青 荷 , 琴 曲 潇 潇 情 辗 转,寒 山 古 月 , 风 声 瑟 瑟 意 彷 徨由于每个汉字表示一个单一的词,因此不需要对原始数据进行分词。在获取原始数据之后,需要创建两个字典,分别是字到词向量的字典和字到词袋的字典,这样做是为了将词向量输入到网络中,而输出处使用词袋进行分类。在词袋模型中,添加三个关键字 ’ “ ‘, ’ ” ’ 和 ’ ~ ’ ,分别代表输入输出的起始,结束和空白处的补零,其关键字分别为1,2,0。class Processor(Base): ## Processor是进行数据处理的类 def init(self): super(Processor, self).init() embedding_path = os.path.join(DATA_PATH, ’embedding.json’) ##加载词向量字典 words_list_path = os.path.join(DATA_PATH, ‘words.json’) ## 加载词袋列表 with open(embedding_path, encoding=‘utf-8’) as f: self.vocab = json.loads(f.read()) with open(words_list_path, encoding=‘utf-8’) as f: word_list = json.loads(f.read()) self.word2ix = {w:i for i,w in enumerate(word_list, start = 3)} self.word2ix[’“’] = 1 ##句子开头为1 self.word2ix[’”’] = 2 ##句子结尾为2 self.word2ix[’~’] = 0 ##padding的内容为0 self.ix2word = {i:w for w,i in self.word2ix.items()} self.max_sts_len = 40 ##最大序列长度对上联进行词向量编码def input_x(self, upper): ##upper为输入的上联 word_list = [] #review = upper.strip().split(’ ‘) review = [’“’] + upper.strip().split(’ ‘) + [’”’] ##开头加符号1,结束加符号2 for word in review: embedding_vector = self.vocab.get(word) if embedding_vector is not None: if len(embedding_vector) == 200: # 给出现在编码词典中的词汇编码 embedding_vector = list(map(lambda x: float(x),embedding_vector)) ## convert element type from str to float in the list word_list.append(embedding_vector) if len(word_list) >= self.max_sts_len: word_list = word_list[:self.max_sts_len] origanal_len = self.max_sts_len else: origanal_len = len(word_list) for i in range(len(word_list), self.max_sts_len): word_list.append([0 for j in range(200)]) ## 词向量维度为200 word_list.append([origanal_len for j in range(200)]) ## 最后一行元素为句子实际长度 word_list = np.stack(word_list) return word_list对真实下联进行词袋编码def input_y(self, lower): word_list = [1] ##开头加起始符号1 for word in lower: word_idx = self.word2ix.get(word) if word_idx is not None: word_list.append(word_idx) word_list.append(2) ##结束加终止符号2 origanal_len = len(word_list) if len(word_list) >= self.max_sts_len: origanal_len = self.max_sts_len word_list = word_list[:self.max_sts_len] else: origanal_len = len(word_list) for i in range(len(word_list), self.max_sts_len): word_list.append(0) ## 不够长度则补0 word_list.append(origanal_len) ##最后一个元素为句子长度 return word_listSeq2Seq + Attention 模型解读Seq2Seq 模型可以被认为是一种由编码器和解码器组成的翻译器,其结构如下图所示:编码器(Encoder)和解码器(Decoder)通常使用RNN构成,为提高效果,RNN通常使用LSTM或RNN,在上图中的RNN即是使用LSTM。Encoder将输入翻译为中间状态C,而Decoder将中间状态翻译为输出。序列中每一个时刻的输出由的隐含层状态,前一个时刻的输出值及中间状态C共同决定。Attention 机制在早先的Seq2Seq模型中,中间状态C仅由最终的隐层决定,也就是说,源输入中的每个单词对C的重要性是一样的。这种方式在一定程度上降低了输出对位置的敏感性。而Attention机制正是为了弥补这一缺陷而设计的。在Attention机制中,中间状态C具有了位置信息,即每个位置的C都不相同,第i个位置的C由下面的公式决定:公式中,Ci代表第i个位置的中间状态C,Lx代表输入序列的全部长度,hj是第j个位置的Encoder隐层输出,而aij为第i个C与第j个h之间的权重。通过这种方式,对于每个位置的源输入就产生了不同的C,也就是实现了对不同位置单词的‘注意力’。权重aij有很多的计算方式,本项目中使用使用小型神经网络进行映射的方式产生aij。模型代码实现EncoderEncoder的结构非常简单,是一个简单的RNN单元,由于本项目中输入数据是已经编码好的词向量,因此不需要使用nn.Embedding() 对input进行编码。class Encoder(nn.Module): def init(self, embedding_dim, hidden_dim, num_layers=2, dropout=0.2): super().init() self.embedding_dim = embedding_dim #词向量维度,本项目中是200维 self.hidden_dim = hidden_dim #RNN隐层维度 self.num_layers = num_layers #RNN层数 self.dropout = dropout #dropout self.rnn = nn.GRU(embedding_dim, hidden_dim, num_layers=num_layers, dropout=dropout) self.dropout = nn.Dropout(dropout) #dropout层 def forward(self, input_seqs, input_lengths, hidden=None): # src = [sent len, batch size] embedded = self.dropout(input_seqs) # embedded = [sent len, batch size, emb dim] packed = torch.nn.utils.rnn.pack_padded_sequence(embedded, input_lengths) #将输入转换成torch中的pack格式,使得RNN输入的是真实长度的句子而非padding后的 #outputs, hidden = self.rnn(packed, hidden) outputs, hidden = self.rnn(packed) outputs, output_lengths = torch.nn.utils.rnn.pad_packed_sequence(outputs) # outputs, hidden = self.rnn(embedded, hidden) # outputs = [sent len, batch size, hid dim * n directions] # hidden = [n layers, batch size, hid dim] # outputs are always from the last layer return outputs, hiddenAttentation机制Attentation权重的计算方式主要有三种,本项目中使用concatenate的方式进行注意力权重的运算。代码实现如下:class Attention(nn.Module): def init(self, hidden_dim): super(Attention, self).init() self.hidden_dim = hidden_dim self.attn = nn.Linear(self.hidden_dim * 2, hidden_dim) self.v = nn.Parameter(torch.rand(hidden_dim)) self.v.data.normal_(mean=0, std=1. / np.sqrt(self.v.size(0))) def forward(self, hidden, encoder_outputs): # encoder_outputs:(seq_len, batch_size, hidden_size) # hidden:(num_layers * num_directions, batch_size, hidden_size) max_len = encoder_outputs.size(0) h = hidden[-1].repeat(max_len, 1, 1) # (seq_len, batch_size, hidden_size) attn_energies = self.score(h, encoder_outputs) # compute attention score return F.softmax(attn_energies, dim=1) # normalize with softmax def score(self, hidden, encoder_outputs): # (seq_len, batch_size, 2*hidden_size)-> (seq_len, batch_size, hidden_size) energy = torch.tanh(self.attn(torch.cat([hidden, encoder_outputs], 2))) energy = energy.permute(1, 2, 0) # (batch_size, hidden_size, seq_len) v = self.v.repeat(encoder_outputs.size(1), 1).unsqueeze(1) # (batch_size, 1, hidden_size) energy = torch.bmm(v, energy) # (batch_size, 1, seq_len) return energy.squeeze(1) # (batch_size, seq_len)DecoderDecoder同样是一个RNN网络,它的输入有三个,分别是句子初始值,hidden tensor 和Encoder的output tensor。在本项目中句子的初始值为‘“’代表的数字1。由于初始值tensor使用的是词袋编码,需要将词袋索引也映射到词向量维度,这样才能与其他tensor合并。完整的Decoder代码如下所示:class Decoder(nn.Module): def init(self, output_dim, embedding_dim, hidden_dim, num_layers=2, dropout=0.2): super().init() self.embedding_dim = embedding_dim ##编码维度 self.hid_dim = hidden_dim ##RNN隐层单元数 self.output_dim = output_dim ##词袋大小 self.num_layers = num_layers ##RNN层数 self.dropout = dropout self.embedding = nn.Embedding(output_dim, embedding_dim) self.attention = Attention(hidden_dim) self.rnn = nn.GRU(embedding_dim + hidden_dim, hidden_dim, num_layers=num_layers, dropout=dropout) self.out = nn.Linear(embedding_dim + hidden_dim * 2, output_dim) self.dropout = nn.Dropout(dropout) def forward(self, input, hidden, encoder_outputs): # input = [bsz] # hidden = [n layers * n directions, batch size, hid dim] # encoder_outputs = [sent len, batch size, hid dim * n directions] input = input.unsqueeze(0) # input = [1, bsz] embedded = self.dropout(self.embedding(input)) # embedded = [1, bsz, emb dim] attn_weight = self.attention(hidden, encoder_outputs) # (batch_size, seq_len) context = attn_weight.unsqueeze(1).bmm(encoder_outputs.transpose(0, 1)).transpose(0, 1) # (batch_size, 1, hidden_dim * n_directions) # (1, batch_size, hidden_dim * n_directions) emb_con = torch.cat((embedded, context), dim=2) # emb_con = [1, bsz, emb dim + hid dim] , hidden = self.rnn(emb_con, hidden) # outputs = [sent len, batch size, hid dim * n directions] # hidden = [n layers * n directions, batch size, hid dim] output = torch.cat((embedded.squeeze(0), hidden[-1], context.squeeze(0)), dim=1) output = F.log_softmax(self.out(output), 1) # outputs = [sent len, batch size, vocab_size] return output, hidden, attn_weight在此之上,定义一个完整的Seq2Seq类,将Encoder和Decoder结合起来。在该类中,有一个叫做teacher_forcing_ratio的参数,作用为在训练过程中强制使得网络模型的输出在一定概率下更改为ground truth,这样在反向传播时有利于模型的收敛。该类中有两个方法,分别在训练和预测时应用。Seq2Seq类名称为Net,代码如下所示:class Net(nn.Module): def init(self, encoder, decoder, device, teacher_forcing_ratio=0.5): super().init() self.encoder = encoder.to(device) self.decoder = decoder.to(device) self.device = device self.teacher_forcing_ratio = teacher_forcing_ratio def forward(self, src_seqs, src_lengths, trg_seqs): # src_seqs = [sent len, batch size] # trg_seqs = [sent len, batch size] batch_size = src_seqs.shape[1] max_len = trg_seqs.shape[0] trg_vocab_size = self.decoder.output_dim # tensor to store decoder outputs outputs = torch.zeros(max_len, batch_size, trg_vocab_size).to(self.device) # hidden used as the initial hidden state of the decoder # encoder_outputs used to compute context encoder_outputs, hidden = self.encoder(src_seqs, src_lengths) # first input to the decoder is the <sos> tokens output = trg_seqs[0, :] for t in range(1, max_len): # skip sos output, hidden, _ = self.decoder(output, hidden, encoder_outputs) outputs[t] = output teacher_force = random.random() < self.teacher_forcing_ratio output = (trg_seqs[t] if teacher_force else output.max(1)[1]) return outputs def predict(self, src_seqs, src_lengths, max_trg_len=30, start_ix=1): max_src_len = src_seqs.shape[0] batch_size = src_seqs.shape[1] trg_vocab_size = self.decoder.output_dim outputs = torch.zeros(max_trg_len, batch_size, trg_vocab_size).to(self.device) encoder_outputs, hidden = self.encoder(src_seqs, src_lengths) output = torch.LongTensor([start_ix] * batch_size).to(self.device) attn_weights = torch.zeros((max_trg_len, batch_size, max_src_len)) for t in range(1, max_trg_len): output, hidden, attn_weight = self.decoder(output, hidden, encoder_outputs) outputs[t] = output output = output.max(1)[1] #attn_weights[t] = attn_weight return outputs, attn_weights训练神经网络训练过程包括定义损失函数,优化器,数据处理,梯队下降等过程。由于网络中tensor型状为(sentence len, batch, embedding), 而加载的数据形状为(batch, sentence len, embedding),因此有些地方需要进行转置。定义网络,辅助类等代码如下所示:# 数据获取辅助类data = Dataset()en=Encoder(200,64) ##词向量维度200,rnn隐单元64de=Decoder(9133,200,64) ##词袋大小9133,词向量维度200,rnn隐单元64network = Net(en,de,device) ##定义Seq2Seq实例loss_fn = nn.CrossEntropyLoss() ##使用交叉熵损失函数optimizer = Adam(network.parameters()) ##使用Adam优化器model = Model(data)训练过程如下所示:lowest_loss = 10# 得到训练和测试的数据for epoch in range(args.EPOCHS): network.train() # 得到训练和测试的数据 x_train, y_train, x_test, y_test = data.next_batch(args.BATCH) # 读取数据; shape:(sen_len,batch,embedding) #x_train shape: (batch,sen_len,embed_dim) #y_train shape: (batch,sen_len) batch_len = y_train.shape[0] #input_lengths = [30 for i in range(batch_len)] ## batch内每个句子的长度 input_lengths = x_train[:,-1,0] input_lengths = input_lengths.tolist() #input_lengths = list(map(lambda x: int(x),input_lengths)) input_lengths = [int(x) for x in input_lengths] y_lengths = y_train[:,-1] y_lengths = y_lengths.tolist() x_train = x_train[:,:-1,:] ## 除去长度信息 x_train = torch.from_numpy(x_train) #shape:(batch,sen_len,embedding) x_train = x_train.float().to(device) y_train = y_train[:,:-1] ## 除去长度信息 y_train = torch.from_numpy(y_train) #shape:(batch,sen_len) y_train = torch.LongTensor(y_train) y_train = y_train.to(device) seq_pairs = sorted(zip(x_train.contiguous(), y_train.contiguous(),input_lengths), key=lambda x: x[2], reverse=True) #input_lengths = sorted(input_lengths, key=lambda x: input_lengths, reverse=True) x_train, y_train,input_lengths = zip(*seq_pairs) x_train = torch.stack(x_train,dim=0).permute(1,0,2).contiguous() y_train = torch.stack(y_train,dim=0).permute(1,0).contiguous() outputs = network(x_train,input_lengths,y_train) #, prediction = torch.max(outputs.data, 2) optimizer.zero_grad() outputs = outputs.float() # calculate the loss according to labels loss = loss_fn(outputs.view(-1, outputs.shape[2]), y_train.view(-1)) # backward transmit loss loss.backward() # adjust parameters using Adam optimizer.step() print(loss) # 若测试准确率高于当前最高准确率,则保存模型 if loss < lowest_loss: lowest_loss = loss model.save_model(network, MODEL_PATH, overwrite=True) print(“step %d, best lowest_loss %g” % (epoch, lowest_loss)) print(str(epoch) + “/” + str(args.EPOCHS))小结通过使用Seq2Seq + Attention模型,我们完成了使用神经网络对对联的任务。经过十余个周期的训练后,神经网络将会对出与上联字数相同的下联,但是,若要对出工整的对联,还需训练更多的周期,读者也可以尝试其他的方法来提高对仗的工整性。体验对对联Demo: https://www.flyai.com/couplets获取更多项目样例开源代码 请PC端访问:www.flyai.com ...

January 31, 2019 · 6 min · jiezi

NLP入门(六)pyltp的介绍与使用

pyltp的简介 语言技术平台(LTP)经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广, 是国内外最具影响力的中文处理基础平台。它提供的功能包括中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等。 pyltp 是 LTP 的 Python 封装,同时支持Python2和Python3版本。Python3的安装方法为:pip3 install pyltp官网下载网址:https://pypi.org/project/pylt…官方使用说明文档:https://pyltp.readthedocs.io/… 在使用该模块前,需要下载完整的模型文件,文件下载地址为:https://pan.baidu.com/share/l… 。pyltp 的所有输入的分析文本和输出的结果的编码均为 UTF-8。模型的数据文件如下:其中,cws.model用于分词模型,lexicon.txt为分词时添加的用户字典,ner.model为命名实体识别模型,parser.model为依存句法分析模型,pisrl.model为语义角色标注模型,pos为词性标注模型。pyltp的使用 pyltp的使用示例项目结构如下:分句 分句指的是将一段话或一片文章中的文字按句子分开,按句子形成独立的单元。示例的Python代码sentenct_split.py如下:# -- coding: utf-8 --from pyltp import SentenceSplitter# 分句doc = ‘据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。’ \ ‘盖茨原计划从明年1月9日至14日陆续访问中国和日本,目前,他决定在行程中增加对韩国的访问。莫莱尔表示,’ \ ‘盖茨在访韩期间将会晤韩国国防部长官金宽镇,就朝鲜近日的行动交换意见,同时商讨加强韩美两军同盟关系等问题,’ \ ‘拟定共同应对朝鲜挑衅和核计划的方案。‘sents = SentenceSplitter.split(doc) # 分句for sent in sents: print(sent)输出结果如下:据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。盖茨原计划从明年1月9日至14日陆续访问中国和日本,目前,他决定在行程中增加对韩国的访问。莫莱尔表示,盖茨在访韩期间将会晤韩国国防部长官金宽镇,就朝鲜近日的行动交换意见,同时商讨加强韩美两军同盟关系等问题,拟定共同应对朝鲜挑衅和核计划的方案。分词 分词指的是将一句话按词语分开,按词语形成独立的单元。示例的Python代码words_split.py如下:# -- coding: utf-8 --import osfrom pyltp import Segmentorcws_model_path = os.path.join(os.path.dirname(file), ‘data/cws.model’) # 分词模型路径,模型名称为cws.modellexicon_path = os.path.join(os.path.dirname(file), ‘data/lexicon.txt’) # 参数lexicon是自定义词典的文件路径segmentor = Segmentor()segmentor.load_with_lexicon(cws_model_path, lexicon_path)sent = ‘据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。‘words = segmentor.segment(sent) # 分词print(’/’.join(words))segmentor.release()输出的结果如下:据/韩联社/12月/28日/反映/,/美/国防部/发言人/杰夫·莫莱尔/27日/表示/,/美/国防部长/盖茨/将/于/2011年/1月/14日/访问/韩国/。词性标注 词性标注指的是一句话分完词后,制定每个词语的词性。示例的Python代码postagger.py如下:# -- coding: utf-8 --import osfrom pyltp import Segmentor, Postagger# 分词cws_model_path = os.path.join(os.path.dirname(file), ‘data/cws.model’) # 分词模型路径,模型名称为cws.modellexicon_path = os.path.join(os.path.dirname(file), ‘data/lexicon.txt’) # 参数lexicon是自定义词典的文件路径segmentor = Segmentor()segmentor.load_with_lexicon(cws_model_path, lexicon_path)sent = ‘据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。‘words = segmentor.segment(sent) # 分词# 词性标注pos_model_path = os.path.join(os.path.dirname(file), ‘data/pos.model’) # 词性标注模型路径,模型名称为pos.modelpostagger = Postagger() # 初始化实例postagger.load(pos_model_path) # 加载模型postags = postagger.postag(words) # 词性标注for word, postag in zip(words, postags): print(word, postag)# 释放模型segmentor.release()postagger.release()‘‘‘词性标注结果说明https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id3’‘‘输出结果如下:据 p韩联社 ni12月 nt28日 nt反映 v, wp美 j国防部 n发言人 n杰夫·莫莱尔 nh27日 nt表示 v, wp美 j国防部长 n盖茨 nh将 d于 p2011年 nt1月 nt14日 nt访问 v韩国 ns。 wp词性标注结果可参考网址:https://ltp.readthedocs.io/zh… 。命名实体识别 命名实体识别(NER)指的是识别出一句话或一段话或一片文章中的命名实体,比如人名,地名,组织机构名。示例的Python代码ner.py如下:# -- coding: utf-8 --import osfrom pyltp import Segmentor, Postagger# 分词cws_model_path = os.path.join(os.path.dirname(file), ‘data/cws.model’) # 分词模型路径,模型名称为cws.modellexicon_path = os.path.join(os.path.dirname(file), ‘data/lexicon.txt’) # 参数lexicon是自定义词典的文件路径segmentor = Segmentor()segmentor.load_with_lexicon(cws_model_path, lexicon_path)sent = ‘据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。‘words = segmentor.segment(sent) # 分词# 词性标注pos_model_path = os.path.join(os.path.dirname(file), ‘data/pos.model’) # 词性标注模型路径,模型名称为pos.modelpostagger = Postagger() # 初始化实例postagger.load(pos_model_path) # 加载模型postags = postagger.postag(words) # 词性标注ner_model_path = os.path.join(os.path.dirname(file), ‘data/ner.model’) # 命名实体识别模型路径,模型名称为pos.modelfrom pyltp import NamedEntityRecognizerrecognizer = NamedEntityRecognizer() # 初始化实例recognizer.load(ner_model_path) # 加载模型# netags = recognizer.recognize(words, postags) # 命名实体识别# 提取识别结果中的人名,地名,组织机构名persons, places, orgs = set(), set(), set()netags = list(recognizer.recognize(words, postags)) # 命名实体识别print(netags)# print(netags)i = 0for tag, word in zip(netags, words): j = i # 人名 if ‘Nh’ in tag: if str(tag).startswith(‘S’): persons.add(word) elif str(tag).startswith(‘B’): union_person = word while netags[j] != ‘E-Nh’: j += 1 if j < len(words): union_person += words[j] persons.add(union_person) # 地名 if ‘Ns’ in tag: if str(tag).startswith(‘S’): places.add(word) elif str(tag).startswith(‘B’): union_place = word while netags[j] != ‘E-Ns’: j += 1 if j < len(words): union_place += words[j] places.add(union_place) # 机构名 if ‘Ni’ in tag: if str(tag).startswith(‘S’): orgs.add(word) elif str(tag).startswith(‘B’): union_org = word while netags[j] != ‘E-Ni’: j += 1 if j < len(words): union_org += words[j] orgs.add(union_org) i += 1print(‘人名:’, ‘,’.join(persons))print(‘地名:’, ‘,’.join(places))print(‘组织机构:’, ‘,’.join(orgs))# 释放模型segmentor.release()postagger.release()recognizer.release()输出的结果如下:[‘O’, ‘S-Ni’, ‘O’, ‘O’, ‘O’, ‘O’, ‘B-Ni’, ‘E-Ni’, ‘O’, ‘S-Nh’, ‘O’, ‘O’, ‘O’, ‘S-Ns’, ‘O’, ‘S-Nh’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘O’, ‘S-Ns’, ‘O’]人名: 杰夫·莫莱尔,盖茨地名: 美,韩国组织机构: 韩联社,美国防部命名实体识别结果可参考网址:https://ltp.readthedocs.io/zh… 。依存句法分析 依存语法 (Dependency Parsing, DP) 通过分析语言单位内成分之间的依存关系揭示其句法结构。 直观来讲,依存句法分析识别句子中的“主谓宾”、“定状补”这些语法成分,并分析各成分之间的关系。示例的Python代码parser.py代码如下:# -- coding: utf-8 --import osfrom pyltp import Segmentor, Postagger, Parser# 分词cws_model_path = os.path.join(os.path.dirname(file), ‘data/cws.model’) # 分词模型路径,模型名称为cws.modellexicon_path = os.path.join(os.path.dirname(file), ‘data/lexicon.txt’) # 参数lexicon是自定义词典的文件路径segmentor = Segmentor()segmentor.load_with_lexicon(cws_model_path, lexicon_path)sent = ‘据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。‘words = segmentor.segment(sent) # 分词# 词性标注pos_model_path = os.path.join(os.path.dirname(file), ‘data/pos.model’) # 词性标注模型路径,模型名称为pos.modelpostagger = Postagger() # 初始化实例postagger.load(pos_model_path) # 加载模型postags = postagger.postag(words) # 词性标注# 依存句法分析par_model_path = os.path.join(os.path.dirname(file), ‘data/parser.model’) # 模型路径,模型名称为parser.modelparser = Parser() # 初始化实例parser.load(par_model_path) # 加载模型arcs = parser.parse(words, postags) # 句法分析rely_id = [arc.head for arc in arcs] # 提取依存父节点idrelation = [arc.relation for arc in arcs] # 提取依存关系heads = [‘Root’ if id == 0 else words[id-1] for id in rely_id] # 匹配依存父节点词语for i in range(len(words)): print(relation[i] + ‘(’ + words[i] + ‘, ’ + heads[i] + ‘)’)# 释放模型segmentor.release()postagger.release()parser.release()输出结果如下:ADV(据, 表示)SBV(韩联社, 反映)ATT(12月, 28日)ADV(28日, 反映)POB(反映, 据)WP(,, 据)ATT(美, 国防部)ATT(国防部, 发言人)ATT(发言人, 杰夫·莫莱尔)SBV(杰夫·莫莱尔, 表示)ADV(27日, 表示)HED(表示, Root)WP(,, 表示)ATT(美, 国防部长)ATT(国防部长, 盖茨)SBV(盖茨, 访问)ADV(将, 访问)ADV(于, 访问)ATT(2011年, 14日)ATT(1月, 14日)POB(14日, 于)VOB(访问, 表示)VOB(韩国, 访问)WP(。, 表示)依存句法分析结果可参考网址:https://ltp.readthedocs.io/zh… 。语义角色标注 语义角色标注是实现浅层语义分析的一种方式。在一个句子中,谓词是对主语的陈述或说明,指出“做什么”、“是什么”或“怎么样,代表了一个事件的核心,跟谓词搭配的名词称为论元。语义角色是指论元在动词所指事件中担任的角色。主要有:施事者(Agent)、受事者(Patient)、客体(Theme)、经验者(Experiencer)、受益者(Beneficiary)、工具(Instrument)、处所(Location)、目标(Goal)和来源(Source)等。示例的Python代码rolelabel.py如下:# -- coding: utf-8 --import osfrom pyltp import Segmentor, Postagger, Parser, SementicRoleLabeller# 分词cws_model_path = os.path.join(os.path.dirname(file), ‘data/cws.model’) # 分词模型路径,模型名称为cws.modellexicon_path = os.path.join(os.path.dirname(file), ‘data/lexicon.txt’) # 参数lexicon是自定义词典的文件路径segmentor = Segmentor()segmentor.load_with_lexicon(cws_model_path, lexicon_path)sent = ‘据韩联社12月28日反映,美国防部发言人杰夫·莫莱尔27日表示,美国防部长盖茨将于2011年1月14日访问韩国。‘words = segmentor.segment(sent) # 分词# 词性标注pos_model_path = os.path.join(os.path.dirname(file), ‘data/pos.model’) # 词性标注模型路径,模型名称为pos.modelpostagger = Postagger() # 初始化实例postagger.load(pos_model_path) # 加载模型postags = postagger.postag(words) # 词性标注# 依存句法分析par_model_path = os.path.join(os.path.dirname(file), ‘data/parser.model’) # 模型路径,模型名称为parser.modelparser = Parser() # 初始化实例parser.load(par_model_path) # 加载模型arcs = parser.parse(words, postags) # 句法分析# 语义角色标注srl_model_path = os.path.join(os.path.dirname(file), ‘data/pisrl.model’) # 语义角色标注模型目录路径labeller = SementicRoleLabeller() # 初始化实例labeller.load(srl_model_path) # 加载模型roles = labeller.label(words, postags, arcs) # 语义角色标注# 打印结果for role in roles: print(words[role.index], end=’ ‘) print(role.index, “".join(["%s:(%d,%d)” % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))# 释放模型segmentor.release()postagger.release()parser.release()labeller.release()输出结果如下:反映 4 A0:(1,1)A0:(2,3)表示 11 MNR:(0,5)A0:(6,9)TMP:(10,10)A1:(13,22)访问 21 A0:(13,15)ADV:(16,16)TMP:(17,20)A1:(22,22)总结 本文介绍了中文NLP的一个杰出工具pyltp,并给出了该模块的各个功能的一个示例,希望能给读者一些思考与启示。本文到此结束,感谢大家阅读~注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~ ...

January 31, 2019 · 3 min · jiezi

可应用于实际的14个NLP突破性研究成果(二)

摘要: 最好的论文是可以直接走出实验室!NLP年度最佳应用论文大集锦!可应用于实际的14个NLP突破性研究成果(一)4.What you can cram into a single vector: Probing sentence embeddings for linguistic properties,作者:ALEXIS CONNEAU,KRUSZEWSKI,GUILLAUME LAMPLE,LOÏCBARRAULT,MARCO BARONI论文摘要尽管最近在训练高质量的句子嵌入上做出了很多的努力,但是大家仍然对它们所捕捉的内容缺乏了解。基于句子分类的‘Downstream’tasks通常用于评估句子表示的质量。然而任务的复杂性使得它很难推断出句子表示中出现了什么样的信息。在本文将介绍10个probing tasks,旨在捕捉句子的简单语言特征,并用它们来研究由三种不同编码器产生的句子嵌入,这些编码器以八种不同的方式进行训练,揭示了编码器和训练方法的有趣特性。总结Facebook AI研究团队试图更好地理解句子嵌入所捕获的内容。因为任务的复杂性不允许我们直接获得理解。因此,论文介绍了10个旨在捕捉句子简单语言特征的探究任务。通过这些探测任务获得的结果可以揭示编码器和训练方法的一些有趣特性。论文的核心思想是什么?我们有许多句子嵌入方法,表现出非常好的表现,但我们仍然缺乏对它们如何捕获的内容的理解。研究人员通过引入10个探测任务来研究由3种不同编码器(BiLSTM-last,BiLSTM-max和Gated ConvNet)生成的嵌入来解决这个问题,这些编码器以8种不同的方式进行训练。探测任务测试句子嵌入保留的程度:1. 表面信息(句子中的单词数、单词内容);2. 句法信息(词序、句子的层次结构、最高成分的顺序);3. 语义信息(主句动词的时态、主语和宾语的数量、随机替换的单词)。什么是关键成就?对现代句子编码器进行广泛的评估。揭示编码器和训练方法的一些有趣属性:1. 由于自然语言输入的冗余,Bag-of-Vectors所擅长得捕获句子级属性令人惊讶。2. 相似性能的不同编码器架构可导致不同的嵌入。3. 卷积架构的整体探测任务性能与最佳LSTM架构的性能相当。4. BiLSTM-max在探测任务中优于BiLSTM。此外,即使没有经过任何训练,它也能实现非常好的性能。未来的研究领域是什么?将探测任务扩展到其他语言和语言域。调查多任务训练如何影响探测任务的性能。通过引入的探测任务,找到更多具有语言意识的通用编码器。什么是可能的商业应用?1、更好地理解不同预训练编码器捕获的信息将有助于研究人员构建更多具有语言意识的编码器。反过来,这将改善将会被应用在NLP系统中。你在哪里可以得到实现代码?1、GitHub上提供了本研究论文中描述的探测任务。5.SWAG:一个用于给定信息的常识推理的大规模对抗性数据集,作者:ROWAN ZELLERS,YONATAN BISK,ROY SCHWARTZ,YEJIN CHOI论文摘要人类可以因为一些描述从而推断出下面要发生什么,例如“她打开汽车的引擎盖”,“然后,她检查了发动机”。在本文中,我们介绍并整理了基础常识推理。我们提出SWAG,一个新的数据集,包含113k多项选择问题,涉及丰富的基础推理。为了解决许多现有数据集中发现的注释工件和人类偏见的反复出现的挑战,我们提出了一种新颖的过程,它通过迭代训练一组风格分类器构建一个去偏见的数据集,并使用它们来过滤数据。为了解释对抗性过滤,我们使用最先进的语言模型来大量过滤一组不同的潜在反事实。实证结果表明,虽然人类可以高精度地解决由此产生的推理问题(88%),但各种竞争模型仍在努力完成我们的任务。总结当你读到“他将生鸡蛋面糊倒入锅中时,他…”你可能会这样选择“提起锅并移动它来搅拌。”我们可以发现,答案并不明显,这需要常识推理。SWAG是支持研究自然语言推理(NLI)与常识推理大规模数据集。它是使用一种新颖的方法——对抗性过滤创建的,它可以以最经济有效的方式构建未来的大规模数据集。论文的核心思想是什么?SWAG包含113K多项选择题,大多是视频字幕:1、上下文的句子来自于视频字幕。2、正确的答案是实际视频中的下一个字幕。3、使用对抗过滤(AF)生成错误的答案。Adversarial Filtering背后的想法:1、大量生成错误答案,然后选择哪些看起来像真正答案的回答。2、过滤模型确定哪些回答似乎是机器生成的。这些回答被删除并替换为模型认为是人为编写的新回答。最后,整个数据集由众包工作者验证。什么关键成就?提出一个新的具有挑战性的大规模数据集来测试NLI系统。引入Adversarial Filtering,这种方法可用于经济高效地构建大型数据集,具有以下几个优点:1、句子的多样性不受人类创造力的限制;2、数据集创建者可以在数据集构建期间任意提高难度;3、人类不会写回答但只会验证它们,这样更经济;AI社区的想法是什么?该论文在2018年一个自然语言处理领域领先的会议上被发表。即使在此重要的NLP会议上发布之前,该数据集也是通过Google的新BERT模型解决的,该模型的准确度达到了86.2%并且非常接近人类的准确度(88%)。未来的研究领域是什么?使用更好的Adversarial Filtering和语言模型创建更具对抗性的SWAG版本。什么是可能的商业应用?该数据集可以帮助构建具有常识推理的NLI系统,从而改善Q&A系统和会话AI的开发。你在哪里可以获得实现代码?1、SWAG数据集可在GitHub上获得。6.(ELMO词向量模型)作者:MATTHEW E. PETERS,MARK NEUMANN,MOHIT IYYER,MATT GARDNER,CHRISTOPHER CLARK,KENTON LEE,LUKE ZETTLEMOYER论文摘要本文推出了一种新的基于深度学习框架的词向量表征模型,这种模型不仅能够表征词汇的语法和语义层面的特征,也能够随着上下文语境的变换而改变。简单来说,本文的模型其实本质上就是基于大规模语料训练后的双向语言模型内部隐状态特征的组合。实验证明,新的词向量模型能够很轻松的与NLP的现有主流模型相结合,并且在六大NLP任务的结果上有着巨头的提升。同时,作者也发现对模型的预训练是十分关键的,能够让下游模型去融合不同类型的半监督训练出的特征。总结艾伦人工智能研究所的团队引入了一种新型的深层语境化词汇表示:语言模型嵌入(ELMo)。在ELMO增强模型中,每个单词都是根据使用它的整个上下文进行矢量化的。将ELMo添加到现有NLP系统可以实现:1:相对误差减少范围从6-20%;2:显著降低训练模型所需的时期数量;3:显著减少达到基线性能所需的训练数据量。论文的核心思想是什么?生成词嵌入作为深度双向语言模型(biLM)的内部状态的加权和,在大文本语料库上预训练。包括来自biLM的所有层的表示,因为不同的层表示不同类型的信息。基于角色的ELMo表示,以便网络可以使用形态线索来“理解”在训练中看不到的词汇外令牌。取得了什么关键成就?将ELMo添加到模型中会创造新的记录,在诸如问答、文本蕴涵、语义角色标记、共指解析、命名实体提取、情绪分析等NLP任务中相对误差降低6-20%。使用ELMo增强模型可显著着降低达到最优性能所需的训练次数。因此,具有ELMo的语义角色标签(SRL)模型仅需要10个时期就可以超过在486个训练时期之后达到的基线最大值。将ELMo引入模型还可以显著减少实现相同性能水平所需的训练数据量。例如,对于SRL任务,ELMo增强模型仅需要训练集的1%即可获得与具有10%训练数据的基线模型相同的性能。AI社区对其的评价?该论文被NAACL评为优秀论文,NAACL是世界上最具影响力的NLP会议之一。本文介绍的ELMo方法被认为是2018年最大的突破之一,也是NLP未来几年的主要趋势。未来的研究领域是什么?1、通过将ELMos与不依赖于上下文的词嵌入连接起来,将此方法合并到特定任务中。可能的商业应用的范围是什么?ELMo显著提高了现有NLP系统的性能,从而增强了:1. 聊天机器人将更好地理解人类和回答问题;2. 对客户的正面和负面评论进行分类;3. 查找相关信息和文件等;你在哪里可以得到实现代码?艾伦研究所提供英语和葡萄牙语预训练的ELMo模型,你还可以使用TensorFlow代码重新训练模型。7.用于低资源神经机器翻译的元学习,作者:JIATAO GU,WANG WANG,YUN YUN,KYUNGHYUN CHO,VICTOR OK LI论文摘要在本文中,我们建议扩展最近引入的模型:不可知元学习算法(MAML),用于低资源神经机器翻译(NMT)。我们将低资源翻译构建为元学习问题,并且我们学习基于多语言高资源语言任务来适应低资源语言。我们使用通用词汇表示来克服不同语言的输入输出不匹配的问题。我们使用十八种欧洲语言(Bg,Cs,Da,De,El,Es,Et,Fr,Hu,It,Lt,Nl,Pl,Pt,Sk,Sl,Sv和Ru)评估所提出的元学习策略,源任务和五种不同的语言(Ro,Lv,Fi,Tr和Ko)作为目标任务。我们证实了,所提出的方法明显优于基于多语言迁移学习的方法,这能够使我们只用一小部分训练样例来训练有竞争力的NMT系统。例如,通过通过16000个翻译单词(约600个并行句子),用所提出的方法在罗马尼亚语-英语WMT'16上实现高达22.04 BLEU。总结香港大学和纽约大学的研究人员使用模型无关的元学习算法(MAML)来解决低资源机器翻译的问题。特别是,他们建议使用许多高资源语言对来查找模型的初始参数,然后,这种初始化允许仅使用几个学习步骤在低资源语言对上训练新的语言模型。论文的核心思想是什么?介绍了一种新的元学习方法MetaNMT,该方法假设使用许多高资源语言对来找到良好的初始参数,然后从找到的初始参数开始在低资源语言上训练新的翻译模型。只有在所有源和目标任务之间共享输入和输出空间时,元学习才能应用于低资源机器翻译。然而,由于不同的语言具有不同的词汇。为了解决这个问题,研究人员使用键值存储网络动态地构建了针对每种语言的词汇表。关键成就是什么?为极低资源语言找到了神经机器翻译的新方法,其中:1、能够在高资源和极低资源语言对之间共享信息;2、仅使用几千个句子来微调低资源语言对上的新翻译模型;实验证明:1、元学习始终比多语言迁移学习好;2、元学习验证集语言对的选择会影响结果模型的性能。例如,当使用罗马尼亚语-英语进行验证时,芬兰语-英语受益更多,而土耳其语-英语则更喜欢拉脱维亚语-英语的验证。AI社区对它的看法?该论文在自然语言处理领域领先的会议EMNLP上被发表。所提出的方法获得了Facebook的低资源神经机器翻译奖。未来的研究领域是什么?半监督神经机器翻译的元学习或单语语料库的学习。当学习多个元模型且新语言可以自由选择适应的模型时,进行多模态元学习。什么是可能的商业应用?MetaNMT可用于改善可用并行语料库非常小的语言对的机器翻译结果。你在哪里可以得到实现代码?1、MetaNMT的PyTorch实施可以在Github上找到。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 30, 2019 · 1 min · jiezi

敏捷AI|NLP技术在宜信业务中的实践「构建用户画像篇」

导读:前面两篇我们介绍了NLP技术在宜信应用的背景《敏捷AI | NLP技术在宜信业务中的实践【背景篇】》,以及应用场景之一《敏捷AI | NLP技术在宜信业务中的实践【智能聊天机器人篇】》。本篇为另一个场景,也就是在业务中如何构建客户画像,敬请收看~作者简介井玉欣:毕业于北京大学信息科学技术学院,获博士学位,研究方向包括计算机软件与理论、逻辑推理等,目前就职于宜信技术研发中心,从事人工智能、机器学习、自然语言处理以及知识工程等方面的研究。高级场景之构建客户画像在许多企业中,每天业务人员和客户的沟通都会产生大量记录,这些记录可能包括了客服的沟通数据(通话记录、通话小结),也可能包括了各式各样的报告数据(陪访报告、征信报告等)(见图1)。图1 业务人员与客户产生沟通记录前者可能口语会多一些,后者则主要是书面用语。但两者之间有一个共同的特点,就是其中都蕴含着丰富的客户信息。想要把这些信息提取出来,我们就需要利用到(NLP)技术。图2为一段客户陪访报告的节选,观察其文本特征,发现有许多业务所关注的信息,比如职业方面,客户是“大学教授”;在可投资产方面,理财金额有“100万”,投资类型是“银行理财”,对公司的态度是“不了解”等。图2 客户陪访报告示例所以我们完全可以通过NLP分析文本,对其中的客户特征进行标签化提取,最终利用得到的标签构建出客户画像。这样做的好处很多,比如方便我们的业务人员随时发现关键问题,便于跟进;自动化处理,提高工作效率。根据挖掘出的信息构建出客户标签画像之后,就可以方便地盘点特定时间范围内的需求特点,为新产品设置提供系数参考,或者补充、验证结构化字段内容。总体的实施路线如图3所示,先通过业务分析来定义业务关注的标签库,然后针对定义出来的标签训练相应的提取模型,最后利用模型对数据进行分析,得到一系列客户标签,再对其进行汇总,最终形成客户画像。图3 总体实施路线总体的路线是这样的,但具体的实施过程中我们也有一些细节需要关注。通过对之前的数据进行分析,我们发现了一些特征,比如文本之中信息高度集中,信息表述通常以短句为单位,但是单一短句语义存在模糊性,还需要结合一定的上下文对其进行分析。所以我们需要对复杂句进行适当的切割,确定合适的数据粒度,同时配合一个适当大小的短句滑动窗口来捕获相关的上下文语义。此外对于内部的业务文本来说,其内容涉及大量产品的专有实体名称和术语,以及较多的数字。针对这种情况,我们建立了专门的词库和实体库,对相应的实体名称和术语进行准确的切割和识别。对于数字的处理,我们先后比较字向量、标识符替换、规则识别+后处理等等技术方案,并且选择了其中效果最好的方法。当然我们也面临着普遍存在的标注语料不足的问题,因此在这个项目中,我们侧重于研究怎么在小样本条件下进行Few-shot learning。实际中,在大多数专业领域AI项目实施过程中,都存在着标注数据不足的情况,所以针对小样本进行学习的Few-shot learning也越来越凸显其重要性。Few-shot learning包括很多种技术,有常见的迁移学习+fine-tuning技术,典型的如Bert;也有基于半监督训练的一些技术,如基于相似性度量的一些神经网络模型,基于最近邻算法的样本标注扩散这些技术等;还有meta learning的相关技术,例如OpenAI在ICLR 2018上的best paper;甚至还有一些图网络的相关技术。在以上种种技术当中,比较适合工程化的、比较容易实施的还是基于迁移学习的方法。在我们的项目中,发现迁移学习,也就是基于预训练模型,迁移到目标训练任务上,再加上半监督学习的标注辅助,可以比较好的满足我们的需求。下面介绍一下我们的算法流程:先对复杂句进行清洗与切割;之后可以选择性的加入一些过滤规则,快速地去除那些比较明显的噪音数据;然后将数据流入到标签提取模型之中,得到具体的标签;最后在画像构建阶段对得到的所有标签进行去重、消歧,形成最终的客户画像。具体到算法模型,我们也先后比较许多方法,本质上我们认为标签识别模型是一个短文本分类算法,我们尝试了基于统计的方法(SVM, Random Forest, XgBoost),也尝试了基于神经网络的模型(FastText,Text CNN/RNN/RCNN, HAN),最终我们选择了HAN模型,也就是层次注意网络(Hierarchical Attention Network)模型,通过在词一级和句一级分别进行RNN和Attention计算,最终得到一个合理的文本向量表征,用于最后的分类,整个过程如图4所示。图4 HAN模型架构图5是本实例的总体处理流程,经过数据预处理之后,文本被并行地分配到各个业务关注标签提取模型之中,输出各个业务标签,最终汇总到客户画像构建模块,在此进行去重、消解歧义和矛盾,最后得到客户的画像。图5 实例处理总体流程另外我们结合公司的敏捷实时数据平台设计了一个相应的实时AI解决方案,如图6所示,这里用到了我们团队开源的一些技术,包括DBus(数据总线平台),Wormhole(流式处理平台),Moonbox(计算服务平台)以及Davinci(可视应用平台),这四个平台构成了敏捷大数据平台栈。在这个方案里,我们通过DBus来采集各类数据存储中的自然语言数据,经过一些可选的技术(如ASR等)得到相应的文本;再通过Wormhole来进行实时的流式处理,标签模型在Wormhole的实时数据流上运行,对数据流中的文本自动提取相应的标签,再由Wormhole输出到指定的数据存储中;之后由Moonbox对标签进行后续的汇总处理,先从存储介质之上把之前计算得到的标签提取出来,使用画像模型对画像进行构建,输出到如Redis之类的存储介质之中,最后推送给业务系统供其使用。这就是我们实现的一个实时用户画像处理流程。图6此外,在图6下方的数据流分支里,我们通过在Wormhole上流转的生产数据流进行一个选择性抽样,之后同样利用标签模型和画像模型,计算出客户画像,此后将原始数据、标签数据和客户画像通过Davinci展示给我们的模型维护人员,用于评估检查模型的运行情况,这样就实现了一个实时的模型效果监控系统。综合这两者,我们就得到了一个实时的、基于文本分析的画像构建系统。总结随着各企业实体对自然语言数据愈发关注,NLP+AI技术在各领域都成了非常重要、核心的基础技术服务。领域知识与NLP技术的结合带来了新的技术产品,创造出了新的商业价值,比如我们目前常用的一些产品:Siri、小爱同学等等,这种Conversational UI带来的不仅是一种全新的交互模式,更是开辟了一个新的产品领域。在数据方面,虽然自然语言的数据存量很大,但目前来看无论是通用领域还是专业领域,经过加工整理的高质量自然语言语料数据资源还是比较缺乏,因此其具有非常高的价值。领域语料的积累可以极大提升AI产品的效果,在一定程度上帮助企业形成新的数据壁垒、技术壁垒。在NLP的算法方面,就未来一段时间来看,如前文所述,面对小语料任务的Few-shot Learning会越来越受关注,尤其是以Bert为代表的迁移学习技术,将给现在的一些NLP任务带来一场革命。此外还有针对NLP语料的数据增强技术,我们知道在图像领域数据增强技术已经比较成熟,是一种常见的数据处理方式,但是在NLP领域数据增强技术的发展还不够成熟,如果能在这方面有所突破的话,相信会对各类NLP任务都有很大帮助。NLP技术的发展还需要业界各企业、各位算法与工程专家的共同努力,相信未来我们能够更准确、更快速、更方便地理解各领域的自然语言数据。-作者:井玉欣 宜信技术学院

January 29, 2019 · 1 min · jiezi

可应用于实际的14个NLP突破性研究成果(一)

摘要: 最好的论文是可以直接走出实验室!NLP年度最佳应用论文大集锦!语言理解对计算机来说是一个巨大的挑战。幼儿可以理解的微妙的细微差别仍然会使最强大的机器混淆。尽管深度学习等技术可以检测和复制复杂的语言模式,但机器学习模型仍然缺乏对我们的语言真正含义的基本概念性理解。但在2018年确实产生了许多具有里程碑意义的研究突破,这些突破推动了自然语言处理、理解和生成领域的发展。我们总结了14篇研究论文,涵盖了自然语言处理(NLP)的若干进展,包括高性能的迁移学习技术,更复杂的语言模型以及更新的内容理解方法。NLP,NLU和NLG中有数百篇论文,由于NLP对应用和企业AI的重要性和普遍性,所以我们从数百篇论文中寻找对NLP影响最大的论文。2018年最重要的自然语言处理(NLP)研究论文1.BERT:对语言理解的深度双向变换器的预训练,作者:JACOB DEVLIN,MING-WEI CHANG,KENTON LEE和KRISTINA TOUTANOVA论文摘要:我们引入了一种名为BERT的新语言表示模型,它是Transformer的双向编码器表示。与最近的语言表示模型不同,BERT旨在通过联合调节所有层中的左右上下文来预训练深度双向表示。因此,预训练的BERT表示可以通过一个额外的输出层进行微调,以创建适用于广泛任务的最先进模型,例如问答和语言推理,而无需实质性的具体的架构修改。BERT在概念上简单且经验丰富,它获得了11项自然语言处理任务的最新成果,包括将GLUE基准推至80.4%(提升了7.6%)、MultiNLI准确度达到86.7%(提升了5.6%)、SQuAD v1.1问题回答测试F1到93.2%(提升了1.5%)。总结谷歌AI团队提出了自然语言处理(NLP)的新前沿模型-BERT,它的设计允许模型从每个词的左侧和右侧考虑上下文。BERT在11个NLP任务上获得了新的最先进的结果,包括问题回答,命名实体识别和与一般语言理解相关的其他任务。论文的核心思想是什么?通过随机屏蔽一定比例的输入token来训练深度双向模型-从而避免单词间接“看到自己”的周期。通过构建简单的二进制分类任务来预训练句子关系模型,以预测句子B是否紧跟在句子A之后,从而允许BERT更好地理解句子之间的关系。训练一个非常大的模型(24个Transformer块,1024个隐藏层,340M参数)和大量数据(33亿字语料库)。什么是关键成就?刷新了11项NLP任务的记录,包括:获得80.4%的GLUE分数,这比之前最佳成绩提高了7.6%;在SQuAD 1.1上达到93.2%的准确率。预训练的模型不需要任何实质的体系结构修改来应用于特定的NLP任务。AI社区对其看法?BERT模型标志着NLP的新时代;两个无人监督的任务在一起为许多NLP任务提供了很好的性能;预训练语言模型成为一种新标准;未来的研究领域是什么?在更广泛的任务上测试该方法。收集BERT可能捕获或未捕获的语言现象。最可能的商业应用是什么?BERT可以帮助企业解决各种NLP问题,包括:提供更好的聊天机器人客服体验;客户评论分析;搜索相关信息;你在哪里可以代码?Google Research发布了一个官方Github存储库,其中包含Tensorflow代码和BERT预训练模型。BIT的PyTorch实现也可以在GitHub上获得。2.人类注意力的序列分类,作者:MARIA BARRETT,JOACHIM BINGEL,NORA HOLLENSTEIN,MAREK REI,ANDERSSØGAARD论文摘要学习注意力函数需要非常大规模的数据,不过有很多自然语言处理任务都是对人类行为的模拟,在这篇论文中作者们就表明人类的注意力确实可以为 NLP 中的许多注意力函数提供一个不错的归纳偏倚。具体来说,作者们根据人类阅读语料时的眼睛动作追踪数据估计出了「人类注意力」,然后用它对 RNN 网络中的注意力函数进行正则化。作者们的实验表明,人类注意力在大量不同的任务中都带来了显著的表现提升,包括情感分析、语法错误检测以及暴力语言检测。总结Maria Barrett和她的同事建议使用从眼动(eye-tracking)追踪语料库中获取的人类注意力来规范循环神经网络(RNN)中的注意力。通过利用公开可用的眼动追踪语料库,即通过眼睛跟踪测量(例如注视持续时间)增强的文本,它们能够在NLP任务中显着提高RNN的准确性,包括情绪分析、滥用语言检测和语法错误检测。论文的核心思想是什么?使用人的注意力,从眼动追踪语料库中估计,以规范机器注意力。模型的输入是一组标记序列和一组序列,其中每个标记与标量值相关联,该标量值表示人类读者平均专注于该标记的注意力。RNN联合学习循环参数和注意力功能,但可以在来自标记序列的监督信号和眼睛跟踪语料库中的注意力轨迹之间交替。建议的方法不要求目标任务数据带有眼睛跟踪信息。什么是关键成就?在注意力序列分类任务中引入循环神经结构。证明使用人眼注意力(从眼动追踪语料库中估计)来规范注意力功能可以在一系列NLP任务中实现显著改善,包括:§ 情绪分析,§ 检测语言检测,§ 语法错误检测。性能比基线平均误差减少4.5%。这些改进主要是由于召回率(recall)增加。AI社区对其看法?该论文获得了关于计算自然语言学习顶级会议的CoNLL 2018人类语言学习和处理启发的最佳研究论文特别奖。未来的研究领域是什么?在学习人类相关任务时,探索利用人类注意力作为机器注意力的归纳偏见的其他可能性。什么是可能的商业应用?RNN结合人类注意力信号,可应用于商业环境:§ 加强客户评论的自动分析;§ 过滤掉滥用的评论,回复。你在哪里可以得到实现代码?本研究论文的代码可在GitHub上获得。3.基于短语和神经元的无监督机器翻译,作者:GUILLAUME LAMPLE,MYLE OTT,ALEXIS CONNEAU,LUDOVIC DENOYER,MARC’AURELIO RANZATO论文摘要机器翻译系统在某些语言上实现了接近人类的性能,但其有效性强烈依赖于大量并行句子的可用性,这阻碍了它们适用于大多数语言。本文研究了如何在只能访问每种语言的大型单语语料库时学习翻译。我们提出了两种模型变体,一种神经模型,另一种基于短语的模型。两个版本都利用参数的初始化、语言模型的去噪效果以及通过迭代反向翻译自动生成并行数据。这些模型明显优于文献中的方法,同时更简单且具有更少的超参数。在广泛使用的WMT'14英语-法语和WMT'16德语-英语基准测试中,我们的模型不使用单个平行句的情况下分别获得28.1和25.2 BLEU分数,超过现有技术水平11 BLEU分。在英语-乌尔都语和英语-罗马尼亚语等低资源语言中,我们的方法比半监督和监督方法获得的效果都要好,我们的NMT和PBSMT代码是公开的。总结Facebook AI研究人员承认了缺乏用于训练机器翻译系统的大型并行语料库,并提出了一种更好的方法来利用单语数据进行机器翻译(MT)。特别是,他们认为通过适当的翻译模型初始化、语言建模和迭代反向翻译,可以成功地完成无监督的MT。研究人员提出了两种模型变体,一种是神经模型,另一种是基于短语的模型,它们的性能都极大地超越了目前最先进的模型。论文的核心思想是什么?无监督的MT可以通过以下方式完成:§ 合适的翻译模型初始化(即字节对编码);§ 在源语言和目标语言中训练语言模型,以提高翻译模型的质量(例如,进行本地替换,单词重新排序);§ 用于自动生成并行数据的迭代反向转换。有两种模型变体:神经和基于短语:§ 神经机器翻译一个重要的属性:跨语言共享内部表示。§ 基于短语的机器翻译在低资源语言对上优于神经模型,且易于解释和快速训练。什么是关键成就?基于神经和短语的机器翻译模型显著优于以前的无监督,例如:§ 对于英语-法语任务,基于短语的翻译模型获得的BLEU分数为28.1(比之前的最佳结果高出11 BLEU分);§ 对于德语-英语任务,基于神经和短语的翻译模型组合得到BLEU得分为25.2(高出基线10个BLEU点)。无监督的基于短语的翻译模型实现了超过使用10万个并行句子训练的监督模型对应的性能。AI社区的对其想法?该论文在自然语言处理领域的领先会议被评为EMNLP 2018评为最佳论文奖。未来的研究领域是什么?寻找更有效的原则实例或其他原则。扩展到半监督模型。什么是可能的商业应用?改进其中没有足够的并行语料库来训练受监督的机器翻译系统的机器翻译结果。你在哪里可以得到实现代码?Facebook团队在GitHub上提供了本研究论文的原始实现代码。未完待续……本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 29, 2019 · 1 min · jiezi

人物志 | MIT 科技创新“远见者”:美团 NLP 负责人王仲远

2019 年 1 月 21 日,《麻省理工科技评论》发布了 2018 年“35 岁以下科技创新 35 人”(35 Innovators Under 35)中国榜单,美团点评AI平台部 NLP 中心负责人、点评搜索智能中心负责人王仲远获评为“远见者”。Innovators Under 35 是《麻省理工科技评论》杂志从 1999 年开始的年度评选,针对新兴科技产业的青年从业者,肯定他们的创新工作。历史上的获奖者包括 Google 创始人 Larry Page 和 Sergey Brin,Linux 创始人 Linus Torvalds,Facebook 创始人马克·扎克伯格(Mark Zuckberg),网景浏览器创始人 Marc Andreessen,Apple 设计负责人 Jonathan Ive 等杰出人士。趁此机会,美团技术学院采访了王仲远博士,本文内容根据采访内容整理而成。大学王仲远没有想到,他高考时填报的第一志愿是中国人民大学国际经济与贸易专业,最后却被调剂到了中国人民大学的计算机系。更没想到的是,他从此爱上了这个专业,并且在计算机这个行业越走越深。幸运的是,王仲远就读的人民大学虽然以文科著称,却是中国数据库的学术重镇,萨师煊、王珊、杜小勇和孟小峰等几代人都是数据库领域的知名学者。刚开始的时候,王仲远也很困惑学校为什么总是教数据结构、操作系统、编译原理、计算机组成这种基础性的知识,好像都不是找工作所需要的技能。孟小峰教授却告诉他,在学校里把基本功打扎实最重要,如果有了扎实的基本功,社会上培训班教的那些“短平快”的技术,其实是很容易学习的。大二结束的暑假,王仲远找到孟小峰教授主动请缨,开始进入孟老师的 WAMDM (网络与移动数据管理)实验室学习,做了很多数据相关的项目,包括国内首款 Native XML 数据库 OrientX 的系统测试,以及 Deep Web 数据集成项目的研究。他发现孟老师的教导完全正确,有了基础课的底子,对很多工作都有着完全不一样的理解,做实际项目时上手很快。本科期间,王仲远与人合作的论文《Deep Web 数据集成中的实体识别方法》被中国数据库学术会议 NDBC 2006 录用,并发表在《计算机研究与发展(增刊)》上。这小小的一个进展,却意外开启了王仲远的研究之路。2007 年他获得了国际顶级学术会议 SIGMOD 2007 Undergraduate Scholarship 奖(当年全球只有 7 人获奖)。这更坚定了他踏上学术研究道路的决心。微软亚洲研究院硕士毕业时,王仲远很冒险地拒绝了百度、腾讯和 IBM 等众多知名公司研究机构的邀请,选择坚持等待微软亚洲研究院的offer。“其实当时我也很迷茫,在宿舍里望着窗外的枝头,希望能看到喜鹊经过。” 而王仲远不知道的是,他在当时微软亚洲研究院所有候选人中面试结果排名第一。他未来的老板王海勋和田江森主动找到研究院院长说,“这个小孩真不错,如果我们再不发 offer,就对不起人家了。”当年 12 月份的寒冬,王仲远终于成为研究院那批候选人中第一个拿到 offer 的人。王仲远说自己很幸运,微软亚洲研究院具备很多先天优势,在刚刚工作时就可以接触到很多世界级的学者,了解各领域前沿研究已经做到什么程度,无需摸着石头过河。2010 年 10 月,微软创始人、当时的全球首富比尔·盖茨来研究院访问,正式入职两个多月的王仲远获得做现场演示的机会。“可以想象,我当时是多么的激动。”王仲远所在的团队那时已经开始做一些知识图谱领域的探索和研究,虽然业界还没有这个概念。演示很成功,盖茨的反馈非常正面,给王仲远很大的激励,更坚定了他在知识图谱探索的道路上苦心孤诣地前行。这张与比尔·盖茨合影的照片,至今他还保留着。王仲远在微软亚洲研究院6年多,从校招生一直做到主管研究员,负责了微软研究院知识图谱项目和对话机器人项目。他一直专注于自然语言处理、知识图谱及其在文本理解方面的研究,取得了不少成绩,在国际顶级学术会议如 VLDB、ICDE、IJCAI、CIKM 等发表论文 30 余篇,并获得 ICDE 2015 最佳论文奖。谈到做研究的经验,王仲远总结说,很多时候我们觉得某件事情比较高深,只不过是不了解而已。做学术研究跟创业一样,只有自己真正扎进去才会发现其中的奥秘。同时,做研究需要长期有耐心,这刚好和现在美团所倡导的价值观相符。因为在这个过程中,你会受到非常多的质疑,也会面临多方面的挑战,包括来自你的同事、你的老板、还有学术界中其他流派的挑战。同时,还有短期的压力和长期的压力,也有项目无法落地的压力。但只要对这件事本身真的感兴趣,不管是做技术还是做研究,都可以做的很好。在王仲远看来,做研究需要有一颗强大的内心,按现在美团的话说,是炼心志。一方面他经常虚心地向前辈们请教,另一方面就是当别人质疑的时候,坚持自己的理想和信念。在他看来,做研究,过程往往比结果更重要,做正确的事情,好结果自然会来。“我从来没有给自己定一个目标,比如说要发几十篇顶级会议的学术论文。而是告诉自己,要踏踏实实地把这个研究项目做好,实实在在解决这个技术所面临的一些挑战性问题,当这些突破和研究的成果不断出现的时候,发表论文就是一个自然而然的事情。”现在,王仲远也经常跟美团 NLP 中心的同学讲,做事情要首先关注问题本身,要进行深度的思考,注重解决问题的逻辑和体系,而不是一上来就简单粗暴地冲着结果去。因为往往是人们越想得到结果,就越得不到结果。反而是专注解决问题本身,好结果就自然获得了。Facebook2016 年,王仲远在考虑自己下一步职业规划的时候,更多的是思考如何将自己的一身所学付诸实践,而不仅仅只停留在研究层面。“如何将技术转化为更为实际的生产力,更加直接地影响几十亿人的生活”,这是他再次出发的初心。这一次,王仲远依然拿到了很多顶级机构发出的 offer。他最终选择了 Facebook。因为相比于微软,Facebook 是一家纯粹的互联网企业,能够更加直接地面向消费者和用户。而且,在王仲远的眼中,扎克伯格是一个优秀的创始人。“我选择公司非常看重创始人的素质,他是不是一个有理想、有抱负、有信念的人。因为只有这样的创始人才能有战略性的思考,才能不被短期资本市场所影响,才能顶住财报的压力、舆论的压力,才能帮助企业走的更远。”在 Facebook,王仲远主要负责公司的产品级 NLP Service,要在用户每天发布的几十亿条帖子(Post)中,完成语义分析、查询以及搜索等相关的工作,从非常庞大且复杂的信息流中,找到一个用户想要看到的结果。比如在 Facebook 用户搜索 Trump 时,系统就知道用户想要找美国总统特朗普相关的信息。不过,在特朗普没有当上美国总统时,更多返回的结果其实是纽约的地标建筑特朗普大厦。王仲远说:“这是非常有意思的一件事,用户的各种查询意图,其实会随着时间而变化,我们做的事情就是在有限的关键词中解读出非常丰富的信号,然后用于各种搜索的召回、排序以及展示。今天,美团大脑以及点评搜索的深度查询理解服务也在做类似的事情,只不过我们处理的信息变成了几十亿条餐饮娱乐的评论以及数百万的活跃商户信息。”在 Facebook 工作期间,他所负责的一个项目是做实体链接,就是要把查询(Query)和知识图谱进行打通,这也是 NLP 领域一个非常重要的方向。短短半年的时间,效果就提升了 80% 左右,成为 Facebook 内部最重要同时也是世界上最先进的产品级实体链接服务。Facebook 的搜索、推荐、广告、智能助理等许多系统中,都在使用他负责的这些技术。美团“我们中国的移动互联网现在真的是非常发达,一天到晚不带钱包、信用卡,生活毫无问题,方便快捷。相比之下,美国就是一个发达的大农村。在国内叫个美团外卖,半小时就能送到家门口,在美国这简直是无法想象的。” 2018 年,因为家庭方面的考虑,王仲远选择回国发展。他收到了多家知名公司的橄榄枝,百度、腾讯和阿里巴巴都给出非常丰厚的待遇。但是他的考虑是,此前已经在微软亚洲研究院、Facebook 工作过,再去选择一家非常成熟的大公司,并不会发生太大的改变。他想接受新的挑战,承担更重要的角色,更希望选择一家能够发挥出自己更大优势的公司。滴滴、快手、今日头条等很多互联网新贵,当时也给王仲远发出了邀请,但他最终选择了美团。为什么?王仲远说,他最看好美团,相信美团是一家能够持续几十年乃至更久生命力的公司。阿里巴巴从解决“衣食住行”中的“衣”开始起家,电子商务也成就了阿里巴巴。那么在“食、住、行”等这些生活服务领域呢?王仲远相信,一样会成就新的互联网巨头。而且民以食为天,美团外卖已经占据绝对领先的市场份额,美团酒店单日入住间夜不断在刷新行业的新纪录,美团出行也完成了战略布局。美团最新的战略是“Food + Platform”,王仲远对此非常认可。他相信,十年后,一定会有新的纯线上App出现,大家那时很可能早就不玩“抖音”了。还会有更多新鲜好玩的游戏,也不会再玩“王者荣耀”了。这种纯线上的信息和娱乐服务,变化是非常快的,所谓“江山代有才人出”。“但是无论怎么变,大家总是还要吃饭的。”即使将来有一天,技术真的可以让我们吃饭的方式完全不一样,但是人类也绝对不会放弃对美食的追求,因为这本身也是一种乐趣。这也意味着,美团很有可能成长为一家长期有耐心、不断积累、不断发展的公司,“Food + Platform”也会是一项非常长期的事业。王仲远的另外一个思考就是,AI 技术想真正能够落地,需要算力,需要数据,需要算法模型,更需要丰富的应用场景。美团的应用场景丰富程度,显然远超滴滴、快手、今日头条等互联网同行。“在这样的情况下,美团对我来说,可能就是不二的选择了。”还有一个重要因素是,王仲远非常认可美团创始人王兴,“我还是很崇拜兴哥的,他是非常有理想、有信念、有战略思考的一个人。”王仲远坦言,最终选择加入美团,也是非常认同美团倡导的“以客户为中心”、“追求卓越”、“长期有耐心”这些价值观,他相信可以在美团中发挥自己的才华,而美团也提供了一个广阔的舞台,可以让他尽情地施展。从 0 到 1 组建新团队,最看重成员的价值观刚到美团,王仲远受命组建美团 AI 平台部的 NLP 中心。他对团队成员的要求是:知行合一,希望大家都是带着自己梦想加入这个团队,踏踏实实地把事情做出来。王仲远说:“从 0 到 1 组建一个新的团队,挑战还是非常大的。我们的标准非常高,即使招聘速度再慢,都要保证团队成员的质量。”因为招聘要求很高,所以王仲远需要花很多时间去吸引那些认可美团价值观的候选人。他是怀抱将AI技术在各种场景中落地的梦想加入美团,他相信肯定有很多跟自己一样有梦想、有信念的候选人。他也希望找到这样一群志同道合的人,共同前行。今天,美团 NLP 中心团队已经初步成型,汇集了很多优秀的 AI 专家和工程师。从“美团大脑”到搜索系统的智能化升级很快王仲远又开始负责大众点评搜索智能中心。王仲远说:“我非常感谢公司管理层对我的信任,能让我同时负责两个团队,一个 AI 平台团队,一个业务平台团队。这使得我能够更好地规划和掌控AI技术的落地,让 AI 技术更好更快地发挥价值,帮助业务平台进行智能化升级。”2018 年 5 月,他开始领导团队构建美团大规模餐饮娱乐知识图谱的平台——美团大脑。这个“大脑”充分挖掘、关联各个场景数据,使用 AI 算法让机器“阅读”用户针对商户的公开评论,理解用户在菜品、价格、服务、环境等方面的喜好,构建人、店、商品、场景之间的知识关联,从而形成一个“知识大脑”。在王仲远眼中,美团大脑更像一个AI的基础设施,目前这个 AI 平台已经开始逐步服务于美团的搜索、SaaS 收银、金融、外卖、智能客服等众多应用场景。在这些场景中,既有 ToC 的业务,也有 ToB 的业务。同时管理两个团队,经常往返于北京上海之间,对王仲远而言,虽然辛苦,但效果也很显著。在 NLP 中心以及大众点评搜索智能中心两个团队的紧密合作下,短短半年时间,点评搜索核心 KPI 在高位基础上仍然大幅提升,是过去一年半涨幅的六倍之多,提前半年完成全年目标。王仲远眼中的微软、Facebook 和美团一个在学术圈深耕了六、七年的研究型人才,进入企业做项目落地。拥有两家全球顶尖科技企业的从业背景,但回国后却放弃优厚的待遇,选择一家互联网公司再次出发。王仲远的每一次选择,都显得有些与众不同。但是在他身上,我们没有看到任何”莽撞“的成分。每一次选择,他都经过深思熟虑,而且是慎之又慎。在王仲远的眼中,微软亚洲研究院是中国互联网行业学术研究方向的领头羊,对他的培养和成长,都有很大的帮助。时至今日,微软亚洲研究院对他的影响,仍是不可磨灭的。不过,微软也面临着时代的挑战,虽然这么多年一直在尝试突破,但是它仍然更像一家传统的软件公司。而 Facebook,是一家非常顶尖的互联网公司,它也是很多国内的互联网公司学习的榜样。Facebook 有一个口号是“快速行动,打破传统(Move Fast and Break Things)”,可以看出,他们对“快”的追求。Facebook 还有很多像“Go Big or Go Home”这一类的内部口号,这跟美团的技术团队“要么牛 X,要么滚蛋”的说法异曲同工。王仲远认为,Facebook 的进化速度要比微软快很多。而美团是一家比 Facebook 节奏更快的互联网公司,当然这代表了中国速度,也代表了中国互联网的发展速度。王仲远说:“很多的事情,可能在微软亚洲研究院我们需要要用一年的时间来做,在 Facebook 可能会用半年。但是在美团,我们可能只有两个月到三个月的时间。”美团的高速成长,给王仲远的团队带来很大的挑战。他们每天都要面临各种的持续迭代,要做很多快速的技术演化和突破。美团技术团队是在为生活服务各行业构建信息基础设施,实现需求侧和供给侧的数字化,任重而道远。未来的路还很长,王仲远和他的 AI 团队,还在路上。对话王仲远:关于职业发展、知识图谱以及 AI 的未来秉持信念,不忘初心,不断拥抱变化,才能真正把工作做好Q:你觉得偏研究型的人才,怎么在企业中发挥出自己的价值?王仲远:任何科技的发展,都需要研究型人才的推动。但是研究型的人才分几种,有的是做纯理论研究的人才,可能高校是他们最好的选择。这些人愿意几十年如一日的深耕一个领域。比如深度学习先驱 Geoffrey Hinton 教授,长期从事神经网络领域的研究,不管是神经网络发展的高潮还是低谷,他都能坚持做下去。还有一些人才,他们更希望把自己学到的各种研究模型、研究成果,能够实实在在地应用在真正的科技产品里面,然后去影响几亿人甚至几十亿人的生活。那么这一类研究型人才,他们更看重应用型的研究,公司可能会更需要他们。我们整个 NLP 中心也在做一个平衡,80% 的同学会偏应用型研究,也会有 20% 同学会做偏理论的研究,也会鼓励同学们根据兴趣做一些前沿的技术研究。我们希望能够保持较强的科技创新能力,并具备长期的核心竞争力。Q:外企和海归背景的人,怎么在本土企业中证明自己的价值?王仲远:不建议给自己贴“标签”。文化上肯定会有一些冲突和差异。但是能不能适应,其实很大程度上取决于个人,取决于这些人能不能拥抱变化。我必须承认,国内互联网的变化或者演化速度,远远超出原来我待过的两家外企,我也必须要适应和拥抱这种变化。如果我们能够秉持自己的信念,不忘自己的初心,同时能不断地提炼自己,升级自己,愿意拥抱这些变化,我相信在新团队也可以做的更好。而且我也观察过,真正的最顶尖的人、最聪明的那些人,他们不管做什么行业,不管做什么事情,不管身处什么样的环境,都能够把事情做的非常好,都能够取得非常好的成就。在我看来,“人”本身的因素要比“外企背景”这种因素重要很多。我深信真正聪明的人的适应力也都是非常强的。而且加入美团后,我们发现很多很厉害的人,即使把他们放在一个完全不懂,或者不熟悉的项目中,他们一样可以做的很优秀。比如美团内部某个业务部门的负责人,曾经做了 15 年的互联网音乐。我相信拥抱变化的人,都不会做的很差。至于如何证明自己?其实刚刚我也提到过,不要刻意。越刻意地想去证明自己,往往越证明不了自己。越想刻意拿到结果,往往越拿不到结果。我会给身边的同学提这样的建议。关注事情本身,关注怎么解决用户的痛点,关注怎么解决技术的难点,关注怎么解决业务的需求。如果把这些事情做好了,既能拿到结果,最终也能证明自己的价值。知识图谱技术的春天来临,是因为大数据在推动Q:像知识图谱相关的技术已经存在了很多年,为什么迟迟没有进入大众的视野呢?王仲远:技术的发展,永远都是起起伏伏,处于一个螺旋上升的阶段。知识图谱并不是新技术。早在上个世纪 80 年代,就有很多知识库系统的研究了。包括 1984 年开始的 Cyc 就是一个知识图谱项目。其实比 Cyc 更早之前,还有很多医疗诊断的专家系统。但是受限于当时的计算能力、人们的认知、数据量,很多都是通过人工编写规则,或者去找专家建设行业知识库,这种方式不仅效率低下,而且人的思考也具备局限性。通过领域专家去构建的知识库,通常就是几十万的量级,显然不能够满足需求。2000 年以后,随着互联网的高速发展,数据也越发的丰富,促进了知识图谱技术的蓬勃发展。我们这些做知识库的研究者开始有了新的思路,不再以专家系统为驱动,而是变成依靠数据来驱动产生知识。从观念层面发生的根本性改变后,知识图谱马上展示出自身巨大的价值。特别是 2012 年,谷歌发布了 Google Knowledge Graph,人们又重新认识了知识图谱技术。此外,知识图谱之所以影响力有限,还有一个很重要的原因就是,拥有这种规模数据的只有少数几家大公司。它们暂时也没有办法去开放,因为涉及到用户隐私问题、数据安全问题,同时还涉及到核心竞争力。但我相信,所有从事AI行业相关的人都清楚地知道知识图谱的价值和意义。其实在这些互联网巨头内部,不管是微软、Facebook,包括谷歌和百度,它们对知识图谱技术都非常重视。Q:你觉得像知识图谱这些技术的落地,目前面临的最大挑战是什么?王仲远:可能很多人不太清楚,十年前或则更久之前,在学术研究界就已经存在非常多的且成熟的知识图谱相关的技术,包括知识的提取、知识的发现、实体识别、实体链接等等。但是,学校实验室或者研究所缺少海量的研究数据,科研人员基于的数据量基本处在几十万或者百万的量级,当这些技术遇到亿级甚至百亿量级的数据时,很多技术走不通。我们目前面临的最大挑战就是,即使是一个非常简单的,或者已经被学术界认定非常成熟的技术,在去解决百亿、千亿量级知识图谱应用问题时,基本都会失效。因此,应该如何重新设计算法,应该如何重新设计新的工程架构,是我们需要解决的核心问题。此外,深度学习跟知识图谱进行结合,也是一个非常重要的研究方向。Q:你觉得对企业而言,如何才能做好 NLP?王仲远:NLP 是人工智能所有方向中一个还需要突破的领域。像语音识别和图像识别,通过深度学习已经可以得到非常好的结果。但人类和动物一个非常重要的区别就是,人类拥有非常完备的理解、推理、思考能力,这些能力是 NLP 需要解决的,但是挑战性也很高。目前在 NLP 领域,我们已经做了很多的突破,也有一些很好的落地场景,比如智能客服,语音助手,还有搜索、推荐、广告这些应用场景。但是在特定的领域,比如餐饮、酒店预订、出行等领域,还有很大的提升空间。在我看来,企业想要做好 NLP,首先需要打通基础数据。像美团大脑目前包含了 23 类概念、18 亿实体、600 亿三元组,这个知识关联数量级已经达到了世界级的规模。只有数据被打通,才能发挥出更大的价值。其次,需要构建扎实的技术底层,打造一个平台,使得不同的业务线都能更方便、快捷地去使用 NLP 的这些技术,当新技术出现时,也可以快速进行升级和迭代。总的来说,一个是打通数据,一个构建技术底层。当然还有人才,人才也是实现以上两者的根本因素。当然,既能够安心做研究,又能够落地的核心人才也是最稀缺的,我们美团 NLP 中心对于优秀人才的渴求,也是永无止境的,我们随时都欢迎有理想、有信念的同学加入,一起创造未来。相信 AI 的未来:道路是曲折的,前景是光明的Q:怎么看待 AI 未来的发展?王仲远:我应该属于理性的乐观派。在我看来,不管是深度学习还是知识图谱,技术发展历程永远会有高潮,也会有低谷。这两年因为资本的涌入,因为媒体的宣传,有时甚至过度炒作,使得 AI 进入了大众的视野。这会带来一个好处,就是人们对 AI 有了更加广泛的关注。但是也带来很多的风险,比如很多不是特别成熟的 AI 技术也被“催熟”了,如果这些 AI 产品不能够很好地解决人们实际需求的时候,就会被大家所质疑,比如像前几年很火爆的 VR、AR 等等。还有无人驾驶技术,距离真正落地,还存在很多亟待解决的问题。我预计未来一两年,随着资本的收缩,AI 可能会陷入冷静期甚至是低谷期。但这个时间应该不会持续太久,因为核心技术一直都在研究和突破。随着 5G 时代的到来,随着 AR、VR 技术更加成熟,随着NLP技术更加成熟,随着无人驾驶技术更加成熟,未来 AI 也会带来产业新的热潮。20年 ToC,20 年 ToB。在互联网高速发展的前 20 年,我们主要解决了消费者的需求。但在很多传统产业,供给侧的数字化,AI 对它们的影响还很有限,这也是我们未来的机会。Q:对从事AI相关工作的同学,有什么建议吗?王仲远:我觉得大家还是要多关注核心技术,以及核心技术跟业务场景的结合。一个属于“基本功”,另一个是思考技术对业务的价值。因为技术永远是日新月异,也会不断地更新迭代。特别是做算法研究的同学,相对比较辛苦,要持续的进行学习和提升,如果有一段时间不学习,很可能会被淘汰。在我们的面试过程中也能够感觉出来。如果面试算法工程师的同学,还是用传统模型而不是深度学习的话,就会面临很大的挑战。此外,如果只关注模型本身,而不去思考如何跟业务进行结合,在工作中也很难证明自己。如果是在校的大学生,建议大家不要上来就学习 Java、Python 这些编程语言。应该先对计算机的各种原理、基础知识(概率论、数学分析)等掌握清楚,再去学习很多技术时,就会有完全不一样的理解。我们未来的一切,都应该建立在一个扎实的基本功之上。影响王仲远的书、人、事Q:你觉得对你影响最大的一件事是什么?王仲远:很难说具体的哪件事影响最大。刚刚也提到了,这么多年的职业生涯,我做了很多次、可能看起来比较重大的选择,但是我很难讲,哪一件事会彻底的改变自己的职业生涯。相对来说,影响比较大的事情有很多,像大学时获得“SIGMOD 2007 Undergraduate Award”奖项,让我坚定地选择了研究这条路。后来在这条道路上,也受到很多老板对我的鼓励。还有刚工作两个月,就得到跟比尔盖茨做汇报的机会,得到他的正向反馈。还有在顶级学术会议发表论文,以及现在做的美团大脑项目,包括刚刚获得的《麻省理工科技评论》这个荣誉等等,我想这些事对都产生了非常大的影响。但对于具体的一件事而言,我觉得,更多的是在每一次做人生选择时所做的坚持,以及坚持之后通过努力所带来的一些认可。这也是鼓励我在各种质疑中、在各种压力中,持续前进的一个非常重要的动力,使我能够长期地坚持下去。Q:你觉得,这么多年对你影响最大的一个人是谁?王仲远:对我影响很大的人其实很多。比如我的第一个导师孟小峰教授,他带领我进入了研究的大门。我的第一任老板王海勋博士,他也是我在Facebook的老板,给了我很多次机会。还有后来研究院的常务副院长马维英(现今日头条人工智能实验室主任),从他身上,我学到了很多管理的能力。加入美团后,兴哥和老王(美团联合创始人王慧文)对我的影响也非常大,每一次听他们的分享,都让我受益良多,比如兴哥对战略的思考能力和大局观,老王对市场敏锐的把握、对产品的认知等等,都让我学到非常多新的知识。我再次感觉到自己在快速的成长之中。他们对我的帮助也都非常大。Q:如果让你推荐一本书,你会推荐哪本?王仲远:推荐微软 CEO 萨提亚·纳德拉首部作品《刷新:重新发现商业与未来》。我觉得萨提亚能够带领微软这样的巨型科技公司成功转型,再次成为市值最高的公司,非常令人钦佩。尤其是当年我也曾在微软工作过,感受过微软所面临的那种困境与挣扎,更能体会到萨提亚的管理智慧。在书中,萨提亚反复提到“同理心”,这是我所非常认同的,它也深刻地影响我的思考、沟通和行为方式。相关阅读王仲远博士获评《麻省理工科技评论》“35 岁以下科技创新 35 人”中的“远见者”,麻省理工科技评论给出的获奖理由为:“在知识图谱和自然语言处理领域解决多项挑战性问题,其工作涉及搜索引擎、广告推荐、知识挖掘、关系推理、智能助理等多个领域。获奖人(王仲远)在微软负责包括微软概念知识图谱、企业知识图谱等多个知识图谱和 NLP 相关项目,提出的概念化模型能让计算机像人类一样对文本进行理解;在 Facebook 领导团队构建了世界上最大的产品级社交网络知识图谱实体链接服务。在美团仅用半年就领导团队构建出世界上最大的餐饮娱乐知识图谱“美团大脑”。获奖人的开发应用于餐饮、出行、休闲娱乐、旅游、金融等各个场景,为数亿人提供了更便捷、更智能的服务。”受访者简介王仲远博士,美团点评高级研究员、高级总监,美团 AI 平台部 NLP 中心负责人、大众点评搜索智能中心负责人。加入美团点评前,担任美国 Facebook 公司 Research Scientist,负责 Facebook 产品级 NLP Service。在 Facebook 之前,担任微软亚洲研究院的主管研究员,负责微软研究院知识图谱项目和对话机器人项目。多年来专注于自然语言处理、知识图谱及其在文本理解方面的研究,在国际顶级学术会议如 VLDB、ICDE、IJCAI、CIKM 等发表论文 30 余篇,获得 ICDE 2015 最佳论文奖,并是 ACL 2016 Tutorial “Understanding Short Texts”的主讲人,出版学术专著 3 部,获得美国专利 5 项。在 NLP 和 KG 研究领域及实际产品系统中均有丰富经验,研究领域包括自然语言处理、知识图谱、深度学习、数据挖掘等。参考文献《麻省理工科技评论》年度中国科技青年英雄榜发布!35位中国入选者涵盖全球最前沿科学与技术计算机系本科生王仲远荣获 SIGMOD07 Undergraduate Scholarship ...

January 28, 2019 · 2 min · jiezi

NLP度量指标BELU真的完美么?

摘要: NLP重要评价准则之一——BLEU,真的完美无缺么?刚接触自然语言处理的朋友通常会问我:当系统的输出是文本,而非对输入文本进行某种分类,如何对该系统进行评估。当模型的输入是文本信息,输出也是文本信息时,我们称之为序列到序列问题,也可称为字符串转换问题。序列到序列建模是解决NLP中较难任务的核心,它包括:1、 自动文摘(Text Summarization);2、 文本简化(Text simplification);3、 问答(Question answering);4、 聊天机器人(Chatbots);5、 机器翻译(Machine translation);理解序列到序列建模问题相对容易,如何对其进行评价才是难点。对于刚入门NLP的人来说,选取衡量标准较为困难。目前最流行的评价指标之一BLEU虽然常用,但也存在较大的缺陷。本文将介绍BELU的工作原理,指出其存在的问题,并探索如何结合自己的工作最大程度规避这些问题。一个难题BELU最初是评价机器翻译的指标,所以我们会以翻译(法语—英语)为例进行讲解。J’ai mangé trois filberts.下面两句为英语参考译文:I have eaten three hazelnuts.I ate three filberts.假设下面的翻译是由我们训练的神经网络产生。I ate three hazelnuts.问题来了:如何给上述翻译结果打分。要想利用机器学习来建立一个翻译系统,就需要一个实值分数来对其性能进行衡量。如果我们能够获取潜在的最佳得分,便能够计算它与实际值之间的误差。这能够在训练时为系统提供反馈,通过最小实际分数与潜在分数之间的差值来改进翻译模型,并通过查看同一任务上训练过的系统得分比较不同的模型。假设:如果输出句子中的单词在任何一个参考句出现,就给它打1分,如果没有出现,打0分。为了使计数标准化,使分数始终介于0和1之间。我们可以将某个参考译文中出现的单词总数除以输出句子中的单词总数。我们称该方法为unigram precision。在上面的翻译示例中,“I ate three hazelnuts”,我们能够在输出句子中看到至少一个参考句中的单词,再除以单词数4,该翻译的最终得分为1。但如果换成了下面的句子,该如何打分呢?Three three three three.按照刚才的衡量标准,得分依旧为1。但很明显,“I ate three hazelnuts”比“Three three three three”翻译得好。但如何将这一点告知我们正在训练的系统呢?你可以通过限定单词出现在翻译句子中的最大次数来调整分数。经过调整,“I ate three hazelnuts”计算出的得分仍然为1,而“Three three three three”为0.25。这解决了单词简单重复的问题,但新问题来了,如果单词的排列是无序的呢?就像下面:Ate hazelnuts I three如果继续用刚才的方法,这个句子得分为1。通过计数可以解决这个问题,但此时并非统计单个单词,而是相邻的单词。该方法称为n-grams,n是每组单词的数量,unigrams,bigrams,trigrams以及4-grams分别由一个、两个、三个、四个单词组成。在这个例子中,我们使用bigrams。通常来讲,BLEU的分数是unigram,bigram,trigram,4-grams的加权平均。为了简便,我们选择bigram,并忽略句子开头和结尾定义边界的单词。基于上述规则,句子排序如下:[Ate hazelnuts][hazelnuts I][I three]如果我们利用bigrams计算句子得分,“I ate three hazelnuts”是0分,“Three three three three”是0分,“I eat three hazelnuts”为1分,而下面这个例子也是0分:I ate.很明显这不是我们想要的。解决这个问题的方法是将目前的分数乘以一个简短惩罚因子。通过这个因子,得分高的候选翻译结果,能够同时在长度、词语选择、词语顺序等方面与参考句子匹配。如果翻译结果比参考句子更长或者一样长,惩罚因子为1。如果翻译译文长度比参考译文要短,就需要一个惩罚的机制去控制。在示例“I ate”中,句子长度为2个单词,与其最接近的参考句长度为4个单词。其简洁惩罚为0.36,乘以bigram的精度分数1,最终得分降至0.36。该指标旨在探测输出翻译与参考语句中有多少个n-grams重叠,并乘以简洁惩罚值后输出得分。BLEU由Kishore Papineni, Salim Roukos, Todd Ward, and Wei-Jing Zhu于2002年提出,是NLP中非常流行的度量指标,特别是对于系统输出是文本信息而不是分类的任务,其中包括机器翻译和自然语言生成。它解决了我们在文章开头提出的问题:找到一种方法,告诉我们翻译结果有多“好”,并为其打分。BLEU存在的问题在此之前,先概括一下BLEU的优势:**1、它方便,快速,容易计算,结果比较接近人类评分;2、在相同的任务中,能够很容易地将模型与基准进行比较;**但这些便利使得人们过度的使用它,即使在它不是最佳度量标准的任务中也作为了首选。尽管我们只以一句话为例进行了介绍,但BLEU是一种语料库级别的度量标准。计算语料库中的每个句子的BLEU分数,然后求它们的平均值会使得分数过大。BLEU的问题主要有以下四点:1、 不考虑意义;2、 不直接考虑句子结构3、 不能很好地处理形态丰富的语言4、 不能很好的映射到人类判断BLEU不考虑意义由于BLEU不考虑意义,我们便不能只使用它对机器翻译进行评估。作为一名机器翻译软件的用户,我更希望准确理解原文的含义,即使翻译的句子中在语法或句法上有所欠缺,只要清楚的表达了原文的意义也能接受。但BLEU并不考虑意义,它只奖励精确匹配的n-grams。这意味着一个虚词(如“an”或“on”)的差异和一个更重要的与内容相关的词语受到的惩罚是一样的。如果一个译文中有一个完全有效的同义词,只是没有出现在参考译文中,也会受到惩罚,但这并不合理。以下列句子为例对这个问题进行分析:Original (French): J’ai mangé la pomme.Reference translation: I ate the apple.下列的句子都是BLEU评出的 “糟糕的翻译”:I consumed the apple.I ate an apple.I ate the potato.但作为机器翻译的使用者,我觉得前面两句也表达清楚了原文的意思,即使它们和参考译文有所出入。第三句话让人不能接受,它完全改变了原文的意思。NIST方法是在BLEU方法上的一种改进。最主要的是引入了每个n-gram的信息量(information)的概念。BLEU算法只是单纯的将n-gram的数目加起来,而NIST是在得到信息量累加起来再除以整个译文的n-gram片段数目。这样相当于对于一些出现少的重点的词权重就给的大了。因此,在更常见的n-gram(如“of”)上的不匹配将受到更小的惩罚,而在更罕见的n-gram(如“buffalo buffalo”)上的不匹配将受到更大的惩罚。虽然这解决了赋予虚词过多权重的问题,但实际上却使惩罚同义词(如“ambled”代替“walked”)的问题变得更糟,因为这些同义词只出现在更少见的n-gram中,因此惩罚因子会更大。BLEU不直接考虑句子结构即使你通过调整词序改变句子的结构,仍然可以获得很高的BLEU分数。句法是对句子结构的研究,以词作为基本单位,并且各单词按照一定顺序排列。“I saw the dog with the telescope”一句,即能表示“I was using the telescope to look at the dog”,也可以说“the dog had the telescope”。二者的区别通过句子中各单词的排列顺序体现。在自然语言中,句子的内部结构特别重要,将句子各单词顺序打乱,既破坏了其完整含义,又让人难以理解。通过parsing可解决该问题。但parsing的计算相当密集,每次求值时必须解析所有输出,增加了开销。但不考虑句法结构,词序混乱的翻译与意思连贯的翻译获得相同的分数显得极其不合理。Callison-Burch等人在2006年对此进行了说明:Orejuela appeared calm as he was led to the American plane which will take him to Miami, Florida.Orejuela appeared calm while being escorted to the plane that would take him to Miami, Florida.Orejuela appeared calm as he was being led to the American plane that was to carry him to Miami in Florida.Orejuela seemed quite calm as he was being led to the American plane that would take him to Miami in Florida.翻译如下:Appeared calm when he was taken to the American plane, which will to Miami, Florida.这个翻译并不完美,它删除了人名,且句子后半段“will”后面没有动词,但它并非一点意义没有,毕竟比下面的翻译好,虽然两句话获得的BLEU分数相同:which will he was, when taken appeared calm to the American plane to Miami, Florida.BELU不能很好地处理形态丰富的语言BELU基于单词级别进行匹配,对于形态丰富的语言,显得并不适用。语素是语言中最小的音义结合体,它们组合在一起构成单词。以英语单词“cats”中的“s”为例,它告诉我们不止一只猫。有些语言,如土耳其语,在一个单词中有很多的语素,而英语,通常每个单词中的语素很少。以秘鲁语句为例:Jawen jemara ani iki.Jawen jemaronki ani iki.两句话都是可接受的英语“her village is large”的翻译。其中,以“jemar-”开头的单词在两个句子中有不同的结尾。不同的结尾代表不同的词素,这句话表明说话人很确定这个村子很大。上面那句话是他们去过那里见到了很大的村子,而下面那句话则表示他们是从别人那听说村子很大。这种特殊类型的语素被称为“证据标记(evidentiality marker)”,这在英语中不存在,而在秘鲁语中,一个句子的语法需要二者中的一个,所以我们的参考译文也应该有其中的一个。但是,如果我们没有在参考句中准确地找到该单词,就会对它进行惩罚,即使这两个句子都很好的表达了英语原句的意思。BELU不能很好的映射到人类判断构建机器翻译,聊天机器人以及问答系统最终的目的是希望人们能够使用它们。如果一个系统不能提供有效的输出,就没有意义。所以优化目的是使更多的人喜欢并尽可能多的使用所开发的系统。BELU首次提出时,作者进行了相关的行为测试,以确保与人类的判断相关。但当研究人员进行更多的实验时,发现BELU分数并不能很好的映射到人类判断。在一些任务中,甚至其它的评价方法更接近人类判断。Turian在2003年发现,BLEU在机器翻译中与人类判断的相关性最差,F1与人类判断最为相关,NIST次之。Sun在2010年比较了BLEU,GTM以及TER,发现BELU与人类判断的相关性最小。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

January 21, 2019 · 2 min · jiezi

最强NLP模型BERT可视化学习

摘要: 最强NLP模型谷歌BERT狂破11项纪录,全面超越人类,本文通过可视化带你直观了解它。2018年是自然语言处理(Natural Language Processing, NLP)领域的转折点,一系列深度学习模型在智能问答及情感分类等NLP任务中均取得了最先进的成果。近期,谷歌提出了BERT模型,在各种任务上表现卓越,有人称其为“一个解决所有问题的模型”。BERT模型的核心思想有两点,对推动NLP的发展有着重要的作用:(1)Transformer结构;(2)无监督的预训练。Transformer是一个只基于注意力(Attention)机制的序列模型,《Attention is all you need》一文中指出,它摒弃了固有的定式,没有采用RNN的结构。BERT模型同时需要预训练,从两个无监督任务中获取权重:语言建模(给定左右上下文,预测丢失的单词)以及下一个句子预测(预测一个句子是否跟在另一个句子后面)。BERT是个“多头怪”BERT与传统的注意力模型有所不同,它并非在RNN的隐藏状态上直接连接注意力机制。BERT拥有多层注意力结构(12层或24层,取决于模型),并且在每个层(12层或16层)中都包含有多个“头”。由于模型的权重不在层与层之间共享,一个BERT模型相当于拥有24×16=384种不同的注意力机制。BERT可视化BERT模型较为复杂,难以直接理解它学习的权重的含义。深度学习模型的可解释性通常不强,但我们可以通过一些可视化工具对其进行理解。Tensor2Tensor提供了出色的工具对注意力进行可视化,我结合PyTorch对BERT进行了可视化。点击查看详情。该工具将注意力可视化为连接被更新位置(左)和被关注位置(右)之间的连线。不同的颜色对应不同的“注意力头”,线段宽度反映注意力值的大小。在该工具的顶部,用户可以选择模型层,以及一个或者多个“注意力头”(通过点击顶部颜色切换,一共包含12个不同的“头”)BERT到底学习什么?该工具能用于探索预先训练的BERT模型的各个层以及头部的注意模式。以下列输入值为例进行详解:句子A:I went to the store.句子B:At the store, I bought fresh strawberries.BERT采用WordPiece tokenization对原始句子进行解析,并使用[CLS]对token进行分类以及[SEP]对token进行分隔,则输入的句子变为:[CLS] i went to the store. [SEP] at the store, i bought fresh straw ##berries. [SEP]接下来我将确定6个关键模式,并展示每个模式特定层/头的可视化效果。模式1:下一个单词的注意力(Attention to next word)在该模式下,特定单词的大部分注意力都集中在序列中该单词的下一个token处。如下图所示,我们以第二层的head 0为例(所选头部由顶部颜色栏中突出显示的正方形表示)。左边图中展示了所有token的注意力,右边则显示了特定token(“i”)的注意力。“i”几乎所有的注意力都集中在它的下一个token,即“went”处。左图中,[SEP]指向了[CLS],而非“at”,也就是说,指向下一个单词的这种模式只在句子中起作用,而在句子间的效果较弱。该模式类似于RNN中的backward,状态从右往左依次更新。模式2:前一个单词的注意力(Attention to previous word)在该模式下,特定单词的大部分注意力都集中在序列中该单词的前一个token处。本例中,“went”的大部分注意力集中于它的前一个单词“i”。模式2不如模式1明显,特定的单词注意力有所分散。该过程与RNN中的forward类似。模式3:相同/相关单词的注意力(Attention to identical/related words)在该模式下,特定单词的大部分注意力集中于与其相同或者相关的单词,包括该单词本身。下图中,“store”的大部分注意力集中在它本身。由于注意力有所分散,该模式也不明显。模式4:其它句子中相同/相关单词的注意力(Attention to identical/related words in other sentence)在该模式中,注意力集中在其它句子中与指定单词相同或者相似的单词。如下图,第二个句子中的“store”与第一个句子中的“store”关联最强。这对于下一个句子预测任务非常有帮助,它能够帮助识别句子之间的关系。模式5:预测单词的注意力(Attention)在该模式下,注意力集中于其它可以预测源单词的单词上,且不包括源单词本身。如下图,“straw”的注意力主要集中于“##berries”,而“##berries”的注意力主要集中于“straw”。模式6:分隔符标记的注意力(Attention to delimiter tokens)在该模式下,特定单词的注意力主要集中于分隔符,[CLS]或[SEP]中。如下图,大多数的注意力都集中在两个[SEP]中,这或许是模型将语句级别状态传递到各个token中的一种方法。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 17, 2019 · 1 min · jiezi

2018年AI和ML(NLP、计算机视觉、强化学习)技术总结和2019年趋势(下)

摘要: 回顾2018,展望2019,计算机科学技术继续前进!4、工具和库工具和库是数据科学家的基础。我参与了大量关于哪种工具最好的辩论,哪个框架会取代另一个,哪个库是经济计算的缩影等等。但有一点共识–我们需要掌握该领域的最新工具,否则就有被淘汰的风险。 Python取代其他所有事物并将自己打造成行业领导者的步伐就是这样的例子。 当然,其中很多都归结为主观选择,但如果你不考虑最先进的技术,我建议你现在开始,否则后果可能将不可预测。那么成为今年头条新闻的是什么?我们来看看吧!PyTorch 1.0什么是PyTorch?我已经多次在本文中提到它了,你可以在Faizan Shaikh的文章中熟悉这个框架。这是我最喜欢的关于深度学习文章之一!当时TensorFlow很缓慢,这为PyTorch打开了大门快速获得深度学习市场。我在GitHub上看到的大部分代码都是PyTorch实现的。这并非因为PyTorch非常灵活,而是最新版本(v1.0)已经大规模应用到许多Facebook产品和服务,包括每天执行60亿次文本翻译。PyTorch的使用率在2019年上升,所以现在是加入的好时机。AutoML—自动机器学习AutoML在过去几年中逐渐取得进展。RapidMiner、KNIME、DataRobot和H2O.ai等公司都发布了非常不错的产品,展示了这项服务的巨大潜力。你能想象在ML项目上工作,只需要使用拖放界面而无需编码吗?这种现象在未来并不太遥远。但除了这些公司之外,ML / DL领域还有一个重要的发布-Auto Keras!它是一个用于执行AutoML任务的开源库。其背后的目的是让没有ML背景的领域专家进行深度学习。请务必在此处查看,它准备在未来几年内大规模运行。TensorFlow.js-浏览器中的深度学习我们一直都喜欢在最喜欢的IDE和编辑器中构建和设计机器学习和深度学习模型。如何迈出一步,尝试不同的东西?我将要介绍如何在你的网络浏览器中进行深度学习!由于TensorFlow.js的发布,已成为现实。TensorFlow.js主要有三个优点/功能:1.使用JavaScript开发和创建机器学习模型;2.在浏览器中运行预先存在的TensorFlow模型;3.重新创建已有的模型;2019年的AutoML趋势我个人特别关注AutoML,为什么?因为我认为未来几年它将成为数据科学领域真正的游戏规则改变者。跟我有同样想法的人是H2O.ai的Marios Michailidis、Kaggle Grandmaster,他们都对AutoML有很高期望:机器学习继续成为未来最重要的趋势之一,鉴于其增长速度,自动化是最大化其价值的关键,是充分利用数据科学资源的关键。它可以应用到的领域是无限的:信用、保险、欺诈、计算机视觉、声学、传感器、推荐、预测、NLP等等,能够在这个领域工作是一种荣幸。AutoML趋势:提供智能可视化和解释,以帮助描述和理解数据;查找/构建/提取给定数据集的更好特征;快速建立更强大/更智能的预测模型;通过机器学习可解释性弥补这些模型的黑匣子建模和生产之间的差距;促进这些模型落地生产;5、强化学习如果我不得不选择一个我看到的渗透更多领域的技术,那就是强化学习。除了不定期看到的头条新闻之外,我还在社区中了解到,它太注重数学,并且没有真正的行业应用程序可供专一展示。虽然这在某种程度上是正确的,但我希望看到的是明年更多来自RL的实际用例。我在每月GitHub和Reddit排序系列中,我倾向于至少保留一个关于RL的存储库或讨论,至少围绕该主题的讨论。OpenAI已经发布了一个非常有用的工具包,可以让初学者从这个领域开始。OpenAI在深度强化学习中的应用如果RL的研究进展缓慢,那么围绕它的教育材料将会很少。但事实上,OpenAI已经开放了一些关于这个主题的精彩材料。他们称这个项目为“Spinning Up in Deep RL”,你可以在这里阅读所有相关内容。它实际上是非常全面RL的资源列表,这里有很多材料包括RL术语、如何成为RL研究者、重要论文列表、一个记录完备的代码存储库、甚至还有一些练习来帮助你入门。如果你打算开始使用RL,那么现在开始!Google Dopamine为了加速研究并让社区更多的参与强化学习,Google AI团队开源了Dopamine,这是一个TensorFlow框架,旨在通过它来使更灵活和可重复性来构建RL模型。你可以在此GitHub存储库中找到整个训练数据以及TensorFlow代码(仅15个Python notebooks!)。这是在受控且灵活的环境中进行简单实验的完美平台,听起来像数据科学家的梦想。2019年强化学习趋势Xander Steenbrugge是DataHack Summit的代表,也是ArxivInsights频道的创始人,他非常擅长强化学习。以下是他对RL当前状态的看法以及2019年的预期:我目前看到RL领域的三个主要问题:样本复杂性(代理需要查看/收集以获得的经验数量);泛化和转移学习(训练任务A,测试相关任务B);分层RL(自动子目标分解);我相信前两个问题可以通过与无监督表示学习相关的类似技术来解决。目前在RL中,我们正在使用稀疏奖励信号训练深度神经网络,从原始输入空间(例如像素)映射到端到端方式的动作(例如,使用反向传播)。我认为能够促进强化学习快速发展的道路是利用无监督的表示学习(自动编码器、VAE、GAN)将凌乱的高维输入空间(例如像素)转换为低维“概念”空间。人工智能:符合伦理才更重要想象一下由算法统治的世界,算法决定了人类采取的每一个行动。这不是一个美好的场景,对吗?AI中的伦理规范是Analytics Vidhya一直热衷于讨论的话题。今年有相当多的组织因为Facebook的剑桥分析公司丑闻和谷歌内部普遍关于设计武器新闻丑闻而遭受危机。没有一个开箱即用的解决方案或一个适合所有解决方案来处理AI的伦理方面。它需要一种细致入微的方法,并结合领导层提出的结构化路径。让我们看看今年出现的重大政策:GDPR。GDPR如何改变游戏规则GDPR或通用数据保护法规肯定会对用于构建AI应用程序的数据收集方式产生影响。GDPR的作用是以确保用户可以更好地控制他们的数据。那么这对AI有何影响?我们可以想象一下,如果数据科学家没有数据(或足够数据),那么构建任何模型都会还没开始就失败。2019年的AI伦理趋势预期这是一个灰色的领域。就像我提到的那样,没有一个解决方案可以解决这个问题。我们必须聚集在一起,将伦理问题整合到AI项目中。那么我们怎样才能实现这一目标呢?正如Analytics Vidhya的创始人兼首席执行官Kunal Jain在2018年DataHack峰会上的演讲中所强调的那样:我们需要确定一个其他人可以遵循的框架。结束语有影响力!这是2018年来描述AI最佳的词汇。今年我成为ULMFiT的狂热用户,我也很期待BERT。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 17, 2019 · 1 min · jiezi

用最新NLP库Flair做文本分类

摘要: Flair是一个基于PyTorch构建的NLP开发包,它在解决命名实体识别(NER)、部分语音标注(PoS)、语义消歧和文本分类等NLP问题达到了当前的最高水准。它是一个建立在PyTorch之上的NLP框架。本文将介绍如何使用已有的和构建自定义的文本分类器。介绍文本分类是一种监督机器学习方法,用于将句子或文本文档归类为一个或多个已定义好的类别。它是一个被广泛应用的自然语言处理方法,在垃圾邮件过滤、情感分析、新闻稿件分类以及与许多其它业务相关的问题中发挥着重要作用。目前绝大多数最先进的方法都依赖于一种被称为文本嵌入的技术。它将文本转换成高维空间中的数值表示方式。它可以将文档、语句、单词、字符(取决于我们所嵌入的形式)表示为这个高维空间中的一个向量。Flair之所以对NLP来说是一个令人兴奋的消息,是因为Zalando Research最近发表的一篇论文《Contextual String Embeddings for Sequence Labelling(用于序列标注的上下文相关字符串的嵌入)》,其中涵盖了一种始终优于以前最先进方案的方法。该算法在Flair中得到了完整的支持和实现,可以用来构建文本分类器。1、准备安装Flair需要Python 3.6,如果你还没有,请点击这里查看安装向导。然后执行pip命令安装即可:pip install flair上面的命令将安装运行Flair所需的所有依赖包,当然也包括了PyTorch。2、使用一个预训练的分类模型最新的0.4版本包含了两个预训练的模型,还有一个基于IMDB数据集上训练的情感分析模型和“攻击性语言检测”模型(当前仅支持德语)。使用、下载和存储模型都被整合到了一个单一的方法中,这使得使用预训练模型的整个过程都非常简单。要使用情感分析模型,只需执行以下代码片段:fromflair.models import TextClassifierfrom flair.data import Sentenceclassifier = TextClassifier.load(’en-sentiment’)sentence = Sentence(‘Flair is pretty neat!’)classifier.predict(sentence)# print sentence with predicted labelsprint(‘Sentence above is: ‘, sentence.labels)当第一次运行时,Flair将下载情感分析模型,默认情况下将其存储到home目录下的.flair子目录中,这大概得需要几分钟。上面的代码首先加载必需的库,然后将情感分析模型加载到内存中(必要时先进行下载),接下来可以预测句子“Flair is pretty neat!”的情感数值,按0到1的区间赋值。最后命令的输出结果是:The sentence above is: [Positive (1.0)]就是这么简单!例如,现在你可以将上述代码合并在一个REST API中,并提供一个与Google的云自然语言API的情感分析类似的服务,当在有大量请求的生产环境中使用时,这种分析的成本将会非常的高。3、训练一个自定义文本分类器要训练一个自定义的文本分类器,我们首先需要一个标注过的数据集。Flair的分类数据集格式基于Facebook的FastText格式。格式要求在每行的开头定义一个或多个标签,以前缀__label__开头。格式如下:label<class_1><text>label<class_2><text>在本文中,我们将利用Kaggle的Spam Detection数据集通过Flair构建一个垃圾/非垃圾的分类器。这个数据集比较适合我们的学习任务,因为它足够小,并且仅包含5572行的数据,可以在一个CPU上只花几分钟就可以完成一个模型的训练。来自数据集中的标记为spam(垃圾邮件)或ham(非垃圾邮件)的SMS信息3.1 预处理-构建数据集我们首先从Kaggle上的这个链接下载数据集来获得spam.csv文件。然后,在与数据集相同的目录中,我们运行下面的预处理代码片段,该代码将执行一些预处理,并将数据集拆分为训练集、开发集和测试集三个部分。确保安装了Pandas。如果还没有,请先运行命令:pip install pandasimport pandas as pddata = pd.read_csv("./spam.csv", encoding=‘latin-1’).sample(frac=1).drop_duplicates()data = data[[‘v1’, ‘v2’]].rename(columns={“v1”:“label”, “v2”:“text”})data[’label’] = ‘label’ + data[’label’].astype(str)data.iloc[0:int(len(data)*0.8)].to_csv(’train.csv’, sep=’\t’, index = False, header = False)data.iloc[int(len(data)*0.8):int(len(data)*0.9)].to_csv(’test.csv’, sep=’\t’, index = False, header = False)data.iloc[int(len(data)*0.9):].to_csv(‘dev.csv’, sep=’\t’, index = False, header = False);上面的代码将从数据集中删除一些重复数据,并对其进行无序处理(随机化行),并按照80/10/10的比例将数据拆分为训练集、开发集和测试集。如果运行成功,你将会得到FastText格式的三个数据文件:train.csv、test.csv和dev.csv,它们可以与Flair一起使用。3.2 训练自定义文本分类模型请在生成数据集的目录中运行以下代码片段用以训练模型:fromflair.data_fetcher import NLPTaskDataFetcherfrom flair.embeddings import WordEmbeddings, FlairEmbeddings, DocumentLSTMEmbeddingsfrom flair.models import TextClassifierfrom flair.trainers import ModelTrainerfrom pathlib import Pathcorpus = NLPTaskDataFetcher.load_classification_corpus(Path(’./’), test_file=‘test.csv’, dev_file=‘dev.csv’, train_file=‘train.csv’)word_embeddings = [WordEmbeddings(‘glove’), FlairEmbeddings(’news-forward-fast’), FlairEmbeddings(’news-backward-fast’)]document_embeddings = DocumentLSTMEmbeddings(word_embeddings, hidden_size=512, reproject_words=True, reproject_words_dimension=256)classifier = TextClassifier(document_embeddings, label_dictionary=corpus.make_label_dictionary(), multi_label=False)trainer = ModelTrainer(classifier, corpus)trainer.train(’./’, max_epochs=10)第一次运行上述代码时,Flair将会自动下载需要的所有嵌入模型,这可能需要几分钟,然后接下来的整个培训过程还需要大约5分钟。程序首先将所需的库和数据集加载到一个corpus对象中。接下来,我们创建一个嵌入列表,包含两个Flair上下文的字符串嵌入和一个GloVe单词嵌入。然后将此列表作为文档嵌入对象的输入。堆叠和文档嵌入是Flair中最有趣的概念之一,提供了将不同的嵌入整合在一起的方法。你可以同时使用传统的单词嵌入(如GloVe, word2vec, ELMo)和Flair上下文的字符串嵌入。在上面的例子中,我们使用了一种基于LSTM(Long Short-Term Memory,长短期记忆网络)的方法,将单词和上下文的字符串嵌入结合起来以生成文档嵌入。想要了解更多,请点击这里。最后,上述代码进行模型训练并生成了final-model.pt和best-model.pt两个文件,它们表示我们存储的训练模型。3.3 用训练过的模型进行预测我们现在可以从同一目录通过运行以下代码,使用导出的模型来生成预测结果:fromflair.models import TextClassifierfrom flair.data import Sentenceclassifier = TextClassifier.load_from_file(’./best-model.pt’)sentence = Sentence(‘Hi. Yes mum, I will…’)classifier.predict(sentence)print(sentence.labels)这段代码会输出“[ham(1.0)]”,这意味着该模型100%确定我们的示例消息不是垃圾邮件。与其它框架相比表现如何?与Facebook的FastText甚至谷歌的AutoML自然语言平台不同,使用Flair进行文本分类仍然是一项底层的工作。我们可以通过设置诸如学习率、批量大小、退火因子(anneal factor)、损失函数、优化选择等参数来完全控制文本嵌入和训练的方式…为了获得最佳表现,需要调整这些超参数。Flair为我们提供了一个有名的超参数调优库Hyperopt的封装器,我们可以使用它来对超参数进行调优以获得最佳的性能。在本文中,为了简单起见,我们使用了默认的超参数。在大多数默认参数下,我们的Flair模型在10个训练周期后获得了0.973的f1-score。为了进行对比,我们使用FastText和AutoML自然语言平台训练了一个文本分类模型。首先我们使用默认参数运行FastText,并获得了0.883的f1-score,这意味着模型在很大程度上优于FastText。然而,FastText只需要几秒钟的训练时间,而我们训练的Flair模型则需要5分钟。我们将结果与在谷歌的AutoML自然语言平台上获得的结果进行了比较。平台首先需要20分钟来解析数据集。之后,我们开始了训练过程,这几乎花了3个小时完成,但却获得了99.211的f1-score——这比我们自己训练的模型稍微好一点。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

January 9, 2019 · 1 min · jiezi

CS224n学习笔记1——深度自然语言处理

一、什么是自然语言处理呢?自然语言处理是计算机科学家提出的名字,本质上与计算机语言学是同义的,它跨越了计算机学、语言学以及人工智能学科。自然语言处理是人工智能的一个分支,在计算机研究领域中,也有其他的分支,例如计算机视觉、机器人技术、知识表达和推理等。目标:让计算机能够理解人类语言来完成有意义的任务,例买东西或者是更高级的目标等。下图是人对语言层次的传统描述:从输入开始,而输入部分通常是语音输入,接着大脑就会进行语音和音义分析。也有部分是文字输入,而文字输入基本上和语言学没多大关系,OCR对文本进行文字识别操作。自然语言处理应用的领域:1.拼写检查或者是手机上的自动填写功能属于初级的语义理解任务2.在线搜索时,联想到的同义词,例如搜索某家公司名字就会出现一大堆的推荐,也是属于语言处理方面。3.让计算机能够阅读文字,提取信息,从而充分理解文本,或者也可以处理更高难度的任务,例如判定文档的阅读难度或者是目标受众群体等。4.机器翻译5.构建口语对话系统二、什么是深度学习?深度学习是机器学习的一个分支,总的来说,就是让计算机自动学习,而不是人工教授,手工代码告诉它想要做什么,类似于传统的编程。深度学习不同于以往年代的机器学习,例如80年代、90年代或者是00年代的机器学习。核心区别:对于大多数的机器学习而言,都是围绕着决策树、逻辑回归、朴素贝叶斯、支持向量机等概念。本质区别:由人类来审视一个特定的问题,找出解决该类问题的关键要素,然后涉及出与该问题相关的重要特征要素。通常使用python代码来识别这些特征。例如下图,显示了一些实体识别系统的特征:、机器学习和深度学习的区别?上图中可以发现,机器学习在实际应用中,大约90%的工作是人类研究如何描述数据,总结出重要特征,只有约10%的工作是大脑运行这一个数值优化算法。深度学习是表征学习的一个分支, 表征学习的理念就是只向电脑提供来自外界的原始信号,无论是视觉还是语言信号,然后电脑自动得出好的中间表征,来很好地去完成任务。从某种意义上来说,就是自己定义特征,和以往人类定义特征类似的方式。深度学习的真正含义是:得到了多层的习得表征,可以打败其他的学习方法。深度学习主要的两个突破:自然语言处理和计算机视觉。三、Deep NLP=Deep Learning + NLP一方面深度学习应用到各种不同层次的语言学上,例如词汇学、句法学、语义学。应用于各种不同类型的工具和算法的自然语言处理,例如为单词标注词性、识别人物姓名和结构名字、找出句子的句法结构。此外还被应用在其他的语言应用程序,结合各部分功能,例如机器翻译、情感分析的聊天助手等。深度学习模式运用同样一套工具和技术,非常统一的方法来处理各个领域的问题。参考资源:斯坦福大学 自然语言处理课程

January 5, 2019 · 1 min · jiezi

机器学习与数据挖掘之旅

NLPjava版JieBa分词源码走读 HMM(隐马尔科夫模型)与维特比算法模式识别模式识别中的Apriori算法和FPGrowth算法文本获取与搜索引擎文本获取和搜索引擎简介 文本获取与搜索引擎中的TF,TF-IDF 文本获取和搜索引擎如何评估一个算法是否有效 文本获取和搜索引擎的概率模型 文本获取和搜索引擎中的反馈模型 文本获取和搜索引擎之推荐系统

January 1, 2019 · 1 min · jiezi

迁移学习NLP:BERT、ELMo等直观图解

摘要: 图解,2018年自然语言处理领域最成功的方向!2018年是自然语言处理的转折点,能捕捉潜在意义和关系的方式表达单词和句子的概念性理解正在迅速发展。此外,NLP社区已经出现了非常强大的组件,你可以在自己的模型和管道中自由下载和使用(它被称为NLP的ImageNet时刻)。在这个时刻中,最新里程碑是发布的BERT,它被描述NLP一个新时代的开始。BERT是一个模型,它打破了前几个模型处理基于语言的任务的记录。该模型的论文发布后不久,团队还开放了该模型的代码,并提供了已经在大量数据集上预先训练过的模型的下载版本。这是一个重大的发展,因为它使任何人都可以构建一个涉及语言处理的机器学习模型,他们成功的将这个强大的工具变成了一个易于使用的组件,从而节省了训练NLP模型所需的时间,精力和资源。BERT是建立在最近NLP社区中涌现的一些聪明的想法之上,包括但不限于半监督序列学习(Andrew Dai和Quoc Le)、<u style=“box-sizing: border-box;">ELMo</u>(由Matthew Peters和来自AI2的研究人员和UW CSE),ULMFiT(由fast.ai创始人Jeremy Howard和Sebastian Ruder提供)和OpenAI转换器(由OpenAI研究人员Radford,Narasimhan,Salimans和Sutskever提供)和Transformer(Vaswani等人)。需要注意的一些概念才能完全了解BERT的内容。因此,让我们首先看一下在查看模型本身所涉及的概念之前可以使用BERT的场景。示例:句子分类BERT最擅长的是分类单个文本,这个模型看起来像这样:为了训练这样的模型,你必须训练分类器,在训练阶段BERT模型发生的变化很小。该过程称为微调,并且整个过程是源于半监督序列学习和ULMFiT。既然我们在讨论分类器,那么我们就处于机器学习的监督学习领域。这意味着我们需要一个标记的数据集来训练这样的模型。以垃圾邮件分类器示例,标记的数据集将是电子邮件和标签的列表(“垃圾邮件”或“非垃圾邮件”)。这种用例的其他示例包括:1、情绪分析输入:电影/产品评论。输出:评论是正面还是负面?示例数据集:SST2、事实查证输入:句子。输出:“索赔”或“不索赔”更夸张/前沿的例子:输入:是否进行索赔。输出:“真”或“假”Full Fact是一个为公众利益建立自动事实检查工具的组织。他们的部分管道其实是一个分类器,它可以读取新闻文章并检测声明(将文本分类为“声明”或“不声明”),以此进行事实验证。模型架构现在你已经了解了如何使用BERT的用例,接下来让我们仔细看看它是如何工作的。首先介绍BERT的两种型号:l BERT BASE:与OpenAI Transformer的尺寸相当,性价比很高;l BERT LARGE:一个非常庞大的模型,它的性能最好;BERT基本上是训练有素的转换器(Transformer)编码器堆栈。现在是你阅读The Illustrated Transformer的好时机,该文章解释了Transformer模型-BERT的基本概念以及我们接下来要讨论的概念。两种BERT模型都有大量的编码器层(本文称之为Transformer Blocks),其中Base版本为12个,Large版本为24个。它们还具有更大的前馈网络(分别为768和1024个隐藏单元)以及比初始论文中的转换器更多attention heads(分别为12和16)(初始论文的转换器中有6个编码器层,512个隐藏单元,和8个attention heads)。模型输入第一个接口输入提供了一个特殊的接口[CLS],原因将在后面变得明显,CLS在这里代表分类。就像转换器的香草编码器一样,BERT采用一系列字作为输入。每一层都应用自我关注,并通过前馈网络传递其结果,然后将其交给下一个编码器。在架构方面,到目前为止,这与转换器完全相同。模型输出每个位置输出大小为hidden_size的矢量(BERT Base中的768)。对于我们上面看过的句子分类示例,我们只关注第一个位置的输出(我们将特殊的接口[CLS]标记传递到)。该向量现在可以用作我们选择的分类器的输入,通过使用单层神经网络作为分类器,这样效果就能达到我们想要的。如果你有更多标签(例如,如果你是使用“垃圾邮件”,“非垃圾邮件”,“社交”和“促销”标记电子邮件),你只需调整分类器网络以获得更多输出神经元即可,然后通过softmax。卷积网相似操作对于那些具有计算机视觉背景的人来说,这个矢量切换应该让人联想到VGGNet等网络的卷积部分与网络末端的完全连接的分类部分之间发生的事情。嵌入(Embedding)的新时代到目前为止,词嵌入一直是影响NLP模型处理语言的主要力量。Word2Vec和Glove等方法已被广泛用于此类任务。让我们回顾一下之前是如何使用它们的。Word嵌入是个啥?对于要由机器学习模型处理的词,它们需要以某种形式的数字表示,这样模型才可以在计算中使用。Word2Vec让我们可以使用一个向量(一个数字列表)以一种捕获语义相关关系的方式正确表示单词(例如,判断单词是相似的,判断还是在它们之间具有的关系,如“开罗”和“埃及”之间的关系)以及句法或基于语法的关系(例如“was”和“is”之间的关系)。该领域的研究者很快意识到,使用经过大量文本数据预训练的嵌入技术,而不将模型与经常是小型数据集的模型一起训练,这是一个好主意。因此,你可以下载Word2Vec或GloVe预训练生成的单词列表及其嵌入。ELMo:语境问题如果我们使用GloVe,那么“stick”这个词将由一个向量表示,无论上下文是什么。但是,许多NLP研究人员(Peters等人,2017年,McCann等人,2017年及Peters等人,2018年在ELMo论文中)发现“stick”有多个含义,这取决于它的使用位置。为什么不根据它所使用的上下文给它一个嵌入呢?这样既捕获该上下文中的单词含义以及其他上下文信息。因此,语境化嵌入词诞生了!语境化词嵌入可以根据它们在句子的上下文中携带的含义给出单词不同的嵌入ELMo不是对每个单词使用固定嵌入,而是在为其中的每个单词分配嵌入之前查看整个句子,它使用在特定任务上训练的双向LSTM来创建这些嵌入。ELMo在NLP背景下向预训练迈出了重要一步。ELMo LSTM将使用我们数据集语言中的大量数据集进行训练,然后我们可以将其用作需要处理语言的其他模型中的组件。ELMo的秘密是什么?ELMo通过训练来预测单词序列中的下一个单词,这是一项称为获得语言理解语言建模的任务。这很方便,因为我们拥有大量的文本数据,这样的模型可以在不需要标签的情况下学习。我们可以看到每个展开的LSTM步骤的隐藏状态都是从ELMo的头部后面突出。在完成预训练之后,这些在嵌入式proecss可以派上用场。ELMo实际上更进一步,因为双向LSTM,这意味着它的语言模型不仅具有下一个词的感觉,而且还有前一个词。ELMo通过以某种方式将隐藏状态(和初始嵌入)组合在一起来提出情境化嵌入(连接后加权求和)。ULM-FiT:在NLP中使用迁移学习ULM-FiT引入了有效利用模型在预训练期间学到的内容的方法,这不仅仅是嵌入,而且是上下文嵌入。ULM-FiT引入了语言模型和流程,从而有效地微调该语言模型以执行各种任务。NLP可能与计算机视觉一样,有了一种方法来进行转移学习。The Transformer:超越LSTMsTransformer论文和代码的发布,以及它在机器翻译等任务上取得的成果开始让一些人认为它们是LSTM的替代品。事实上Transformer比LSTM更好地处理长期依赖性。Transformer的编码器-解码器结构使其非常适合机器翻译。但是你如何将它用于句子分类?你如何使用它来预训练可以针对其他任务进行微调的语言模型(这些任务就是被该领域称为使用预训练模型或组件的监督学习任务)。OpenAI Transformer:预训练用于语言建模的Transformer解码器事实证明,我们不需要整个Transformer来为NLP任务采用转移学习和精细可调语言模型,我们可以只使用Transformer的解码器。解码器是一个很好的选择,因为它是语言建模(预测下一个单词)的必备选择,它是为掩盖未来的接口而构建的。该模型堆叠了十二个解码器层。由于在该设置中没有编码器,因此这些解码器层将不具有香草Transformer解码器层具有的编码器。然而,它仍然会有自我关注层。通过这种结构,我们可以继续在同一语言建模任务上训练模型:使用大量(未标记)数据集预测下一个单词。只是使用7000本书的文字,让它学习!书籍非常适合这类任务,因为它允许模型学习关联相关信息,即使它们被大量文本分开。例如,当你使用推文或文章进行训练时,你无法获得这些信息。现在,OpenAI Transformer已经准备好接受训练,预测由7,000本书组成的数据集上的下一个单词。将学习能力转移到下游任务既然OpenAI Transformer已经过预先训练,并且其层也经过调整以合理地处理语言,我们就可以开始将它用于下游任务。让我们首先看一下句子分类(将电子邮件分类为“垃圾邮件”或“非垃圾邮件”):OpenAI论文概述了许多输入转换,以处理不同类型任务的输入。下图显示了模型的结构和输入转换,以执行不同的任务。BERT:从解码器到编码器openAI的Transformer为我们提供了基于Transformer的可调预训练模型。但是从LSTM到Transformer的过渡中缺少了一些东西,因为ELMo的语言模型是双向的,但openAI的Transformer只训练向前语言模型。我们能否建立一个基于Transformer的模型,其语言模型同时向前和向后?蒙面语言模型(NLM:Masked Language Model)“我们将使用Transformer编码器”,BERT说。“这很疯狂”,Ernie回答说,“每个人都知道双向调节会让每个词在多层次的背景下间接地审视自己。”“我们将使用蒙面工具”,BERT自信地说。找到正确的任务来训练Transformer堆栈的编码器是一个复杂的障碍,BERT通过采用早期文献中的“蒙面语言模型”概念(称为完成任务)来解决。除了掩盖15%的输入之外,BERT还混合了一些东西,以改善模型后来如何微调。有时它会随机用另一个单词替换一个单词,并要求模型预测该位置的正确单词。两个句子的任务(Two-sentence Tasks)如果你回顾一下OpenAI的Transformer处理不同任务的输入变换,你会注意到一些任务要求模型具有说出两个句子的能力(例如,它们是否只是对方的复述?给出一个维基百科条目作为输入,以及关于该条目作为另一个输入的问题。)。为了使BERT更好地处理多个句子之间的关系,预训练过程包括一个额外的任务:给定两个句子(A和B),B可能是跟随A的句子,或不是?特定任务-模型BERT论文展示了将BERT用于不同任务的多种方法。BERT用于特征提取微调不是使用BERT的唯一方法。就像ELMo一样,你可以使用预先训练的BERT来创建语境化词嵌入。然后,你可以将这些嵌入提供给现有模型-该过程论文已经证实可以产生结果,在命名实体识别等任务上应用微调BERT并不远。哪个向量最适合作为上下文嵌入?我认为这取决于任务。我们考察了六种选择(与微调模型相比,得分为96.4):BERT延伸使用BERT的最佳方式是通过BERT FineTuning与Google Colab托管的Cloud TPU笔记本。如果你之前从未使用过云TPU,那么这也是尝试它们的良好起点,以及BERT代码也适用于TPU,CPU和GPU。下一步是查看BERT仓库中的代码:l 该模型在modeling.py(class BertModel)中构建,与vanilla Transformer编码器完全相同。l run_classifier.py是微调过程的一个示例。它还构建了监督模型的分类层,如果要构建自己的分类器,请查看create_model()该文件中的方法。l 可以下载几种预先训练的模型,它们跨越了BERT Base和BERT Large,以及英语,中文等语言,以及涵盖102种语言的多语言模型,这些语言在维基百科上进行了训练。l BERT不会将单词视为标记,相反,它注意者WordPieces。tokenization.py是将你的单词转换为适合BERT的wordPieces的标记器。l 你还可以查看BERT的PyTorch实现。该AllenNLP库使用此实现允许使用的嵌入BERT与任何模型。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 13, 2018 · 1 min · jiezi

一文了解自然语言处理神经史(下)

摘要: 越来越火的NLP到底经历了什么?2014年-序列到序列模型2014年,Sutskever等人提出序列到序列学习,一种通过神经网络将一个序列映射到另一个序列的通用框架。在该框架中,编码器神经网络逐个符号地处理句子并将其压缩成矢量表示; 然后,解码器神经网络基于编码器状态逐个符号地预测输出符号,在每个步骤中将先前预测的符号作为输入,如下面的图8所示。机器翻译成了这个框架的杀手级应用。2016年,谷歌宣布开始用NMT模型替换其基于单片短语的MT模型(Wu et al.,2016)。根据Jeff Dean的说法,这意味着用500线性神经网络模型替换500,000行基于短语的MT代码。由于其灵活性,该框架现在是自然语言生成任务的首选框架,不同的模型承担编码器和解码器的角色。重要的是,解码器模型不仅可以以序列为条件,而且可以以任意表示为条件。这使得例如基于图像生成标题(Vinyals等人,2015)(如下面的图9中可见),基于表格的文本(Lebret等人,2016),以及基于源代码更改的描述(Loyola等,2017),以及许多其他应用程序。序列到序列学习甚至可以应用于NLP中常见的结构化预测任务,其中NLP输出具有特定结构。简单地说,输出是线性化的,如下面图10中的consituency解析所示。神经网络已经证明了在给予consituency解析的足够数量的训练数据(Vinyals等,2015)和命名实体识别(Gillick等,2016)等的情况下,能够直接学习产生这种线性化输出的能力。用于序列和解码器的编码器通常基于RNN,但是也可以使用其他模型类型,最新的架构主要来自作为序列到序列架构的培养皿MT的工作。最近的模型是卷积编码器(Kalchbrenner等,2016; Gehring等,2017),变换器(Vaswani等,2017),将在下一个部分讨论,以及LSTM和变压器的组合(Chen等,2018)。2015-注意力注意力(Bahdanau等,2015)NMT)的核心创新之一,也是使NMT模型优于基于经典短语的MT系统的关键思想。序列到序列学习的主要瓶颈是它需要将源序列的整个内容压缩成固定大小的矢量。注意力通过允许解码器回顾源序列隐藏状态来减轻这种情况,然后将其作为加权平均值提供给解码器的附加输入,如下面的图11所示。注意力有不同的形式(Luong等,2015)在这里查看简要概述。 注意力广泛适用并且可能对任何需要根据输入的某些部分做出决策的任务有用。它已被应用于consituency解析(Vinyals等,2015),阅读理解(Hermann等,2015)和一次性学习(Vinyals等,2016)等。甚至输入不需要是序列,但可以包括其他表示,如图像字幕的情况(Xu et al.,2015),可以在下面的图12中看到。注意力的一个有用的副作用是,通过根据注意力量检查输入的哪些部分与特定输出相关。注意力也不仅限于查看输入序列;自-注意力可用于查看句子或文档中的周围单词以获得更多上下文敏感的单词表示。多层自-注意力是Transformer架构的核心(Vaswani等,2017),这是目前最先进的NMT模型。2015-基于记忆的网络注意力可以看作是模糊记忆的一种形式,其中记忆由模型的过去隐藏状态组成,模型选择从记忆中所检索的内容。有关注意事项及其与记忆关联的更详细概述,请查看此文章。许多具有更明确记忆的模型已经被提出,它们有不同的变体,例如神经网络图灵机(Graves et al,2014),记忆网络(Weston et al.,2015)[70]和端到端的记忆网络(Sukhbaatar et al.,2015),动态记忆网络( Kumar等,2015),可微神经计算机(Graves等,2016)和递归实体网络(Henaff等,2017)。通常基于与当前状态的相似性来访问内存,类似于注意力,并且通常可以写入和读取存储器,模型在实现和利用内存方面有所不同。例如,端到端记忆网络多次处理输入并更新内存以启用多个推理步骤。神经图灵机还具有基于位置的寻址,允许它们学习简单的计算机程序,如排序。基于记忆的模型通常应用于其中保留较长时间跨度信息的有用任务,例如语言建模和阅读理解。存储器的概念非常通用:知识库或表可以用作存储器,而存储器也可以基于整个输入或其特定部分来填充。2018年 - 预训练语言模型预训练的词嵌入与上下文无关,而且仅用于初始化模型中的第一层。最近几个月,一系列监督任务被用于预训练神经网络(Conneau等,2017; McCann等,2017; Subramanian等,2018)。相比之下,语言模型只需要未标记的文本; 因此,训练可以扩展到数十亿个tokens,新领域和新语言。 2015年首次提出了预训练语言模型(Dai&Le,2015); 直到最近,它们才被证明对各种各样的任务都有益。 语言模型嵌入可以用作目标模型中的特征(Peters等,2018),或者可以对目标任务数据微调语言模型(Ramachandran等,2017; Howard&Ruder,2018)。添加语言模型嵌入比许多任务的最新技术有了很大的改进,如下面的图13所示。预训练语言模型可以用更少的数据进行学习,由于语言模型仅需要未标记的数据,因此对于标记数据稀缺的低资源语言尤其有用。有关预训练语言模型的更多信息,请参阅本文。其他里程碑基于字符的表示:在字符上使用CNN或LSTM来获得基于字符的词表示是相当普遍的,特别是对于形态学丰富的语言和形态信息很重要或具有许多未知单词的任务。据我所知,基于字符的表示首先用于序列标记(Lample等,2016; Plank等,2016)。基于字符的表示减少了必须以增加计算成本处理固定词汇表的需要,并且能够实现诸如完全基于字符的NMT之类的应用(Ling等人,2016; Lee等人,2017)。对抗性学习:对抗性方法已经在风暴中占据了ML的领域,并且在NLP中也以不同的形式使用。对抗性示例越来越广泛地被广泛使用,不仅作为探测模型和理解其失败案例的工具,而且还使它们更加具有鲁棒性(Jia&Liang,2017)。对抗性训练:域对抗性损失(Ganin等,2016; Kim等,2017)是可以同样使模型更加健壮的有用的正规化形式。生成对抗网络(GAN)对于自然语言生成来说还不是太有效(Semeniuta等,2018),但是例如在匹配分布时是有用的(Conneau等,2018)。强化学习:强化学习已经被证明对于具有时间依赖性的任务是有用的,例如在训练期间选择数据(Fang等,2017; Wu等,2018)和建模对话(Liu等,2018)。RL对于直接优化诸如ROUGE或BLEU之类的非可微结束度量而不是优化替代损失(例如摘要中的交叉熵(Paulus等,2018; Celikyilmaz等,2018)和机器翻译也是有效的。(Ranzato等人,2016),反向强化学习在犒赏太复杂而无法指定的环境中可能是有用的,例如视觉叙事(Wang et al。,2018)。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

November 29, 2018 · 1 min · jiezi