百度深度学习集训营第二阶段的NLP+推荐系统内容开讲啦,每个阶段的作业都将有各自的奖励,欢迎大家学习~
PS:如遇帖子过期、审核不通过的情况,请先复制内容保存在word文档,然后根据提示,完成个人实名验证,刷新后重新粘贴复制的内容,即可提交~
欢迎大家报名参加~
请大家按照作业格式将作业回帖在下面,并备注自己的AI Studio用户名~
2月27日第二次作业
作业奖励:3月2日中午12点之前完成,会从中挑选10位回答优秀的同学获得飞桨定制数据线+本
实践作业:(必做)
路径:AI Studio课程-作业-NLP作业2
•请尝试用飞桨实现一个CBOW模型,并使用text8语料进行训练(或尝试提高skip-gram的训练速度)
附加题:(选做,答案回复在作业帖下)
•打开你的脑洞,尝试embedding的各种花样玩法,比如计算同义词,进行推理,将embedding进行聚类,或者用t-sne进行可视化。
附加题回复格式:
AI Studio用户名:XXXX
作业2-1附加题:XXX
2月25日第一次作业
作业奖励: 3月2日中午12点之前完成,会从中挑选10位幸运的同学获得飞桨定制数据线+本
作业1-1
(1)下载飞桨本地并安装成功,将截图发给班主任
(2)学习使用PaddleNLP下面的LAC模型或Jieba分词
LAC模型地址:https://github.com/PaddlePaddle/models/tree/release/1.6/PaddleNLP/lexical_analysis
Jieba模型:https://github.com/fxsjy/jieba
(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵
语料地址:https://github.com/fangj/rmrb/tree/master/example/1946%E5%B9%B405%E6%9C%88
作业1-2
(1)思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
(2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。
回复作业格式:
AI Studio用户名:XXXX
作业1-1:XXX
作业1-2:
(1)XXX
(2)XXX
报名流程:
1.加入QQ群:677320960,班主任会在QQ群里进行学习资料、答疑、奖品等活动
2.点此链接,加入课程报名并实践:https://aistudio.baidu.com/aistudio/course/introduce/888
温馨提示:课程的录播会在3个工作日内上传到AI studio《百度架构师手把手教深度学习》课程上
AI Studio用户名:Shona1021
作业2-1附加题:
加载已经保存好的CBOW模型找相近词 & 可视化embedding:
利用tensorflow开源工具进行可视化:
AI Studio用户名:诸葛AI云
作业1-1:
(1)安装paddlepaddle截图
(2)学习LAC和jieba分词
(3)计算信息熵:
用1和2选择分词方法
下图为jieba分词的效果以及信息熵
信息熵为7.179909090014958
作业1-2:
(1)计算复杂度 O(N*(M^2))
(2)
jieba分词:Paddle模式 全模式 精确模式 搜索模式
paddlepaddle:LAC模型
(3)分词算法:
1.基于CRF的分词方法
CRF是无向图模型
Z(O)将其归一化
P (I|O)表示在给定观测序列O=(O1,O2,...Oi)的情况下,我们用CRF求出的隐序列I = (I1,I2,...Ii)的概率,注意这里I是一个序列,有多个元素
优点:
克服了HMM的观测独立假设以及MEMM标注偏差问题
缺点:
全局化特征模型会更复杂,导致训练周期长,计算量较大
2.基于深度学习的端对端的分词方法
BiLSTM-CRF的网络结构如上图所示,输入层是一个embedding层,经过双向LSTM网络编码,输出层是一个CRF层,经过双向LSTM网络输出的实际上是当前位置对于各词性的得分,CRF层的意义是对词性得分加上前一位置的词性概率转移的约束,其好处是引入一些语法规则的先验信息 。
3.隐马尔可夫模型(Hidden Markov Model,HMM)
是用来描述一个含有隐含未知参数的马尔可夫过程,隐马尔科夫模型在中文分词中的应用是将分词作为字在字符串中的序列标注任务来实现的:每个字在构成一个特定的词语时都会占据着一个确定的构词位置(词位),这里每个字只有四个位置:即B(词首)、M(词中)、E(词尾)、S(单独成词)。
作业1-1
(1) 下载飞桨本地并安装成功,将截图发给班主任
已发。
(2)学习使用PaddleNLP下面的LAC模型或Jieba分词
输出:
结果分析:
Paddlepaddle的分词粒度大于Jieba,可以推测Paddle的预设词汇表比Jieba更大。Paddle的分词效果较强悍。
(3) 对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵
结果:
entropy= 11.778569558439427
作业1-2
(1)思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
答: O(M * N)
理由: 最大前向匹配最坏的情况是:句子分词结果为单个字,并且每个字都需要遍历词表全部。所以最后的匹配结果次数为N * (M + M-1 + … + 2 + 1),所以时间复杂度为O(N * M^2)
(2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。
AI Studio用户名:YBStefan
作业1-1:
(1)已经发QQ:
(2)
AI Studio用户名:YBStefan
作业1-1:
(1)已经发QQ:
(2)
Paddle enabled successfully......
2020-02-26 10:46:23,867-DEBUG: Paddle enabled successfully......
Building prefix dict from the default dictionary ...
2020-02-26 10:46:23,925-DEBUG: Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\ASUS\AppData\Local\Temp\jieba.cache
2020-02-26 10:46:23,927-DEBUG: Loading model from cache C:\Users\ASUS\AppData\Local\Temp\jieba.cachePaddle Mode: 我/来到/北京清华大学
Paddle Mode: 乒乓球/拍卖/完/了
Paddle Mode: 中国科学技术大学
Loading model cost 0.876 seconds.
2020-02-26 10:46:24,802-DEBUG: Loading model cost 0.876 seconds.
Prefix dict has been built successfully.
2020-02-26 10:46:24,803-DEBUG: Prefix dict has been built successfully.
Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
Default Mode: 我/ 来到/ 北京/ 清华大学
他, 来到, 了, 网易, 杭研, 大厦
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
3)对人民日报进行分词,计算信息熵:
作业1-2:
(1)假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
最大的前向匹配的计算复杂度是0(NM^2)
(2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。
基于词表的分词方法:
正向最大匹配法(forward maximum matching method, FMM)
逆向最大匹配法(backward maximum matching method, BMM)
N-最短路径方法:
基于统计模型的分词方法:
基于N-gram语言模型的分词方法
基于序列标注的分词方法:
基于HMM的分词方法
基于CRF的分词方法
基于词感知机的分词方法
基于深度学习的端到端的分词方法
用户名:zhou573223360
作业1-1-1:
已发给班主任
作业1-1-2:
通过jieba分词
作业1-1-3:计算1946年5月人民日报数据的信息熵
作业1-2-1
一共需要计算N*M*(M-1)次,时间复杂度为O(NM^2)。
作业1-2-2
作业1-2-3
小白,不了解了
AI Studio用户名:bnpzsx
作业2-1附加题:
1. 使用t-sne给text8语料中频率最高的前2000个词的词向量降维, 并可视化
在图中语义越相似的词距离越小, 以下为一些局部图片
/
/
2. 基于语言的逻辑推理
测试
输出
AI Studio用户名:石晶
2月25日第一次作业
**作业1-1**
(1)下载飞桨本地并安装成功
(2)学习使用PaddleNLP下面的LAC模型或Jieba分词
已下载
(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵
**作业1-2**
(1) 思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
O(M*M)和O(M)之间
(2) 给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
import jieba
import re
cut_words=[]
for line in open('./text1.txt',encoding='utf-8'):
line.strip('\n')
line = re.sub("[A-Za-z0-9\:\·\—\,\。\“ \”]", "", line)
seg_list=jieba.cut(line,cut_all=True)
(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。
逆向最大匹配算法RMM
是正向最大匹配的逆向思维,匹配不成功,将匹配字段的最前一个字去掉,实验表明,逆向最大匹配算法要优于正向最大匹配算法。
双向最大匹配法
双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法的到的结果进行比较,从而决定正确的分词方法。
设立切分标志法
收集切分标志,在自动分词前处理切分标志,再用MM、RMM进行细加工。
最佳匹配法(正向,逆向)
对分词词典按词频大小顺序排列,并注明长度,降低时间复杂度。
隐马尔可夫模型分词方法
隐马尔可夫的三大问题分别对应了分词中的几个步骤。参数估计问题就是分词的学习阶段,通过海量的预料数据来学习归纳出分词模型的各个参数。状态序列问题是分词的执行阶段,通过观测变量(待分词句子的序列)来预测出最优的状态序列(分词结构)。
AI Studio用户名:深渊上的坑
作业1-1
(1)已发班主任
(2)使用PaddleNLP下面的LAC模型,以及使用Jieba分词模型
(3)切词,并通过统计每个词出现的概率,计算信息熵
作业1-2:
(1)最大前向匹配的计算复杂度
N个词,输入一个长度为M的句子,最大前向匹配的计算复杂度为 O(N∗M(M+1)/2)=O(N∗M^2)
(2)给定一个句子,如何计算里面有多少种分词候选
(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述
基于词表的分词方法
最大后向匹配法(backward maximum matching method, BMM)
基本原理与最大前向匹配法类似,只是分词顺序变为从右至左。
双向最大匹配
将最大前向匹配和最大后向匹配的结果结合起来
基于序列标注的分词方法
基于HMM的分词方法
对应隐马尔科夫模型的解码问题,模型参数(转移矩阵,发射矩阵)可以使用统计方法计算得到,原始文本为输出序列,词位是隐状态序列,使用Viterbi算法求解
基于CRF的分词方法
一种判别式模型,CRF通过定义条件概率P(Y∣X)P(Y∣X)P(Y∣X)来描述模型。基于CRF的分词方法与传统的分类模型求解很相似,即给定feature(字级别的各种信息)输出label(词位)
基于词感知机的分词方法
基于深度学习的端到端的分词方法
如BiLSTM-CRF(参考资料#4)的网络结构如上图所示,输入层是一个embedding层,经过双向LSTM网络编码,输出层是一个CRF层。经过双向LSTM网络输出的实际上是当前位置对于各词性的得分,CRF层的意义是对词性得分加上前一位置的词性概率转移的约束,其好处是引入一些语法规则的先验信息。
AI Studio用户名:dfenglei
作业1-1:
(1)提交班主任
(2)学习分词模型
(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵
# encoding=utf-8
import os
import math
import jieba
from collections import Counter
def word_count(filepath):
word_list = []
file_list = os.listdir(filepath)
for file in file_list:
path = os.path.join(filepath, file)
text = open(path, encoding='utf-8').read()
text = text.strip().replace(' ', '').replace('\n', '').replace('“', '') \
.replace('”', '').replace('、', '') \
.replace(',', '').replace('。', '').replace('。', '') \
.replace('(', '').replace(')', '').replace('-', '')
seg_list = jieba.cut(text)
word_list += seg_list
word_count = Counter(word_list)
# 计算信息熵
entropy = 0
for word in word_count:
word_count[word] /= len(word_list)
percent = word_count[word]
entropy += percent * math.log(percent, 2)
entropy = -entropy
print("信息熵:", entropy)
if __name__ == '__main__':
file_dir = '194605'
word_count(file_dir)
信息熵: 11.762779320674419
作业1-2:
(1)计算复杂度 O(NM^2)
(2)
# encoding=utf-8
import jieba
import paddle
import jieba.posseg as pseg
sentence ='我爱百度飞浆'
words = pseg.cut(sentence) #jieba默认模式
for word, flag in words:
print('%s %s' % (word, flag))
sentence ='我爱北京清华大学'
worddict = list(jieba.cut(sentence,cut_all=True))
def list_segment(result, sentence, worddict):
cnt = 0
if len(sentence) == 0:
print("/".join(result))
return 1
for i in range(1, len(sentence)+1):
if sentence[:i] in worddict:
cnt += list_segment(result+[sentence[:i]], sentence[i:], worddict)
return cnt
cnt =list_segment([],sentence,worddict)
print('候选分词可能数目:%d' % cnt)
我 r
爱 v
百度 n
飞浆 n
我/爱/北京/清华/大学
我/爱/北京/清华大学
候选分词可能数目:2
(3)
分词算法可分为三大类:
1.基于词典:基于字典、词库匹配的分词方法;(字符串匹配、机械分词法)除了最大前向匹配还有逆向最大匹配法(ReverseMaximum Matching Method)(3)最少切分法
使每一句中切出的词数最小。(4)双向最大匹配法( Bi-directction Matching method )
2.基于统计:基于词频度统计的分词方法;除了N-gram算法,主要统计模型有:隐马尔科夫模型(Hidden Markov Model, HMM)。
3.基于规则:基于知识理解的分词方法。基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段.
忘记写用户名了,补上:
AI Studio用户名:不用谢逍遥游
2月25日第一次作业
AI Studio用户名:RheftButler
作业1-1
(1)下载飞桨本地并安装成功
(2)学习使用PaddleNLP下面的LAC模型或Jieba分词
jieba分词
(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵
作业1-2
(1)思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
(2) 给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。
AI Studio用户名:诸葛AI云
实践题:已提交版本
作业2-1附加题:
用TSNE进行数据降维并展示聚类结果
AI Studio用户名:aaaLKgo
作业1-1:
(1)第(3)题中有使用
(2)第(3)题中,两个库都有使用
(3)统计词的概率与信息熵
输出结果:
在运行速度上,jieba的精确模式十分快速,LAC最慢;其次,三者信息熵基本一致,可以发现使用停用词之后,信息的质量有一定上升。
作业1-2:
(1)N个词,输入一个长度为M的句子,最大前向匹配的计算复杂度为O(N*M(M+1)/2)=O(N*M^2)
(2)计算句子中的候选词
输出结果:
(3)其他分词算法:
最大负向匹配算法:与正向最大匹配法类似,只是分词顺序变为从右至左;
HMM分词:HMM是一个生成模型,分词对应HMM的解码问题,模型参数(转移矩阵,发射矩阵)可以使用统计方法计算得到,原始文本为输出序列,词位是隐状态序列,使用Viterbi算法求解即可。
CRF分词:CRF是一种判别式模型,CRF通过定义条件概率P(Y∣X)来描述模型。基于CRF的分词方法与传统的分类模型求解很相似,即给定feature(字级别的各种信息)输出label(词位)。
BiLSTM-CRF:BiLSTM-CRF的输入层是一个embedding层,经过双向LSTM网络编码,输出层是一个CRF层。经过双向LSTM网络输出的实际上是当前位置对于各词性的得分,CRF层的意义是对词性得分加上前一位置的词性概率转移的约束,其好处是引入一些语法规则的先验信息。
AI Studio用户名:吖小吞
作业2-1附加题:打开你的脑洞,尝试embedding的各种花样玩法,比如计算同义词,进行推理,将embedding进行聚类,或者用t-sne进行可视化。
参照76楼大佬,但效果不太理想,没时间调了,先交一稿[捂脸]:
AI Studio用户名:星光ld1
作业2-1附加题:
下面测试一下词的加减运算
结果如下:

效果不是特别好
作业1-1
(1)下载飞桨本地并安装成功,将截图发给班主任
(2)学习使用PaddleNLP下面的LAC模型或Jieba分词
output:
(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵
信息熵为:
作业1-2
(1)思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
(2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
output:
(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。
AI Studio 用户名: Action
作业2-1:附加题
embedding 可视化
embedding learning result:
AI Studio 用户名: thunder95
作业2-1:附加题
1. 计算相似的词和相似距离,代码和结果输出:

2. 对12个单词进行kmeans聚类并t-sne可视化:
AI Studio用户名:泪如秋思化成雪
作业1-1
(1)(2)
(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵
作业1-2
(1)最大前向匹配的计算复杂度是为:O(N∗M^2)
(2)
(3)联想—回溯法(Association-Backtracking Method,简称 AB 法)。这种方法要求建立三个知识库——特征词词库、实词词库和规则库。首先将待切分的汉字字符串序列按特征词词库分割为若干子串,子串可以是词,也可以是 由几个词组合而成的词群;然后,再利用实词词库和规则库将词群再细分为词。切词时,要利用一定的语法知识,建立联想机制和回溯机制。联想机制由联想网络和 联想推理构成,联想网络描述每个虚词的构词能力,联想推理利用相应的联想网络来判定所描述的虚词究竟是单独成词还是作为其他词中的构词成分。回溯机制主要 用于处理歧义句子的切分。联想—回溯法虽然增加了算法的时间复杂度和空间复杂度,但这种方法的切词正确率较高,是一种行之有效的方法。