回顾-AI全栈成长计划-AI应用篇,—自然语言处理

网友投稿 667 2022-05-29

神经网络语言模型发展

语言模型

NLP里面做预训练一般的选择是用语言模型任务来做。

语言模型就是用来计算一个句子的概率的模型,也就是判断一句话是否是人说出来的自然句子的概率。

语言模型包括文法语言模型和统计语言模型,我们一般使用统计语言模型。常见的统计语言模型有N元文法模型(N-gram Model)。

语言模型可以捕捉到词的上下文信息。

词向量(word embedding)

词向量是为了解决自然语言处理领域的文字信息表示问题。在图像领域,使用图片的像素构成的矩阵展平成 vector 作为神经网络的输入;在语音领域,用音频频谱序列向量构成的矩阵作为神经网络的输入;在自然语言处理领域,将每个词映射成一个向量编码,作为神经网络的输入。

词向量的核心问题是上下文与目标词之间的关系建模。比较热门的使用语言模型做 Word Embedding 的工具有 Word2Vec 和 Glove。

ELMO

由于Word Embedding无法解决多义词问题,Word Embedding本质是一个静态的方式,不会根据上下文的改变而变化。所以引出ELMO(Embedding from Language Models),ELMO提供了一种简洁优雅的解决方案。

ELMO的本质思想是:事先用语言模型学好一个单词的 Word Embedding,此时多义词无法区分,在实际使用 Word Embedding 的时候,单词已经具备了特定的上下文,这个时候可以根据上下文单词的语义去调整单词的 Word Embedding 表示,这样经过调整后的 Word Embedding 更能表达在这个上下文中的具体含义。所以 ELMO 本身是个根据当前上下文对 Word Embedding 动态调整的思路。

ELMO 采用了典型的两阶段过程,第一个阶段是利用语言模型进行预训练;第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的 Word Embedding 作为新特征补充到下游任务中。

GPT

GPT(Generative Pre-Training),其含义是指的生成式的预训练。

与 ELMO 类似,GPT也采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过 Fine-tuning 的模式解决下游任务。

GPT 的预训练虽然仍然是以语言模型作为目标任务,但是采用的是单向的语言模型,单向的含义是指:只使用单词的上文来进行预测,而抛开了下文。因此也限制了其在更多应用场景的效果,比如阅读理解这种任务,在做任务的时候是可以允许同时看到上文和下文一起做决策的。

NNLM

NNLM(神经网络语言模型),通过为每个单词学习一个分布式表征来实现在连续空间上的建模。

第一个 NNLM——前馈神经网络语言模型(FFNNLM)由 Bengio 等人于 2003 年提出,其性能要优于 N 元语言模型。随后,Mikolov 等人于 2010 年提出了 RNN 语言模型(RNNLM)。从那时起,NNLM 逐渐成为了主流的语言模型,并得到了迅速发展。

2012 年,Sundermeyer 等人提出了长短期记忆循环神经网络语言模型(LSTM-RNNLM)用于解决学习长期依赖的问题。为了降低训练、评估以及 PPL 的开销,人们提出了各种各样的改进方案,例如分层的 Softmax、缓存模型等。近年来,为了改进 NNLM,人们引入了注意力机制(Attention),取得了显著的性能提升。

Transformer

Transformer 是个叠加的自注意力机制(Self Attention)构成的深度网络,是目前NLP里最强的特征提取器。Transformer 的结构由 encoder(编码)和 decoder(解码)组成。Transformer 详见论文《Attention is all you need》。

语料

人工智能的核心在于数据支持。对AI有一些接触之后,我们可以知道,无论模型性能再高,都离不开大量数据作为基础。

业务提供的已有语料

国内外标准开放数据集

通过爬虫抓取网络数据(合法情况下)

在获取语料的基础上,另一个重要的步骤是语料的预处理。语料的质量直接影响模型的训练性能,噪声很大、与任务无关的语料需要进过一系列预处理工作才可以被使用。在一个完整的中文自然语言处理工程应用中,语料预处理大概会占到50%-70%的工作量。

常用的语料预处理方式包括:去除不规则符号及格式,人工去重、对齐、删除和标注等,或者规则提取内容、正则表达式匹配、根据词性和命名实体提取、编写脚本或者代码批处理等。

实验环境准备

具体操作步骤:

登陆ModelArts控制台https://www.huaweicloud.com/product/modelarts.html -> 开发环境 -> Notebook -> 创建

名称     自定义

工作环境     Python3

资源池     选择\"公共资源池\"即可

类型     GPU

规格     [限时免费]体验规格GPU版或算力更好的计费版本

存储配置     EVS

磁盘规格     5GB

创建Notebook

可以选择免费的版本,但是免费的要排队哦~点击下一步

创建步骤我就直接省略了,直接启动以及创建好的,初次创建只要选择好GPU一般都不会出现什么问题,如果选择cpu可能会出现内存耗尽的问题,所以建议选择GPU~

点击打开后,点击右上角的"New",然后创建TensorFlow-1.13.1开发环境

点击左上方的文件名"Untitled",并输入一个与本实验相关的名称,自定义

在Notebook中,我们输入一个简单的打印语句,然后点击上方的运行按钮,可以查看语句执行的结果:"如果未输出结果,则环境还没准备好,稍等一下在试试,还不能输出结果,则重新创建环境

实验环境准备好,那就进行下一步

# 导入jieba import jieba print("jieba导入成功")

待分词语句1:明天我要去五棵松体育场打篮球

待分词语句2:华为联手中国电信,完成了武汉火神山医院首个远程会诊平台的网络铺设和设备调试

jieba.cut,当cut_all=True时,为全模式

# 待分词语句 seg_text_1 = "明天我要去五棵松体育场打篮球" seg_text_2 = "华为联手中国电信,完成了武汉火神山医院首个远程会诊平台的网络铺设和设备调试" print("待分词语句1:" + seg_text_1) print("\n待分词语句2:" + seg_text_2)

# 全模式 seg_1_1 = jieba.cut(seg_text_1, cut_all=True) seg_1_2 = jieba.cut(seg_text_2, cut_all=True) print("全模式1:" + "/ ".join(seg_1_1)) print("\n全模式2:" + "/ ".join(seg_1_2))

# 精确模式 seg_2_1 = jieba.cut(seg_text_1, cut_all=False) seg_2_2 = jieba.cut(seg_text_2, cut_all=False) print("精确模式1:" + "/ ".join(seg_2_1)) print("\n精确模式2:" + "/ ".join(seg_2_2))

# 搜索引擎模式 seg_3_1 = jieba.cut_for_search(seg_text_1) seg_3_2 = jieba.cut_for_search(seg_text_2) print("搜索引擎模式1:" + "/ ".join(seg_3_1)) print("\n搜索引擎模式2:" + "/ ".join(seg_3_2))

# 返回全模式列表 seg_4_1 = jieba.lcut(seg_text_1, cut_all=True) seg_4_2 = jieba.lcut(seg_text_2, cut_all=True) print("返回全模式列表1:{0}".format(seg_4_1)) print("\n返回全模式列表2:{0}".format(seg_4_2))

# 返回精确模式列表 seg_5_1 = jieba.lcut(seg_text_1, cut_all=False) seg_5_2 = jieba.lcut(seg_text_2, cut_all=False) print("返回精确模式列表1:{0}".format(seg_5_1)) print("\n返回精确模式列表2:{0}".format(seg_5_2))

关键词提取

from jieba import analyse # 原始文本 anal_text = "天安门广场,位于北京市中心,地处北京市东城区东长安街,北起天安门,南至正阳门,东起中国国家博物馆,西至人民大会堂,南北长880米,东西宽500米,面积达44万平方米,可容纳100万人举行盛大集会,是世界上最大的城市广场。广场地面全部由经过特殊工艺技术处理的浅色花岗岩条石铺成,中央矗立着人民英雄纪念碑和庄严肃穆的毛主席纪念堂,天安门两边是劳动人民文化宫和中山公园,与天安门浑然一体,共同构成天安门广场。" print("文本:", anal_text)

# 引入TF-IDF关键词抽取接口 tfidf = analyse.extract_tags print("TF-IDF算法提取的20个关键词:\n") # 基于TF-IDF算法进行关键词抽取 for x, w in tfidf(anal_text, withWeight=True): print('%s %s' % (x, w))

# 引入TextRank关键词抽取接口 textrank = analyse.textrank print("TextRank 算法提取的20个关键词:\n") # 基于TextRank算法进行关键词抽取 for x, w in textrank(anal_text, withWeight=True): print('%s %s' % (x, w))

词性标注

import jieba.posseg as pseg pseg_text = "天安门坐落在中华人民共和国首都北京市的中心、故宫的南端,占地面积4800平方米,以杰出的建筑艺术和特殊的政治地位为世人所瞩目。" print("文本:", pseg_text) words = pseg.cut(pseg_text) for word, flag in words: print("{} {}".format(word, flag))

分词

分词任务是中文自然语言处理的基础性工作。汉语是以字位单位,不像西方语言,词与词之间没有空格之类的标志指示词的边界。词是最小的能够独立活动的有意义的语言成分,因此分词的好坏直接对后续文本处理任务起到关键作用。

中文分词示例:

北京 / 故宫 / 是 / 中国 / 明清 / 两代 / 的 / 皇家 / 宫殿 / , / 旧称 / 紫禁城,位于 / 北京 / 中轴线 / 的 / 中心 / , / 是 / 中国 / 古代 / 宫廷 / 建筑 / 之 / 精华 / 。 / 北京 / 故宫 / 占地 / 面积 / 72 / 万 / 平方米 / , / 建筑 / 面积 / 约 / 15 / 万 / 平方米 / 。

中文分词方法:

基于字典、词库匹配的分词方法(基于规则)

基于字符串匹配分词,机械分词算法。将待分的字符串与一个充分大的机器词典中的词条进行匹配。分为正向匹配和逆向匹配;最大长度匹配和最小长度匹配;单纯分词和分词与标注过程相结合的一体化方法。所以常用的有:正向最大匹配,逆向最大匹配,最少切分法。

基于词频度统计的分词方法(基于统计)

相邻的字同时出现的次数越多,越有可能构成一个词语,对语料中的字组频度进行统计,基于词的频度统计的分词方法是一种全切分方法。

基于知识理解的分词方法

该方法主要基于句法、语法分析,并结合语义分析,通过对上下文内容所提供信息的分析对词进行定界。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式。因此目前基于知识的分词系统还处在试验阶段。

jieba 分词结合了基于规则和基于统计这两类方法。

首先基于前缀词典进行词图扫描,前缀词典是指词典中的词按照前缀包含的顺序排列,例如词典中出现了“广”,之后以“广”开头的词都会出现在这一部分,例如“广东”,进而会出现“广东省”,从而形成一种层级包含结构。

如果将词看作节点,词和词之间的分词符看作边,那么一种分词方案则对应着从第一个字到最后一个字的一条分词路径。

因此,基于前缀词典可以快速构建包含全部可能分词结果的有向无环图,这个图中包含多条分词路径,有向是指全部的路径都始于第一个字、止于最后一个字,无环是指节点之间不构成闭环。

基于标注语料,使用动态规划的方法可以找出最大概率路径,并将其作为最终的分词结果。对于未登录词,jieba 使用了基于汉字成词的 HMM(隐马尔可夫模型)模型,采用了 Viterbi(维特比)算法进行推导。

jieba 分词支持三种分词模式:

全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;

精确模式:试图将句子最精确地切开,适合文本分析;

搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

关键词提取

关键词提取就是从文本里面把跟这篇文章意义最相关的一些词语抽取出来,在文献检索、自动文摘、文本分类等方面有着重要的应用。

目前比较常用的关键词提取算法都是基于无监督算法,如:TF-IDF 算法,TextRank 算法和主题模型算法(包括LSA,LSI,LDA等)。

jieba 提供了两种关键词提取方法,分别基于 TF-IDF 算法和 TextRank 算法。

TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率)是一种统计方法,用以评估一个词语对于一个文件集或一个语料库中的一份文件的重要程度,其原理为:一个词语在一篇文章中出现次数越多,同时在所有文档中出现次数越少,越能够代表该文章。

计算公式为:TF-IDF = TF·IDF

其中:

TF(term frequency):词频,某一个给定的词语在该文件中出现的次数,计算公式:

IDF(inverse document frequency):逆文件频率,如果包含词条的文件越少,则说明词条具有很好的类别区分能力,计算公式:

通过 jieba.analyse.extract_tags 方法可以基于 TF-IDF 算法进行关键词提取,

其中topK为返回几个 TF/IDF 权重最大的关键词,默认值为 20 ;withWeight为是否需要返回关键词权重值。

TextRank是另一种关键词提取算法,其基本思想来源于PageRank算法,通过把文本分割成若干组成单元(单词、句子)并建立图模型,利用投票机制对文本中的重要成分进行排序,仅利用单篇文档本身的信息即可实现关键词提取、文摘。

TextRank原理详细内容参见论文《TextRank: Bringing Order into Texts》

通过jieba.analyse.textrank方法可以使用基于TextRank算法的关键词提取

词性标注

词性标注(POS tagging,Part-Of-Speech tagging)也被称为语法标注,是自然语言处理中一项非常重要的基础性工作。

词性标注是各类基于文本的机器学习任务,例如语义分析和指代消解的预处理步骤。

词性是词汇基本的语法范畴,通常也称为词类,主要用来描述一个词在上下文的作用。例如,描述一个概念的词就是名词,在下文引用这个名词的词就是代词。有的词性经常会出现一些新的词,例如名词,这样的词性叫做开放式词性。另外一些词性中的词比较固定,例如代词,这样的词性叫做封闭式词性。因为存在一个词对应多个词性的现象,所以给词准确地标注词性并不是很容易。例如,“改革”在“中国开始对计划经济体制进行改革”这句话中是一个动词,但是在“医药卫生改革中的经济问题”这个句子中是一个名词。把这个问题抽象出来,就是已知单词序列,给每个单词标注词性。

目前采用的词性标注方法主要有基于统计模型的标注方法、基于规则的标注方法、统计方法与规则方法相结合的方法、基于有限状态转换机的标注方法和基于神经网络的词性标注方法。

不同的语言有不同的词性标注集。为了方便指明词的词性,可以给每个词性编码,可以具体参考《ICTCLAS 汉语词性标注集》,示例如下:

a —— 形容词

b —— 区别词

c —— 连词

d —— 副词

e —— 叹词

g —— 语素字

h —— 前接成分

i —— 成语

j —— 简称

k —— 后接成分

m —— 数词

n —— 普通名词

nd —— 方位名词

nh —— 人名

ni —— 机构名

nl —— 处所名词

ns —— 地名

nt —— 时间词

nz —— 其他名词

o —— 拟声词

p —— 介词

q —— 量词

r —— 代词

u —— 助词

v —— 动词

x —— 非语素字

jieba 中提供了词性标注功能,可以标注标注句子分词后每个词的词性,词性标注集采用北大计算所词性标注集,属于采用基于统计模型的标注方法。

案例网页打开不了问题的解决方案如下

回顾-AI全栈成长计划-AI应用篇,—自然语言处理

首先我们通过视频学习之后,会有官方给的链接,复制之后打开如下图一,~因为复制粘贴少了一个符号-

复制粘贴后时(例子):https://nbviewer.jupyter.org/github/huaweicloud/ModelArtsLab/blob/master/notebook/DL_face_recognition_advanced/face_similarity.ipynb

然后打开:

https://nbviewer.jupyter.org/图二

需要手动修改一下:https://nbviewer.jupyter.org/github/huaweicloud/ModelArts-Lab/blob/master/notebook/DL_face_recognition_advanced/face_similarity.ipynb(成功打开的例子)将手动修改后的链接复制到如下图,回车即可打开

另一个案例中出现的问题“不支持您的txt文件中文编码方式,检测到的编码方式是%s' % encoding,”

该问题的解决可以用一下方法

解决不支持您的txt文件中的代码方式

,如图所示

直接下载的文件无法解释,解决方案一如下:

系统自带的记事本打开也能够转码的,也是另存为,然后编码选择UTF-8

直接下载的文件无法解释,解决方案二如下:

1,可以使用Visual打开三国演义.txt

点击另存-

在点击确定

选择如图所示即可

重新txt上传,然后重新运行即可

或者使用UltraEdit,Vscode工具进行另存,转换为UTF-8即可

AI 自然语言处理基础

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MySQL见闻录 - 入门之旅
下一篇:【2022 年】Python3 爬虫教程 - JavaScript 逆向调试常用技巧
相关文章