Blog5 无监督深度关键短语生成——关键代码分析3
2021SC@SDUSC
附所有代码链接:https://github.com/Jayshen0/ Unsupervised-Deep-Keyphrase-Generatio
本篇分析代码模块为:extract.py(三)
(五)论文对应的关键代码复盘
1.主要工作
extract.py做的工作主要是将每篇文档利用前期方法构建好的、由存在和缺失的关键短语构成的短语库中的短语进行排名,来生成我们训练模型需要的银标签。
2.前期数据获取
由于本篇论文所用到的实际处理数据集并未上传到github上,只有预处理的原数据集kp20的数据集下载链接。因此,需要自己通过论文中引用的其他论文的方法,进行数据集的准备。其中,先前的工作为:
①利用论文《Simple Unsupervised Keyphrase Extraction using Sentence Embeddings》中的方法从数据集中提取出文档中存在的关键短语。
②利用pke工具(https://github.com/boudinfl/pke),从数据集中提取文档中缺失的关键短语。
③利用Doc2vec模型,生成短语的词向量。
3.代码实现过程
由于原文的代码并未添加注释,比较难理解。因此,在分析代码段的过程中,博主通过自己添加注释,简明扼要地体现了邻近一段代码的思想,主要干了什么。
(1)计算TF-IDF值的deal函数
在前面的论文分析中,我们知道,对于语料库 D 中的文档 x,短语 c 的 TF-IDF 得分为:
在代码中,定义了deal方法,来计算tf-idf的值。
def deal(p,t):#计算tf-idfp = p.split() # 转成列表格式if p[0] in pre_word:#如果p的第一个元素在pre_word里,那么删去p=p[1:]b = ' '.join(p) #列表转换成字符串格式tag = nltk.pos_tag(p) # 词性标注,返回p中以单词+词性标注为元组的list: tag
- NLTK包的pos_tag方法(part-of-speech tagging ):对单词的词性进行标记,标记后的结果是二元数组格式(单词,词性)。
(2)主函数extract的实现
其中一些代码段用到的都是常规方法,重点是自己的理解,因此,就直接通过注释的形式来进行概括分析。
#计算嵌入相似性及rankscore进行融合排名
def Extract(input):#给出Input,预测下一个可能出现的词can_list,can_set = get_ngram(input)#pytorch中,.item()方法是得到一个元素张量里面的元素值,具体用于将一个零维张量转换成浮点数idf = np.load('word_dic.npy', allow_pickle=True).item()new_bb=set()if False:#调用deal函数计算tf-idf值,将得到的结果取并集for i in range(len(all_can)):t=all_can[i]tmp2=set()for p in t:tmp2 = tmp2 | deal(p,a[i])all_can[i] = tmp2new_bb = new_bb | tmp2record = []idf_p = np.load('phrase_dic.npy', allow_pickle=True).item()
①遍历文档数据集,提取短语:
for i,e in enumerate(input):pre = e.lower()pre_list = nltk.tokenize.word_tokenize(pre) #从pre返回音节stem_pre = [porter_stemmer.stem(q) for q in pre_list]#提取q的词干stem_pre = ' '.join(stem_pre)
- enumerate()函数:用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环中。e.g.
for i,j in enumerate(('a','b','c')): print i,j #输出结果为: >>>0 a >>>1,b >>>2,c
tokenize.word_tokenize()
方法:我们可以使用以下方法从字符串提取令牌。它实际上从单个单词或句子流中返回音节。一个单词可以包含一个或两个音节。 e.g.
tk = SyllableTokenizer()# Create a reference variable for Class word_tokenize
gfg = "Antidisestablishmentarianism"# Create a string input
geek = tk.tokenize(gfg) # Use tokenize method
print(geek)#输出:[‘An’, ‘ti’, ‘dis’, ‘es’, ‘ta’, ‘blish’, ‘men’, ‘ta’, ‘ria’, ‘nism’]
②计算嵌入相似性
使用在维基百科语料库上预训练的 Doc2Vec 模型,为输入文档及其候选短语生成 300 维向量。 具体来说, 将文档 x 和候选短语 c 的嵌入分别表示为 E(x) 和 E(c)。 它们的语义相似度定义为:
#我们可以通过把需要得到向量的一段文本送入训练好的模型,通过使用model.infer_vector()函数,来获取对应的词向量
#生成pre_list的词向量doc_emb = model.infer_vector(pre_list)
#对词向量计算嵌入相似性doc_emb = doc_emb / math.sqrt(sum([doc_emb[k]*doc_emb[k] for k in range(300)])) rank=[]rank2 = []l = len(pre.split('.'))
③构建短语库,将存在候选短语和缺失候选短语结合生成候选短语库。
#寻找在其它文档出现的缺失短语absent_can = set()for phrase in can_set:phrase = phrase.split()flg = 0for w in phrase:if w not in pre+list:flg = 1breakif flg==0:absent_can.add(phrase)# 将存在候选短语can_list与缺失候选短语absent_can对应相加之后形成新短语库for j,q in enumerate(list(can_list[i])+list(absent_can)):if q not in idf:continueq_list = nltk.tokenize.word_tokenize(q)
#生成q_list的词向量emb = model.infer_vector(q_list)emb = emb / math.sqrt(sum([emb[k]*emb[k] for k in range(300)])) emb = emb.reshape([1,300])
④融合排名(Fused Ranking):使用几何平均值:
#计算rankscore值sim = float(np.dot(doc_emb.reshape([1,300]), emb.reshape([300,1])))if l>10:sim = pre.count(q)*idf[q] * sim if j < len(can_list[i]):rank.append([sim,q])else:ran2k.append([sim2,q])#根据计算值进行排名rank.sort(reverse=True)rank2.sort(reverse=True)rank = reduce(rank)rank2 = reduce(rank2)
#各取top5的短语record.append(input[i], list(set(rank[:5] + rank2[:5])))np.save('silver.npy', record)
4.总结回顾
我的任务是对extract.py这个关键代码文件进行分析解读,重点学习Doc2vec模型。尽管extract文件的代码只有百行,但是想真正理解透彻,不仅要从阅读论文开始,一点一点地学习,了解这个领域的背景,更好地理解论文这个模型出现的重要性。还要不断进行自我拓展,从基础的模型开始,去利用前人的先前知识和经验,为模型的设计做好充分的铺垫。
因此,我所做的不单单是对每段代码就事论事的分析,还去深入代码用到的工具,了解背后的实现逻辑与思想。现在,经过三周多的时间,阅读各种文献资料,博客代码,进行学习,并与学长,队友进行讨论交流,完成了对extract.py关键代码的分析。学会了如何阅读论文,了解论文,从大量的文字中提取重点信息,去深入了解了word2vec和doc2vec模型的思想及代码的实现,也通过这篇代码,去体会到了这个模型在实际项目中的应用。它对我更好地理解这篇代码,还有很大的帮助。这三篇博客也算是我入门的开始,希望接下来的学习分析过程会更加顺利,收获满满。
Blog5 无监督深度关键短语生成——关键代码分析3相关推荐
- Blog3 无监督深度关键短语生成——关键代码分析1
2021SC@SDUSC 附所有代码链接:https://github.com/Jayshen0/ Unsupervised-Deep-Keyphrase-Generatio 本篇分析代码模块为:ex ...
- 深度学习的关键:无监督深度学习简介(附Python代码)
作者 | Faizan Shaikh 译者 | 马卓奇 编辑 | Vincent AI 前线导读:在这篇文章中,我们用一个直观的案例研究概述了无监督深度学习的概念.并且详解了在 MNIST 数据集上进 ...
- 深圳大学梁臻博士提出EEGFuseNet高维脑电图混合无监督深度特征表征与融合模型及其在情绪识别中的应用...
近期,深圳大学医学部生物医学工程学院梁臻博士(张治国教授团队MIND LAB核心成员)提出一种实用的基于无监督学习的卷积循环混合生成对抗网络,用以实现有效的脑电特征表征与融合,简称为EEGFuseNe ...
- 基于无监督深度学习的单目视觉的深度和自身运动轨迹估计的深度神经模型
本文是对文章<Unsupervised Learning of Depth and Ego-Motion from Video>的解读. Figure 1. 深度图和Ground-Trut ...
- 用于光流估计的无监督深度学习DSTFlow
用于光流估计的无监督深度学习DSTFlow 原文链接 摘要 最近的工作表明,光流估计可以被表述为一个监督学习问题. 此外,卷积网络已成功应用于此任务. 然而,监督流学习由于缺乏标记的训练数据而变得 ...
- MPASNET:用于视频场景中无监督深度人群分割的运动先验感知SIAMESE网络
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 小白导读 论文是学术研究的精华和未来发展的明灯.小白决心每天为大家 ...
- CVPR2019:无监督深度追踪
本文提出了一种无监督的视觉跟踪方法.与使用大量带注释数据进行监督学习的现有方法不同,本文的CNN模型是在无监督的大规模无标签视频上进行训练的.动机是,强大的跟踪器在向前和向后预测中均应有效(即,跟踪器 ...
- TIP 2021 | 重访CV经典!首个无监督深度学习图像拼接框架
点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 作者:廖康 | 已授权转载(源:知乎) https://zhuanlan.zhihu.com/p/386 ...
- 无需成对示例、无监督训练,CycleGAN生成图像简直不要太简单
作者 | Jason Brownlee 译者 | Freesia,Rachel 编辑 | 夕颜 出品 | AI科技大本营(ID: rgznai100) [导读]图像到图像的转换技术一般需要大量的 ...
最新文章
- Android 自定义View之3D骰子旋转
- 文件列表出现分页按钮
- mysql 添加rownum_Mysql 增加rownum
- 构建之法 学习笔记06
- Access库的小问题
- 海量数据选取重复次数最多的n个
- 都说外国电工布线牛到不行?今天就看看中国电工最强布线!
- 《构建之法》阅读笔记02
- Docker最全教程之树莓派和Docker(十六)
- php遍历目录与文件夹的多种方法详解
- 程序员编程实用工具箱
- 小白学六轴传感器MPU6050模块(1)
- STM32入门100步
- sql判断邮箱是否合法_用正则表达式验证邮箱与手机号的合法性
- java 日期转大写,java步骤转换大写日期及人民币大写转换方式 .txt
- 推荐系统实战(四)——利用社交网络数据
- 有赞 CTO 崔玉松:我想打造出中国最好的技术团队
- Elastic认证考试过程(2022.11.13 06:15)
- 【线性代数】第一章 1.3逆矩阵
- 用Leangoo管理用户故事