百度深度学习集训营第二阶段的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用户名: moxiaoying
作业1-1:
(1):
(2):
(3):
作业1-2:
(1):
1. 词表为字典:
M+M-1+M-2+....+2+1= (1+M)/2
2. 词表为列表:
N*(M+M-1+M-2+....+2+1)=(N+NM)/2
(2): 懵逼中
(3):
逆向最大匹配法:和正向原理相同,只是方向相反
最短路径分词:在所有的切分过程中选择词语数量最少的分词结果,如果出现词语数量相同的情况,就选择词语长度的方差小的那个分词结果。
AI Studio用户名:六到飞起year
作业1-1:
(1) 截图已发送
(2)
(3)
作业1-2:
(1)N*(M+M-1+M-2+....+2+1)=(N+NM)/2
(2)
(3)
基于词表的分词方法
正向最大匹配法(forward maximum matching method, FMM)
逆向最大匹配法(backward maximum matching method, BMM)
N-最短路径方法
基于统计模型的分词方法
基于N-gram语言模型的分词方法
基于序列标注的分词方法
基于HMM的分词方法
基于CRF的分词方法
基于词感知机的分词方法
基于深度学习的端到端的分词方法
AI Studio用户名:windly4548
作业1-1:
(1)已发qq
(2)![](https://ai.bdstatic.com/file/9015AA3EB23D4A3FB6050182F2E2FEE7)
(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵
import jieba
import os
import math
from collections import Counter
word_list=[]
path_tem="./1946"
for file in os.listdir(path_tem):
file_tem = os.path.join(path_tem,file)
text=open(file_tem,encoding='utf-8').read()
seg_list=jieba.cut(text)
word_list+=seg_list
word_count = Counter(word_list)
result=0
word_num=len(word_list)
print("总词量",word_num)
for word in word_count:
percent = word_count[word]/word_num
result+=percent*math.log(percent,2)
result=-result
print("信息熵",result)
输出总词量 1889
信息熵 8.234127630448668
作业1-2
(1)思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
M*N+(M-1)*N+(M-2)N+(M-3)N+……+2N+1N=(M∗(M−1)/2)*N
复杂度为O(NM^2)
(2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
#分词候选
import jieba
s="去北京清华大学游玩"
dict=list(jieba.cut(s,cut_all=True))
print("使用jieba获得词典为")
print(dict)
##count_seg_candidates递归查找能够分词成功的句子
def seg_candi_count(candidate, remained, dictionary):
if len(remained) == 0:
print('/'.join(candidate))
return 1
count = 0
for i in range(1, len(remained)+1):
if (remained[:i]) not in dictionary:
continue
count += seg_candi_count(candidate + [remained[:i]], remained[i:], dictionary)
return count
print('分词候选数',seg_candi_count([],s,dict))
输出使用jieba获得词典为
['去', '北京', '清华', '清华大学', '华大', '大学', '游玩']
去/北京/清华/大学/游玩
去/北京/清华大学/游玩
分词候选数 2
(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。
除N-gram算法,还有HMM隐马尔可夫模型、CRF条件随机场 基于深度学习BiLSTM-CRF网络模型。
AI Studio用户名:多佛朗mingle
作业1-1:
(1)已发qq
(2)使用LAC分词![](https://ai.bdstatic.com/file/7C4ADF8FFA2C4506AD04FAA059B8DE38)
(3)计算信息熵
作业1-2:
(1)每次查找对应分出的词是否在词表里,需要查找N次,最大前向匹配时,从串尾开始,依次切去一个词,看余下的子串是否在词表里,最坏情况需要len(串)次(最大为M),每次匹配成功,从串首去掉对应匹配成功的词,再从左往右进行下一次匹配,最坏情况,需要M次,如此看来,计算复杂度为O(N*M*M)
(2)计算分词候选
(3)分词算法
还有基于统计机器学习的HMM,CRF,想法是先训练一个序列标注模型,有了序列标注,对句子进行标注后,就可以使用这些标注对句子进行分词
AI Studio用户名:XXXX
作业1-1:![](https://ai.bdstatic.com/file/9501C8EFFA31450A96D6C8F3562BA053)
作业1-2:
(1)
def seg_count(seg, sentence, dic):
count = 0
for i in range(1, len(sentence) + 1):
if sentence[:i] in dic:
count += seg_count(seg + [sentence[:i]], sentence[i:], dic)
if len(sentence) == 0:
print('/'.join(seg))
return 1
return count
dictionary = ['南', '京', '市', '长', '江', '大', '桥','南京', '南京市', '市长', '长江', '大桥']
words = '南京市长江大桥'
num = seg_count([], words, dictionary)
print("Count is:", num)
(2)
AI Studio用户名:yuanruqiu
作业1-1
(1)安装paddle
(2)jieba分词的使用
结果:
(3)对人民日报语料库的分词,计算信息熵
这里只用了25个文本
结果:
作业1-2
(1)需要匹配的次数为N*(M*(M+1)/2),即计算复杂度为O(NM^2).
(2)采用递归
结果:
(3)
还有逆向最大匹配算法(BMM),双向最大匹配算法和基于HMM的分词发等等。逆向最大匹配算法就是正向匹配顺序反过来;双向最大匹配就是将正向和逆向进行比较后得出最后结果;基于HMM的分词方法属于由字构词的分词方法,它是将分词问题转化为字的分类问题(序列标注问题)。
(3)
还有逆向最大匹配算法(BMM),双向最大匹配算法和基于HMM的分词发等等。逆向最大匹配算法就是正向匹配顺序反过来;双向最大匹配就是将正向和逆向进行比较后得出最后结果;基于HMM的分词方法属于由字构词的分词方法,它是将分词问题转化为字的分类问题(序列标注问题)。
(3)
还有逆向最大匹配算法(BMM),双向最大匹配算法和基于HMM的分词发等等。逆向最大匹配算法就是正向匹配顺序反过来;双向最大匹配就是将正向和逆向进行比较后得出最后结果;基于HMM的分词方法属于由字构词的分词方法,它是将分词问题转化为字的分类问题(序列标注问题)。
AIStudio用户名:wzshou
作业1-1
(1)paddlepaddle安装截图
(2) 分词使用
(3)信息熵计算
作业1-2
(1)匹配次数:N*(m(m+1)/2)
时间复杂度即为O(NM)
(2)
AI Studio用户名:逗一生
作业1-1:
(1) 已提交给班主任
(2)
使用LAC和jieba进行分词,情况可以看出jieba与LAC的分词在大部分情况下都是相似的,但是jieba分词效果更优。
(3)
import jieba
import sys
import os
import math
jieba.enable_paddle()
class RMRB():
def __init__(self,path):
self.path = path
self.stop = [line.strip() for line in open('C:/Users/Administrator/Desktop/stopwords-master/百度停用词 表.txt',encoding='utf-8').readline()]
def read_file(self):
word_total = []
for file in os.listdir(self.path):
file_path = os.path.join(self.path,file)
text = open(file_path,encoding='utf-8').read()
text_word = jieba.cut(text)
text_str = []
#去除停用词以及标点符号
for i in list(text_word):
if i not in list(self.stop) and i not in[' ', ',' , '\n', '。' , '!' , '\u3000', '###', '(' , ')' , '【' , '】' ,':', '一' ,'、', '”', '“' ]:
text_str.append(i)
# 不能使用append,因为append会消除重复项
word_total += text_str
return word_total
def H(self,word_total):
entropy=0
word_number = len(word_total)
vocab = set(word_total)
for word in vocab:
probability = word_total.count(word)/word_number
entropy += probability*math.log(probability,2)
return entropy,word_number
model = RMRB('C:/Users/Administrator/Desktop/1946年05月/')
aaa = model.read_file()
entropy,number = model.H(aaa)
print('总词数:', number)
print('信息熵:',-entropy)
总词数: 139873
信息熵: 11.801521125064568
作业1-2
(1)假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是 O(n) = N+2N+...+(M-1)N+MN=N(M^2)。前向匹配会将M长的句子从最长开始切分,将剩余的部分与词表中N个词进行匹配,最坏的情况是前M-1个分词结果都没有匹配项,将每一个字都与词表匹配。
(2)
(3)除了N-gram和正向最大匹配法,还有反向最大匹配法,双向最大匹配算法,基于HMM,统计模型的分词方法等。
AI Studio用户名:晟灬熙
作业 1-1
(1)截图已提交
(2)使用jieba分词
AI Studio用户名:断灬泪残月
作业1-1:
(1)已发qq
(2)
(3)
作业1-2
(1)O(M^2 * N)
(2)
(3)最少切分分词算法:该分词算法依据最少切分原则,从几种分词算法切分结果中取切分词数最少一种的。比如,从正向最大匹配和逆向最大匹配两者中选择词数较少的方案,当词数相同时,采取某种策略,选择其中一个。
AI Studio用户名:相对的爱因斯坦
AI Studio用户名: thunder95
作业1-1:
(1)用pip安装失败,用docker toolbox安装成功, 已发给班主任
(2)尝试PaddleNLP度的LAC模型, 非常方便易用
(3)计算信息熵,运行结果:
194605总词量: 175456
194605信息熵: -10.263387477287653
作业1-2:
(1) 词表容量为N,M长的句子第一位置开始匹配遍历N次,第二位置2N次,依次类推,计算复杂度为O(n) = N+2N+....+(M-1)N+MN=N(M的2次方)
(2)给定一个句子,能最多给出2xNx(N+1), 其中N是文本长度
(3) 逆向最大匹配法:和正向原理相同,只是方向相反
双向最大匹配法(和正向最大匹配法类似,区别是从左到右、从右到左进行两次扫描)
HMM隐马尔可夫模型和RNN循环神经网络模型切词方法
AI Studio用户名:张小黄
作业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的句子,那么最大前向匹配的计算复杂度是多少?
O(N*(M^2)),假设最坏情况,从第一个字开始之后每1个字、2个字...M个字的词都要在词表查N次。
(2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。
词典法:最大前向匹配、最大后向匹配、双向匹配
统计法:n-gram、HMM、CRF
基于神经网络:LSTM(RNN)、bert等预训练语言模型
AI Studio用户名:CF_FC
作业1-1:
(1) 之前已经安装过1.6.3版本的Paddlepaddle,已发截图给班主任。
(2) 学习使用Jieba分词:(分析《背影》一文的词频排行)
结果如下:
作业1-2:
(1)XXX
(2)XXX
AI Studio用户名:matrixlin9
作业1-1:
(1)飞桨本地安装成功,已截图给班主任![](https://ai.bdstatic.com/file/79E138349F55454B811C8EB05666831A)
(2)学习使用jieba模型分词
(3)人民日报预料分词,并计算信息熵:
作业1-2:
(1)最大前向匹配的思想是每次分词从前面取最有可能的单词切分,然后再向后继续分词。我们考虑最坏情况:一开始的时候,我们拿拿一个单词取到词典做匹配。这个单词的长度可能从M到1,一共N*M次操作。但是只有1个长度的字被匹配到。第二次我们做类似的操作,只是这个单词长度是可能从M-1到1,一共N*M-1次。以此类推,一共可能有N*M+N*(M-1)+...+N=N*(M+1)*M/2。计算复杂度是O(N*M^2)。但是如果我们每次拿的单词长度限制为S,S是词典里面已知的最大长度。那么我们复杂度就可以降到O(N*M)
(2) 给定句子计算候选个数:
(3)CRF分词
条件随机场分词的任务是给定一个中文字符串,得到一个每个字对应的分类。每个字可能在词的开头(B),中间(M),结尾(E),或是单字词(S)。CRF通过定义条件概率P(Y∣X)来描述模型。以及一系列的特征函数和权重来计算最后的分数。进而得到分词的结果。
作业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
这里我用了jieba分词,做了几个测试
(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵 语料地址:https://github.com/fangj/rmrb/tree/master/example/1946%E5%B9%B405%E6%9C%88
这里不太会,参考了别的学员的作业
作业1-2
(1)思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
最坏情况下每个词都要切分,计算复杂度是O(NM)。
(2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。
CRF分词算法
CRF可以看作一个无向图模型,对于给定的标注序列Y和观测序列X,对条件概率P(Y|X)进行定义,而不是对联合概率建模。CRF可以说是目前最常用的分词、词性标注和实体识别算法,它对未登陆词有很好的识别能力,但开销较大。
csdn博客作业连接:https://blog.csdn.net/SHANG__HC/article/details/104566259
AI Studio 用户名: quan
作业1-1:
(1) 已发班主任
(2):
(3):
作业1-2:
(1):
我们来看一下最大前向匹配的过程:对于M长度的句子,首先在词典中查询M长度的词,如有匹配则结束,否则去掉最后一个字,得到(M-1)长度的词,再重复上述操作。直至匹配成功。 显然在最坏情况里,最终匹配的词长度为1,显然时间复杂度为O(m*n),但是在实际情况中,m远小于词典大小N,所以时间复杂度为O(n)
(2):
(3):
还有后向最大匹配,双向最大匹配。后向最大匹配就是将前向最大匹配反过来,从句子开头开始去掉。
而双向最大匹配法就是综合前向和后向,对比分词数量谁少就取谁
作业1-1
(1)环境安装参照paddle官网首页快速开始
(2)(3):
github的model未能成功clone,使用paddlehub 的 lac 模型
人民日报语料库使用 7z的压缩包,注意:后面部分压缩包没有包含文件夹,与前面格式不同,需手动调整。
日报文本,首先提取正文内容(专栏后的内容):
并将其段落拆分为单句,当句子长度远远小于字典长度时,分词的运算量大致和字典的长度直接相关。详见1-2(1)。
使用hub 分词,添加参数 use_gpu=True,使用gpu,此参数文档中没有写
部分运行结果如下:
上图未使用多线程,数据量太大速度太慢,使用多进程加速
部分结果如下,信息熵约为 11
1-2(1)
最坏情况分析:max_len < M时,最终也会全部加上,因此假设max_len = M,最后一个匹配上。 运行次数:N((M-1)+(M-2)...+1),其中1+2+...+(M-1)的值约等于 0.5(M^2) 结果为0.5NM^2,算法复杂度为O(NM^2) 当句子M远远小于N时,算法复杂度为O(N),取决于字典的大小。 分词过程中,尽量根据文章标点等将大段落切分为单句。
1-2(2)
1-2(3)
逆向最大匹配,双向最大匹配
隐马尔可夫模型分词:
隐藏的离散型状态变量{y1, y2, …, yn},观测变量{x1, x2, …, xn},
在任一时刻,观测变量的取值只与该时刻的状态变量有关,即xi由yi决定。而当前状态只与前一时刻的状态有关,与其他状态无关。
AI Studio用户名:kly1997
作业1-1:
(1)
已发送给班主任
(2)
import jieba
jieba.enable_paddle()
strs=["平汉川陕道上国民党军运忙","第三党中干会议决定改为中国工农民主党","英索伦煤矿工人二千五百人罢工"]
for str in strs:
seg_list = jieba.cut(str,use_paddle=True) # paddle模式
print("Paddle Mode: " + '/'.join(list(seg_list)))
seg_list = jieba.cut("英索伦煤矿工人二千五百人罢工", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut("英索伦煤矿工人二千五百人罢工", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 默认模式
(3)
import jieba
import os
import math
# get .MD document
path = 'D:\work//new//1946年05月'
#统计词频计算信息熵
def informationentropy(lists):
num = len(lists)
print('总词数:', num)
label = {}
for str in lists:
currentLabel = str
if currentLabel not in label.keys():
label[currentLabel] = 0
label[currentLabel] += 1
informationentropy = 0
# 显示TOP3的词
sort_words = sorted(label.items(), key=lambda k: k[1], reverse=True)
print('TOP3的词及词频:\n{}'.format(sort_words[:3]))
for key in label:
prob = float(label[key]) / num
informationentropy -= prob * math.log(prob, 2)
print("信息熵:", informationentropy)
return informationentropy
#主程序
# read
lists = []
jieba.enable_paddle()# 启动paddle模式
for (dirpath,dirnames,filenames) in os.walk(path):
for filename in filenames:
if os.path.splitext(filename)[1]=='.md':
list = open(path+'\\'+filename,encoding='utf-8').read()
seg_list = jieba.cut(list,use_paddle=True) # 使用paddle模式
lists += seg_list
informationentropy(lists)
结果:信息熵11.26
作业1-2:
(1)最坏情况所有词都不在词表里,依次从第一,第二直到第M个字符开始匹配,每次需要匹配(M-k+1)*N次,一共需要N*((1+M)M/2)次。时间复杂度为O(NM^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)
(3)隐马尔可夫模型:HMM模型认为在解决序列标注问题时存在两种序列,一种是观测序列,即人们显性观察到的句子,而序列标签是隐状态序列,即观测序列为X,隐状态序列是Y,因果关系为Y->X。因此要得到标注结果Y,必须对X的概率、Y的概率、P(X|Y)进行计算,即建立P(X,Y)的概率分布模型。
CRF分词算法:CRF可以看作一个无向图模型,对于给定的标注序列Y和观测序列X,对条件概率P(Y|X)进行定义,而不是对联合概率建模。CRF可以说是目前最常用的分词、词性标注和实体识别算法,它对未登陆词有很好的识别能力,但开销较大。