其他分享
首页 > 其他分享> > RGAT-ABSA数据处理过程

RGAT-ABSA数据处理过程

作者:互联网

1.如果训练数据采用的编码方式是Bert,则通过BertTokenizer.from_pretrained(args.bert_model_dir)来加载预训练模型和训练的参数。

2.加载train_dataset训练数据,test_dataset测试数据,word_vocab数据的词表,dep_tag_vocab依存关系词表还有dep_tag_vocab单词词性词表。

数据形式:

train_dataset,test_dataset的形式:

sentence_ids 句子中单词对应的词表id
aspect_ids 方面词对应词表中的索引
dep_tag_ids 依存关系对应依存关系词表中的索引
dep_dir_ids 依存关系方向 1表示以方面词为起点的依存关系 2表示以方面词为终止位置的依存关系
pos_class 单词的词性
text_len 句子中单词的个数,句子的长度
aspect_len 方面词的个数
sentiment 方面词对应的极性
deprel_ids 真实的依存关系对应依存关系词表的索引
dephead 依存关系头位置
aspect_position  方面词在句子中位置,如果对应位置是方面词则为1,否则为0
if bert:如果采用bert编码方式,就不需要sentence_ids和aspect_ids了,用以下的列表代替,它们是根据bert模型自带的词表获取的单词索引
    input_ids
    word_indexer
    input_aspect_ids
    aspect_indexer
or:如果是pure_bert那么就把句子和方面进行拼接,来进行训练和预测
    input_cat_ids
    segment_ids

word_vocab  dep_tag_vocab dep_tag_vocab它们的形式相同,都是以下的形式

{'itos': ['[PAD]', '[UNK]', 'the', ',', 'was', '.', 'but', 'to'], 'stoi': defaultdict(<function _default_unk_index at 0x0000029DBC50AA60>, {'[PAD]': 0, '[UNK]': 1, 'the': 2, ',': 3, 'was': 4, '.': 5, 'but': 6, 'to': 7}), 'len': 8}

word_vocab形式,itos是词按照出现次数从多到少进行排序,stoi是itos中的每个词对应的索引
 {'itos': itos, 'stoi': stoi, 'len': len(itos)}

数据构造过程:

train_dataset和test_dataset的构造过程:

(1)将原始的xml数据解析成json的形式得到input_data数据

tags是句子中每个单词的词性,predicted_dependencies是每个单词所连接的依存关系,predicted_heads是依存关系的头,终止位置就是当前单词的位置,dependencies就是依存关系以及依存关系的起止位置,from_to就是方面词的起止位置。

{"sentence": "But the staff was so horrible to us.", 
"tokens": ["But", "the", "staff", "was", "so", "horrible", "to", "us", "."],
"tags": ["CC", "DT", "NN", "VBD", "RB", "JJ", "IN", "PRP", "."],
"predicted_dependencies": ["cc", "det", "nsubj", "cop", "advmod", "root", "prep", "pobj", "punct"],
"predicted_heads": [6, 3, 6, 6, 6, 0, 6, 7, 6],
"dependencies": [["cc", 6, 1], ["det", 3, 2], ["nsubj", 6, 3], ["cop", 6, 4], ["advmod", 6, 5],
["root", 0, 6], ["prep", 6, 7], ["pobj", 7, 8], ["punct", 6, 9]],
"aspect_sentiment": [["staff", "negative"]], "from_to": [[2, 3]]}

(2)对于输入的数据,每个句子可能有多个方面词,我们要将它处理成每次一个句子只对应一个方面词,并且对依赖树进行裁剪,让方面词作为root,保留与方面词直接相连的词之间的依存关系,其他关系进行去除,取而代之的是新建的n_con关系,当与方面词之间没有直接的依赖关系并且与方面词之间的距离大于4,直接不构建关系。利用get_rolled_and_unrolled_data(input_data, args):这一函数进行处理。

构建新的依赖树的过程:循环遍历一个句子的依存关系,如果依存关系的起始位置是方面词,依存关系的终止位置如果满足条件(不在方面词的范围之内,并且位置不是0,而且dep_idx里面没有这一位置)就把这一依存关系加入到dep_tag这一
列表中,并且将1添加到dep_dir中,代表这一依存关系是以方面词为起始位置的。并且把依存关系的终止位置(不是方面词的位置)添加到dep_idx中。
如果依存关系的终止位置是方面词,并且依存关系的起始位置满足条件(不在方面词的范围之内,并且位置不是0,而且dep_idx里面没有这一位置),就把这一依存关系加入到dep_tag这一列表中,把2添加到dep_dir中,代表这一依存关系是以
方面词为终止位置的,并且把依存关系的起始位置添加到dep_idx这一列表中。这时只构建了与方面词直接相连的依存关系,下面就要舍弃不与方面词直接相连的依存关系,取而代之的是新的依存关系n_con.
还有一些词没有与方面词建立依存关系,这是就用n_con替代,遍历dep_idx,如果dep_idx里面的值是依存关系的起始位置,并且依存关系的终止位置不是根,不是方面词也不在dep_idx中,就把加入到dep_idx列表中,并把1加入到dep_dir中,
代表这一新的依存关系是以方面词为起始位置的,这一关系的名称为ncon_2,因为这一依存关系与方面词连接的另一头是通过与方面词直接相连的词找到的,在进行循环时,是通过上一轮添加如dep_idx的值找到的,这是依存关系的名称就是
ncon_3,因为循环的次数通过
max_hop控制,循环完成之后还是会有没有与方面词建立依存关系的词,这些词就建立一种特殊的非链接关系,non-connect填充到dep_tag中,用0填充到dep_dir.将这些词的位置填充到dep_idx中。
将dep_idx中的值进行排序,让依存关系和句子的词相对应,dep_tag中第一个位置的依存关系就是第一个词的依存关系,第二个位置的依存关系就是第二个词的依存关系。
最终获取的修建的依赖树的依存关系如下:

 

首先将句子中的所有大写字母转成小写字母,获取方面词的起止位置,构造新的依赖树,构造依赖树的函数如下:

args.add_non_connect 是否构建新的n_con依存关系
args.max_hop这一新的依存关系方面词与其他词之间的距离限制
dep_tag, dep_idx, dep_dir = reshape_dependency_tree_new(frm, to, e['dependencies'],
multi_hop=args.multi_hop, add_non_connect=args.add_non_connect, tokens=e['tokens'], max_hop=args.max_hop)
# dep_tag是修剪之后的依赖树的依存关系
dep_tag = []
# dep_idx是依赖树中以方面词为起始位置,dep_idx为终止位置的依存关系
dep_idx = []
# 代表依存关系的方向,1代表以方面词为起始位置,2代表以方面词为终止位置
dep_dir = []

构建新的依赖树的过程:循环遍历一个句子的依存关系,如果依存关系的起始位置是方面词,依存关系的终止位置如果满足条件(不在方面词的范围之内,并且位置不是0,而且dep_idx里面没有这一位置)就把这一依存关系加入到dep_tag这一
列表中,并且将1添加到dep_dir中,代表这一依存关系是以方面词为起始位置的。并且把依存关系的终止位置(不是方面词的位置)添加到dep_idx中。
如果依存关系的终止位置是方面词,并且依存关系的起始位置满足条件(不在方面词的范围之内,并且位置不是0,而且dep_idx里面没有这一位置),就把这一依存关系加入到dep_tag这一列表中,把2添加到dep_dir中,代表这一依存关系是以
方面词为终止位置的,并且把依存关系的起始位置添加到dep_idx这一列表中。这时只构建了与方面词直接相连的依存关系,下面就要舍弃不与方面词直接相连的依存关系,取而代之的是新的依存关系n_con.
还有一些词没有与方面词建立依存关系,这是就用n_con替代,遍历dep_idx,如果dep_idx里面的值是依存关系的起始位置,并且依存关系的终止位置不是根,不是方面词也不在dep_idx中,就把加入到dep_idx列表中,并把1加入到dep_dir中,
代表这一新的依存关系是以方面词为起始位置的,这一关系的名称为ncon_2,因为这一依存关系与方面词连接的另一头是通过与方面词直接相连的词找到的,在进行循环时,是通过上一轮添加如dep_idx的值找到的,这是依存关系的名称就是
ncon_3,因为循环的次数通过
max_hop控制,循环完成之后还是会有没有与方面词建立依存关系的词,这些词就建立一种特殊的非链接关系,non-connect填充到dep_tag中,用0填充到dep_dir.将这些词的位置填充到dep_idx中。
将dep_idx中的值进行排序,让依存关系和句子的词相对应,dep_tag中第一个位置的依存关系就是第一个词的依存关系,第二个位置的依存关系就是第二个词的依存关系。
最终获取的修建的依赖树的依存关系如下:








[{'sentence': ['but', 'the', 'staff', 'was', 'so', 'horrible', 'to', 'us', '.'], 'tags': ['CC', 'DT', 'NN', 'VBD', 'RB', 'JJ', 'IN', 'PRP', '.'],
'pos_class': ['CC', 'DT', 'NN', 'VBD', 'RB', 'JJ', 'IN', 'PRP', '.'], 'aspect': ['staff'], 'sentiment': 0,
'predicted_dependencies': ['cc', 'det', 'nsubj', 'cop', 'advmod', 'root', 'prep', 'pobj', 'punct'],
'predicted_heads': [6, 3, 6, 6, 6, 0, 6, 7, 6], 'from': 2, 'to': 3, 'dep_tag': ['ncon_2', 'det', '<pad>', 'ncon_2', 'ncon_2', 'nsubj', 'ncon_2', 'ncon_3', '<pad>'],
'dep_idx': [0, 1, 2, 3, 4, 5, 6, 7, 8], 'dep_dir': [1, 1, 0, 1, 1, 2, 1, 1, 0],
'dependencies': [['cc', 6, 1], ['det', 3, 2], ['nsubj', 6, 3], ['cop', 6, 4], ['advmod', 6, 5], ['root', 0, 6], ['prep', 6, 7], ['pobj', 7, 8], ['punct', 6, 9]]}]

(3)根据被修剪的依赖树和依存关系构建单词向量,单词和依存关系以及单词词性的词表,比按照出现次数从多到少进行排序,并保存为pkl文件

word_vecs, word_vocab, dep_tag_vocab, pos_tag_vocab = load_and_cache_vocabs(
        train_all_unrolled+test_all_unrolled, args)
构建数据的词表,word_vocab形式,itos是词按照出现次数从多到少进行排序,stoi是itos中的每个词对应的索引 {'itos': itos, 'stoi': stoi, 'len': len(itos)},将统计的词表数据序列化,填写进入
cached_word_vocab_file,最终保存的文件的格式时pkl文件。
获取词向量 word_vecs,如果是glove词向量,看单词是否在glove词典中,如果在就获取词向量,如果是<pad>就创建一个300维的全为0的张量,不满足以上两个条件,就从一个均匀分布中随机采样。如果编码方式不是glove,word_vocab
和word_vecs都返回空。
dep_tag_vocab和pos_tag_vocab与word_vocab是相同的构造方式
(4)我们创建了词表,依存关系表和词性表,计算机进行处理的时候要将它们转换成数字进行计算。
获取数据中句子和方面词的索引,如果是glove或者elmo的编码方式,就根据之前我们从数据集
中统计的词表获取索引,如果是bert编码,就根据bert自带的词表获取索引,如果是bert类型,就句子和方面词分开进行训练,如果是pure_Bert就要将句子和方面词进行拼接训练。
Return from getitem:
        sentence_ids
        aspect_ids
        dep_tag_ids
        dep_dir_ids
        pos_class
        text_len
        aspect_len
        sentiment
        deprel
        dephead
        aspect_position
        if bert:
            input_ids
            word_indexer
            input_aspect_ids
            aspect_indexer
        or:
            input_cat_ids
            segment_ids

 

 


  

 

标签:RGAT,idx,dep,位置,ids,tag,ABSA,数据处理,依存关系
来源: https://www.cnblogs.com/zhang12345/p/16093552.html