神经网络的parser源代码学习(一)

一:源数据data文件夹。

进入data 目录,一共有以下几个文件:

ctb_dev.jsonl:开发集

ctb_test.jsonl:测试文件,存放用于测试用的句子,存放格式如下所示:该句子对应的动作序列+该句子的分词结果+该句子的词性标签 共1910句

ctb_train.jsonl:训练文件,存放用于训练模型参数的句子,存放格式和测试文件一样,以句子为单位:该句子对应的动作序列+该句子的分词结果+该句子的词性标签 共16091句

data_pro_ctb5.py:暂时没看懂这个Python文件的作用。。

generate_trainData.py:起转换文件格式的作用,真正的语料是ctb的树库语料,要将其转换为ctb_test.jsonl的格式,也就是下图转换为该句子对应的  动作序列+该句子的分词结果+该句子的词性标签

二:结果数据results文件夹:

进入results文件夹一共有以下几个文件

vector_cache文件夹里存放的input_vector.pt:生成的词向量文件

glove.840B.300d.pt:运行程序生成的词向量文件(为什么是乱码)

glove.840B.300d.txt:事先训练好放进去的词向量文件,大约有10万个词向量。(如果替换语料的话,需要将这个文件注释或者替换为相应语言的词向量)

三:torchtext文件夹:东西太多,暂时略过

四:最后home目录下只剩下一大堆Python文件

------------------------------------------------------------------------------------------阅读ctbtrain文件的源代码-----------------------------------------------------------------------------------

ctbtrain是训练模型参数文件

开始阅读ctbtrain.py文件代码:

1. inputs transitions pos分别代表输入训练文件中的词,操作序列,词性标签。

运行程序打印输出三者的内容:

inputs:<torchtext.datasets.ctb.TextField object at 0x7f87ce600310>
transitions:<torchtext.data.Field object at 0x7f87ce5af110>

inputs.vocab.itos代表什么意思啊???代表的是几个转移动作的标签。

2.设置词向量的维度,但是不知道具体对应什么样的维度?

config = args(很重要的一个model)args就是一个parser模型,PyTorch/torchtext SNLI example
config.n_embed = len(inputs.vocab)
config.d_out = len(transitions.vocab)
config.n_cells = config.n_layers

3.build_vocab函数指的是构建词典,输入均是训练语料。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

evalue是测试文件,主要是评估函数my_evalue( )的实现过程,实现对测试集和开发集的评测,输出的是precision 和 Parser_precision的值。

spinn函数:定义分类器模型和tree模型。

util是模型参数的设置文件,打开如下所示

诸如迭代次数,是否使用GPU等。params.pkl 是什么鬼 打开是乱码

testlog_lstm_wbud和trainlog_lstm_wbud分别是日志记录文件,记录测试和训练过程中的准确率。不太明白的是这个准确率和evalue函数输出的准备率有啥区别。

-------------------------------------------------------------------------------model文件---------------------------------------------------------------------------------------------------------------------------

定义了class SNLIClassifier:

 

-----------------------------------------------------------------------程序包分析暂时结束,先执行下程序------------------------------------------------------------

源程序是进行中文的依存分析  我重新训练,打算用英文来知行:

一:输入训练文件格式如下(为了短期内看到效果,也就是让程序在5小时内完成,我选择语料的规模是500句。):

二:语料预处理(有个地方没想明白,但从树库语料,如何可以预测出shift-reduce转移动作)

1.调用generate函数,生成测试文件格式的语料:生成的测试文件语料格式为 原句子的词组+动作序列+词性词组序列(和原来中文的语料不太一样)

三:训练模型

1.在训练模型的时候会看到以下文件

分别为开发集  测试集 训练集  切割文件函数  生成测试集函数

执行ctbtrain.py会自动调用data文件夹下的训练集  也就是ctb_train.jsonl。

训练模型需要很久的时间,现在先看一下训练模型的ctbtrain.py文件源代码:(。。。。。。。。。。。。。)

执行结果:

前几次执行一直报错(报以下的错)一直不知道什么原因,后来才发现是更改语料后,不能再使用原来预先训练好的词向量。

 最后训练集的规模有500句,开发和测试集各为100,执行了三个小时(中文),实验结果如下所示:

evalue_test_data:parser_pre: 73.8814317673

evalue_dev_data:parser_pre: 79.2047531993

替换为英文语料:500句 执行了六个小时。实验结果如下,和中文一样,迭代了49次

测试集:parser_pre: 90.2559867878

开发集:parser_pre: 90.2559867878这里测试集合开发集都一样。

原文地址:https://www.cnblogs.com/maowuyu-xb/p/8418363.html