百度深度学习集训营第二阶段的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《百度架构师手把手教深度学习》课程上
NLP及推荐课程总结
AI Studio用户名:FutureSI
AI Studio用户名:寂寞你快进去
作业1-1:
(1)截图已发给班主任
(2)
(3)使用jieba分词全模式
信息熵:8.038373285989232
作业1-2:
(1)时间复杂度为O(N*M^2)
(2)
(3)
1.LSTM
2.隐马尔可夫模型
3.Bert
4.ERNIE
1-1 .1 已发截图
1-1 .2
1-1.3
1-2.1 计算复杂度为O(NM^2)
1-2 .2 给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
窃取:
str = '中国人民万岁'
dict=['中','国','人','民','万','岁','中国','国民','中国人','万岁','中国人民']
def text_count(text, word, dict):
if len(word) == 0:
print('/'.join(text))
return 1
count = 0
for i in range(1, len(word) + 1):
if word[:i] not in dict:
continue
count += text_count(text + [word[:i]], word[i:], dict)
return count
candidate = text_count([], str, dict)
print("候选:", candidate)
1-2 .3 HMM,朴素贝叶斯、SVM支持向量机、CRF条件随机场
1-1 .1 已发截图
1-1 .2
1-1.3
1-2.1 计算复杂度为O(NM^2)
1-2 .2 给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
窃取:
str = '中国人民万岁'
dict=['中','国','人','民','万','岁','中国','国民','中国人','万岁','中国人民']
def text_count(text, word, dict):
if len(word) == 0:
print('/'.join(text))
return 1
count = 0
for i in range(1, len(word) + 1):
if word[:i] not in dict:
continue
count += text_count(text + [word[:i]], word[i:], dict)
return count
candidate = text_count([], str, dict)
print("候选:", candidate)
1-2 .3 HMM,朴素贝叶斯、SVM支持向量机、CRF条件随机场
Ai Studio 用户名: DevF
1-1
1
2
3
1-2
1
O(N×M2)
2
3
HMM方法
端到端的方法
AI Studio用户名:东南林美
作业1-1
(1)已发班主任
(2)
(3)
作业1-2:
(1)以完成一次词表遍历为单位时间,则t=O(N*(M+M-1+M-2+…+1))=O(N*M^2) 。
(2)参照其他同学的思想,关键在于找出这个句子有多少种拆分方法。
(3)基于词典的方法除了前向最大匹配算法MM还有:逆向最大匹配算法RMM和双向最大匹配法BMM。
基于统计的方法除了N-gram还有HMM。
RMM:该算法是正向最大匹配的逆向思维,匹配不成功,将匹配字段的最前一个字去掉,实验表明,逆向最大匹配算法要优于正向最大匹配算法。
BMM:双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法的到的结果进行比较,从而决定正确的分词方法。
HMM:是关于时序的概率模型, 描述由一个隐藏的马尔可夫链随机生成不可观察的状态序列,再有状态序列生成一个观测序列的过程。
AI Studio用户名:夕岚
作业1-1
(1)
(2)
(3)
作业1-2:
(1)O(MaxLen(word) * N)
每次从词表的最长词长开始,最大前向匹配最坏的情况:句子分词结果为单个字,并且每个字都需要遍历词表全部。
(2)
import jieba
seg = jieba.cut("干一行行一行,一行不行行行不行", cut_all=True)
seg_list = list(seg)
print('分词个数: ', len(seg_list), '\n候选分词: ', seg_list)分词个数: 13
候选分词: ['干一行', '一行', '一行行', '行行', '一行', ',', '一行', '行不行', '不行', '行行', '行行', '行不行', '不行']
(3)
1 隐马尔可夫模型:HMM模型认为在解决序列标注问题时存在两种序列,一种是观测序列,即人们显性观察到的句子,而序列标签是隐状态序列,即观测序列为X,隐状态序列是Y,因果关系为Y->X。因此要得到标注结果Y,必须对X的概率、Y的概率、P(X|Y)进行计算,即建立P(X,Y)的概率分布模型。
2. CRF算法: 对语料采用BIO/BI/BIOE任意一种标注,作为训练语料,一些分词器在早些时候采用这种方式和规则训练分词模型
AI Studio 用户名:zhangyabkun
作业1-1:(1)(2)如图片所示,使用LAC分词
(3)
import jieba
import math
string=''
fin=open('report','rt')
while True:
line=fin.readline()
if not line:
break
string+=line
fin.close()
word_fre=dict()
jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持
seg_list=jieba.cut(string,use_paddle=True)
for word in seg_list:#对每个词的数量进行统计
if word not in word_fre:
word_fre[word]=0
word_fre[word]+=1
word_num=len(word_fre)
entropy=0
for i in word_fre:
p=word_fre[i]/word_num#统计概率
entropy+=-p*math.log(p,2)
print(entropy)
对1946-05-15进行分词得到其信息熵为11.650444730765923
作业1-2:
(1)假设最大匹配的词的长度为max,则算法复杂度为O(max*M)
(2)str='南京市长江大桥'
l=jieba.lcut(str,cut_all=True)
num=len(l)
(3)基于HMM的分词 基于CRF的分词 基于深度学习的分词
可以通过音箱的连续对话模式,诱导幼儿对某一特定话题进行对话,从而考察期词汇量。
AI Studio用户名:FutureSI
作业2 附加题 打开脑洞,尝试各种embedding花样玩法
AI Studio用户名:FutureSI
作业2 附加题 打开脑洞,尝试各种embedding花样玩法
作业2
请尝试用飞桨实现一个CBOW模型,并使用text8语料进行训练(或尝试提高skip-gram的训练速度)
1.build_data()函数返回的dataset从(中心词,上下文词正/负的样本,label)的三元组改为(上下文词,中心词正/负样本,label)的三元组。
补充作业内容,语料计算的信息熵为:8.3472
AIstudio 用户名:Hi_Boy022
作业1-1:
切词模型我选用LAC模型,选取的人民日报的第一个语料,
jieba切词的前20个结果:
'为', '七百万', '人民', '请命', '李庄', '一', '毁灭', '与', '新生', '四月', '九日', '五辆', '吉普车', '载', '着', '黄河', '勘察', '团', '从', '荷泽'
作业1-2:
(1):按照句子中每一个词匹配的最坏情况,计算复杂度为O(N*M)
(3):最短路径分词算法——最短路径分词算法首先将一句话中的所有词匹配出来,构成词图(有向无环图DAG),之后寻找从起始点到终点的最短路径作为最佳组合方式
参考来源:https://zhuanlan.zhihu.com/p/50444885
AI Studio用户名:蓝路白
作业1-1:
(1)下载飞桨本地并安装成功,将截图发给班主任
(2)学习使用PaddleNLP下面的LAC模型或Jieba分词
Paddle Mode: 我/来到/北京清华大学
Paddle Mode: 乒乓球/拍卖/完/了
Paddle Mode: 中国科学技术大学
Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
Default Mode: 我/ 来到/ 北京/ 清华大学
他, 来到, 了, 网易, 杭研, 大厦
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵
3305
信息熵: 8.094496950793541
作业1-2:
(1)思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
最大前向匹配的计算复杂度是O(N*M*M)。假设单词的最大长度为M,首先将M整个取出与词表中的N个词匹配,匹配失败,每次去掉匹配字段最后面的一个字,继续匹配;匹配成功后,去掉匹配成功的字段,一轮计算复杂度为N*M;直到匹配字段长度为0,结束。在最坏情况下,需要匹配M轮,因此计算复杂度为O(N*M*M)。
(2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
分词个数: 7
候选分词: ['乒乓', '乒乓球', '乒乓球拍', '球拍', '拍卖', '卖完', '了']
(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。
HMM隐马尔可夫算法:HMM模型认为在解决序列标注问题时存在两种序列,一种是观测序列,即人们显性观察到的句子,而序列标签是隐状态序列,即观测序列为X,隐状态序列是Y,因果关系为Y->X。因此要得到标注结果Y,必须对X的概率、Y的概率、P(X|Y)进行计算,即建立P(X,Y)的概率分布模型。
CRF条件随机场:CRF可以看作一个无向图模型,对于给定的标注序列Y和观测序列X,对条件概率P(Y|X)进行定义,而不是对联合概率建模。CRF可以说是目前最常用的分词、词性标注和实体识别算法,它对未登陆词有很好的识别能力,但开销较大。
LSTM长短期记忆网络:在NLP中,最常用的神经网络为循环神经网络(RNN,Recurrent Neural Network),它在处理变长输入和序列输入问题中有着巨大的优势。LSTM为RNN变种的一种,在一定程度上解决了RNN在训练过程中梯度消失和梯度爆炸的问题。使用LSTM模型可以更好的捕捉到较长距离的依赖关系。
BiLSTM双向长短期记忆网络:双向循环神经网络分别从句子的开头和结尾开始对输入进行处理,将上下文信息进行编码,提升预测效果。前向的LSTM与后向的LSTM结合成BiLSTM。BiLSTM可以更好的捕捉双向的语义依赖。
BiLSTM+CRF:双向长短期记忆网络和条件随机场的结合。
参考资料:
【1】https://www.jianshu.com/p/715fa597c6bc
【2】https://www.jiqizhixin.com/articles/2018-10-24-13
AI Studio用户名:余音竖图
作业1-1
(1)下载飞桨本地并安装成功,将截图发给班主任
(2)学习使用PaddleNLP下面的LAC模型或Jieba分词
# LAC 分词
import paddlehub as hub
module = hub.Module(name="lac")
test_text = ["今天是个好日子", "天气预报说今天要下雨", "下一班地铁马上就要到了"]
results = module.lexical_analysis(data={"text":test_text})
print(results)
{'word': ['今天', '是', '个', '好日子'], 'tag': ['TIME', 'v', 'q', 'n']},
{'word': ['天气预报', '说', '今天', '要', '下雨'], 'tag': ['n', 'v', 'TIME', 'v', 'v']},
{'word': ['下', '一班', '地铁', '马上', '就要', '到', '了'], 'tag': ['f', 'm', 'n', 'd', 'v', 'v', 'xc']}]
# 信息熵
# 读取测试 语料
symbol = r'[a-zA-Z0-9’!"#$%&\'()*+,-./:;<=>?@:,。()?@★、…【】《》?“”‘’!^_`{|}~\s]+'
with open("./test100.txt", "r", encoding="utf-8") as D:
data = D.read()
data_unsymbol = re.sub(symbol, "", data)
data_jieba =jieba.lcut(data_unsymbol)
print(len(data_jieba))
data_list = collections.Counter(data_jieba)
data_num = np.array(list(data_list.values()))
p1 = data_num / data_num.sum()
jieba_entropy = np.sum(-p1*np.log2(p1))
print("分词的信息熵:", jieba_entropy)
112919
分词的信息熵: 10.341794453554972
AI Studio用户名:FutureSI
作业1-2 (1)思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
作业1-2 (2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
输出结果:
今/天/中/午/不/吃/食堂
今/天/中/午/不/吃食/堂
今/天/中/午/不吃/食/堂
今/天/中/午/不吃/食堂
今/天/中午/不/吃/食/堂
今/天/中午/不/吃/食堂
今/天/中午/不/吃食/堂
今/天/中午/不吃/食/堂
今/天/中午/不吃/食堂
今天/中/午/不/吃/食/堂
今天/中/午/不/吃/食堂
今天/中/午/不/吃食/堂
今天/中/午/不吃/食/堂
今天/中/午/不吃/食堂
今天/中午/不/吃/食/堂
今天/中午/不/吃/食堂
今天/中午/不/吃食/堂
今天/中午/不吃/食/堂
今天/中午/不吃/食堂
候选分词数为 20
作业1-2 (3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。
感谢各位老师,各位同学,各位大神。我神往AI已久,现在终于有时间,系统学习。来得晚了点,还在学习前面的课;已略有心得,甚是欢喜。
AI Studio用户名:FutureSI
作业1-1 (1)下载飞桨本地并安装成功,将截图发给班主任
作业1-1 (2)学习使用PaddleNLP下面的LAC模型或Jieba分词
作业1-1 (3)对人民日报语料完成切词,并通过统计每个词出现的概率