2021SC@SDUSC
继配置好该课题代码实验环境后,小组分工后,后续多篇文章将对 vectorize.py中的代码部分内容进行分析。
代码link:https://github.com/rikdz/GraphWriter
通过论文大致分析可知,vectorize.py是编码器的一部分,包括原始图向未标记连接图的重构,保留标签信息等。本篇文章将对vectorize.py中dataset类中如下代码进行详细分析。
def __init__(self, args):
args.path = args.datadir + args.data
self.args = args
'''
if args.loadvocab:
with open(args.datadir+"/"+args.loadvocab,'rb') as f:
print("Loading Vocabs")
self.fields = dill.load(f)
self.INP,self.ENT,self.REL,self.TGT,self.OUTP = [x[1] for x in self.fields]
else:
'''
self.mkVocabs(args)
print("Vocab sizes:")
for x in self.fields:
try:
print(x[0],len(x[1].vocab))
except:
pass
'''
if args.savevocab:
with open(args.datadir+"/"+args.savevocab,'wb') as f:
dill.dump(self.fields,f)
'''
if not args.eval:
self.mkiters()
def build_ent_vocab(self,path,unkat=0):
ents = ""
with open(path) as f:
for l in f:
ents += " "+l.split("t")[1]
itos = list(set(ents.split(" ")))
itos[0] == ""; itos[1] == ""
stoi = {x:i for i,x in enumerate(itos)}
return itos,stoi
首先需要对该类进行初始化,_init_函数实现了这点。它是一个类方法/类函数,类方法是对类中定义的函数的称呼,有别于一般函数的是,它的第一个参数是固定的,表示类实例化后实例本身,后面的参数则可以自由定义。在该函数中,第一个参数为self,即为原始图实例,第二个参数为自由定义的args。
args.path = args.datadir + args.data self.args = args
设置了args的path属性为args的datadir(数据目录)和data(数据)的拼接。self.args = args,使该类具有函数行为。
self.mkVocabs(args)
print("Vocab sizes:")
for x in self.fields:
try:
print(x[0],len(x[1].vocab))
except:
pass
'''
if args.savevocab:
with open(args.datadir+"/"+args.savevocab,'wb') as f:
dill.dump(self.fields,f)
'''
if not args.eval:
self.mkiters()
根据数据目录打开数据文件时,会判断文件是否正确打开,当能够成功打开时,数据载入成功,self.mkvocabs(args)记录成功载入的数据。并由一个for循环遍历self的数据域,并分割输出,如果和args打开的数据不相同,则调用mkiters重新迭代(载入)。
def build_ent_vocab(self,path,unkat=0):
ents = ""
with open(path) as f:
for l in f:
ents += " "+l.split("t")[1]
itos = list(set(ents.split(" ")))
itos[0] == ""; itos[1] == ""
stoi = {x:i for i,x in enumerate(itos)}
return itos,stoi
build_ent_vocab函数实现了创建发送词汇。同理第一个参数为self,path,unkat为自定义参数,并给unkat一个初始值为0,表示未转换。
初始情况下,ents(可以发送的词汇)为空,这时打开path路径,遍历分词逐个于“ ”拼接赋值于ents。itos用于存放 ents根据“ ”分词的列表。采用的是自然语言分类模型,初始化itos第一个值为unk,第二个值为pad,enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,在这里将itos组合为索引序列存放在stoi中,返回是数据对象itos,和索引序列(含数据)stoi。



