日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

TPLinker 联合抽取 实体链接方式+源码分析

發(fā)布時(shí)間:2024/7/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TPLinker 联合抽取 实体链接方式+源码分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(guān)系抽取–TPLinker: https://blog.csdn.net/weixin_42223207/article/details/116425447


Tagging
TPLinker模型需要對(duì)關(guān)系三元組(subject, relation, object)進(jìn)行手動(dòng)Tagging,過程分為三部分:
(1)entity head to entity tail (EH-TO-ET)
(2)subject head to object head (SH-to-OH)
(3)subject tail to object tail (ST-to-OT)
標(biāo)記示例見下圖,EH-TO-ET用紫色表示,SH-to-OH用紅色表示,ST-to-OT用藍(lán)色表示。

論文筆記:路由器 TPLinker 也來做關(guān)系抽取:https://zhuanlan.zhihu.com/p/304104571


關(guān)系抽取之TPLinker解讀加源碼分析:https://zhuanlan.zhihu.com/p/342300800

關(guān)于解碼過程
通過實(shí)體抽取得到字典D后,遍歷關(guān)系,通過關(guān)系得到有關(guān)系的兩個(gè)實(shí)體的尾部E, 再通過關(guān)系得到有關(guān)系的兩個(gè)實(shí)體的頭部,結(jié)合字典D得到這兩個(gè)實(shí)體尾部set(s),set(o)(此為真實(shí)的標(biāo)簽),再通過set(s),set(o)在不在E里面,來判斷是否成功抽取了一條三元組。
其中相關(guān)的公式:
文章的大概內(nèi)容進(jìn)行了解讀,現(xiàn)在到了代碼解讀環(huán)節(jié):
輸入數(shù)據(jù)部分:
輸入的seq的長(zhǎng)度為seq_len ,獲取句子的最大長(zhǎng)度

train and valid max token num

max_tok_num = 0 all_data = train_data + valid_data for sample in all_data:tokens = tokenize(sample["text"])max_tok_num = max(max_tok_num, len(tokens)) max_tok_num # 獲取句子的最大長(zhǎng)度

接下來對(duì)文本超過長(zhǎng)度的進(jìn)行劃窗處理:

if max_tok_num > hyper_parameters["max_seq_len"]: # 截?cái)嚅L(zhǎng)度train_data = preprocessor.split_into_short_samples(train_data, hyper_parameters["max_seq_len"], sliding_len = hyper_parameters["sliding_len"], encoder = config["encoder"] #超過長(zhǎng)度則滑動(dòng)窗口得到新的樣本) valid_data = preprocessor.split_into_short_samples(valid_data, hyper_parameters["max_seq_len"], sliding_len = hyper_parameters["sliding_len"], encoder = config["encoder"])

接下來看劃窗的具體操作

def split_into_short_samples(self, sample_list, max_seq_len, sliding_len = 50, encoder = "BERT", data_type = "train"):new_sample_list = []for sample in tqdm(sample_list, desc = "Splitting into subtexts"):text_id = sample["id"]text = sample["text"]tokens = self._tokenize(text)tok2char_span = self._get_tok2char_span_map(text) #返回句子中單詞的偏移量# sliding at token levelsplit_sample_list = []for start_ind in range(0, len(tokens), sliding_len): #sliding_len 滑動(dòng)窗口的大小,if encoder == "BERT": # if use bert, do not split a word into two sampleswhile "##" in tokens[start_ind]:start_ind -= 1end_ind = start_ind + max_seq_len # 結(jié)束的長(zhǎng)度char_span_list = tok2char_span[start_ind:end_ind] #截?cái)?/span>char_level_span = [char_span_list[0][0], char_span_list[-1][1]] #第一個(gè)詞到最后一個(gè)詞的長(zhǎng)度sub_text = text[char_level_span[0]:char_level_span[1]]#原始文本截?cái)?/span>new_sample = {"id": text_id,"text": sub_text,"tok_offset": start_ind, #token的偏移量"char_offset": char_level_span[0], #每個(gè)字符的偏移量}if data_type == "test": # test setif len(sub_text) > 0:split_sample_list.append(new_sample)else: # train or valid dataset, only save spo and entities in the subtext# sposub_rel_list = []for rel in sample["relation_list"]:subj_tok_span = rel["subj_tok_span"]obj_tok_span = rel["obj_tok_span"]# if subject and object are both in this subtext, add this spo to new sampleif subj_tok_span[0] >= start_ind and subj_tok_span[1] <= end_ind \and obj_tok_span[0] >= start_ind and obj_tok_span[1] <= end_ind: new_rel = copy.deepcopy(rel)new_rel["subj_tok_span"] = [subj_tok_span[0] - start_ind, subj_tok_span[1] - start_ind] # start_ind: 單詞級(jí)別的偏移量new_rel["obj_tok_span"] = [obj_tok_span[0] - start_ind, obj_tok_span[1] - start_ind]new_rel["subj_char_span"][0] -= char_level_span[0] # 字符級(jí)別的偏移量new_rel["subj_char_span"][1] -= char_level_span[0]new_rel["obj_char_span"][0] -= char_level_span[0]new_rel["obj_char_span"][1] -= char_level_span[0]sub_rel_list.append(new_rel)# entitysub_ent_list = []for ent in sample["entity_list"]:tok_span = ent["tok_span"]# if entity in this subtext, add the entity to new sampleif tok_span[0] >= start_ind and tok_span[1] <= end_ind: new_ent = copy.deepcopy(ent)new_ent["tok_span"] = [tok_span[0] - start_ind, tok_span[1] - start_ind]new_ent["char_span"][0] -= char_level_span[0]new_ent["char_span"][1] -= char_level_span[0]sub_ent_list.append(new_ent)# eventif "event_list" in sample:sub_event_list = []for event in sample["event_list"]:trigger_tok_span = event["trigger_tok_span"]if trigger_tok_span[1] > end_ind or trigger_tok_span[0] < start_ind:continuenew_event = copy.deepcopy(event)new_arg_list = []for arg in new_event["argument_list"]:if arg["tok_span"][0] >= start_ind and arg["tok_span"][1] <= end_ind:new_arg_list.append(arg)new_event["argument_list"] = new_arg_listsub_event_list.append(new_event)new_sample["event_list"] = sub_event_list # maybe emptynew_sample["entity_list"] = sub_ent_list # maybe emptynew_sample["relation_list"] = sub_rel_list # maybe emptysplit_sample_list.append(new_sample)# all segments covered, no need to continueif end_ind > len(tokens):breaknew_sample_list.extend(split_sample_list)return new_sample_list

輸入數(shù)據(jù),DataMaker4Bert中定義:

class DataMaker4Bert():def __init__(self, tokenizer, handshaking_tagger):self.tokenizer = tokenizerself.handshaking_tagger = handshaking_taggerdef get_indexed_data(self, data, max_seq_len, data_type = "train"): #index轉(zhuǎn)換為dataindexed_samples = []for ind, sample in tqdm(enumerate(data), desc = "Generate indexed train or valid data"):text = sample["text"]# codes for bert inputcodes = self.tokenizer.encode_plus(text, return_offsets_mapping = True, add_special_tokens = False,max_length = max_seq_len, truncation = True,pad_to_max_length = True)# taggingspots_tuple = Noneif data_type != "test":spots_tuple = self.handshaking_tagger.get_spots(sample) #獲取實(shí)體,頭,尾標(biāo)簽# get codesinput_ids = torch.tensor(codes["input_ids"]).long()attention_mask = torch.tensor(codes["attention_mask"]).long()token_type_ids = torch.tensor(codes["token_type_ids"]).long()tok2char_span = codes["offset_mapping"]sample_tp = (sample,input_ids,attention_mask,token_type_ids,tok2char_span,spots_tuple,)indexed_samples.append(sample_tp) return indexed_samples

輸入的是tokenizer和handshakingtagger,tokenizer為bert等一系列模型的標(biāo)準(zhǔn)輸入,而get_spots函數(shù)獲取了實(shí)體,頭,尾的標(biāo)簽,具體看下代碼

def get_spots(self, sample):'''entity spot and tail_rel spot: (span_pos1, span_pos2, tag_id)head_rel spot: (rel_id, span_pos1, span_pos2, tag_id)'''ent_matrix_spots, head_rel_matrix_spots, tail_rel_matrix_spots = [], [], [] for rel in sample["relation_list"]:subj_tok_span = rel["subj_tok_span"]obj_tok_span = rel["obj_tok_span"]ent_matrix_spots.append((subj_tok_span[0], subj_tok_span[1] - 1, self.tag2id_ent["ENT-H2T"])) #sub token的[起始位置,尾部位置,實(shí)體標(biāo)簽(1)]ent_matrix_spots.append((obj_tok_span[0], obj_tok_span[1] - 1, self.tag2id_ent["ENT-H2T"]))# obj token的[起始位置,尾部位置,實(shí)體標(biāo)簽(1)]if subj_tok_span[0] <= obj_tok_span[0]:head_rel_matrix_spots.append((self.rel2id[rel["predicate"]], subj_tok_span[0], obj_tok_span[0], self.tag2id_head_rel["REL-SH2OH"]))#【關(guān)系類別,實(shí)體_1 頭部,實(shí)體_2頭部,關(guān)系標(biāo)簽(1)】else:head_rel_matrix_spots.append((self.rel2id[rel["predicate"]], obj_tok_span[0], subj_tok_span[0], self.tag2id_head_rel["REL-OH2SH"]))#【關(guān)系類別,實(shí)體_1 頭部,實(shí)體_2頭部,關(guān)系標(biāo)簽(2)】if subj_tok_span[1] <= obj_tok_span[1]:tail_rel_matrix_spots.append((self.rel2id[rel["predicate"]], subj_tok_span[1] - 1, obj_tok_span[1] - 1, self.tag2id_tail_rel["REL-ST2OT"]))#【關(guān)系類別,實(shí)體_1 尾部,實(shí)體_2尾部,關(guān)系標(biāo)簽(1)】else:tail_rel_matrix_spots.append((self.rel2id[rel["predicate"]], obj_tok_span[1] - 1, subj_tok_span[1] - 1, self.tag2id_tail_rel["REL-OT2ST"]))#【關(guān)系類別,實(shí)體_1 尾部,實(shí)體_2尾部,關(guān)系標(biāo)簽(2)】return ent_matrix_spots, head_rel_matrix_spots, tail_rel_matrix_spots 獲取輸入的數(shù)據(jù)indexed_train_data = data_maker.get_indexed_data(train_data, max_seq_len) #獲取輸入 # index_train_data = data_maker.get_indexed_data(train_test_data,max_seq_len) indexed_valid_data = data_maker.get_indexed_data(valid_data, max_seq_len) tokenizer = BertTokenizerFast.from_pretrained(config["bert_path"], add_special_tokens = False, do_lower_case = False) data_maker = DataMaker4Bert(tokenizer, handshaking_tagger) #(sample,input_ids,attention_mask,token_type_ids,tok2char_span,spots_tuple,)

接下來則是定義HandshakingTaggingScheme

max_seq_len = min(max_tok_num, hyper_parameters["max_seq_len"]) #max_len 長(zhǎng)度 rel2id = json.load(open(rel2id_path, "r", encoding = "utf-8")) handshaking_tagger = HandshakingTaggingScheme(rel2id = rel2id, max_seq_len = max_seq_len) #初始化

查看具體的定義

class HandshakingTaggingScheme(object):"""docstring for HandshakingTaggingScheme"""def __init__(self, rel2id, max_seq_len):super(HandshakingTaggingScheme, self).__init__()self.rel2id = rel2idself.id2rel = {ind:rel for rel, ind in rel2id.items()}self.tag2id_ent = { #實(shí)體頭尾"O": 0,"ENT-H2T": 1, # entity head to entity tail}self.id2tag_ent = {id_:tag for tag, id_ in self.tag2id_ent.items()}self.tag2id_head_rel = { #sub,obj頭對(duì)頭標(biāo)識(shí)1,obj頭對(duì)sub頭標(biāo)識(shí)2"O": 0,"REL-SH2OH": 1, # subject head to object head"REL-OH2SH": 2, # object head to subject head}self.id2tag_head_rel = {id_:tag for tag, id_ in self.tag2id_head_rel.items()}self.tag2id_tail_rel = {"O": 0, "REL-ST2OT": 1, # subject tail to object tail"REL-OT2ST": 2, # object tail to subject tail}self.id2tag_tail_rel = {id_:tag for tag, id_ in self.tag2id_tail_rel.items()}# mapping shaking sequence and matrixself.matrix_size = max_seq_len# e.g. [(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)] #轉(zhuǎn)換成矩陣上三角矩陣平鋪self.shaking_ind2matrix_ind = [(ind, end_ind) for ind in range(self.matrix_size) for end_ind in list(range(self.matrix_size))[ind:]]self.matrix_ind2shaking_ind = [[0 for i in range(self.matrix_size)] for j in range(self.matrix_size)]for shaking_ind, matrix_ind in enumerate(self.shaking_ind2matrix_ind): #上三角矩陣,上三角每個(gè)元素儲(chǔ)存著上三角鋪平序列的相對(duì)應(yīng)的位置序號(hào)self.matrix_ind2shaking_ind[matrix_ind[0]][matrix_ind[1]] = shaking_ind

這里比較關(guān)鍵的是shaking_ind2matrix_ind,與matrix_ind2shaking_ind,其中shaking_ind2matrix_ind如下所示,是一個(gè)上三角鋪平序列

[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (0, 10), (0, 11), (0, 12), (0, 13), …]
而matrix_ind2shaking_ind為優(yōu)化前的二維矩陣,其中上三角每個(gè)元素儲(chǔ)存著上三角鋪平序列的相對(duì)應(yīng)的位置序號(hào)

[[0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], …]
最后組成上三角矩陣(打印的結(jié)果沒有填滿)

[[0, 1, 2, 3, 4, 5, 6, 7, 8, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], [0, 0, 0, 0, 0, 0, 0, 0, 0, …], …]
載入數(shù)據(jù)

train_dataloader = DataLoader(MyDataset(indexed_train_data), batch_size = hyper_parameters["batch_size"], shuffle = False, num_workers = 5,drop_last = False,collate_fn = data_maker.generate_batch, )

查看DataLoader的返回值:

def generate_batch(self, batch_data, data_type = "train"):sample_list = []input_ids_list = []attention_mask_list = []token_type_ids_list = [] tok2char_span_list = []ent_spots_list = []head_rel_spots_list = []tail_rel_spots_list = []for tp in batch_data:sample_list.append(tp[0])input_ids_list.append(tp[1])attention_mask_list.append(tp[2]) token_type_ids_list.append(tp[3]) tok2char_span_list.append(tp[4])if data_type != "test":ent_matrix_spots, head_rel_matrix_spots, tail_rel_matrix_spots = tp[5]ent_spots_list.append(ent_matrix_spots)head_rel_spots_list.append(head_rel_matrix_spots)tail_rel_spots_list.append(tail_rel_matrix_spots)# @specific: indexed by bert tokenizerbatch_input_ids = torch.stack(input_ids_list, dim = 0)batch_attention_mask = torch.stack(attention_mask_list, dim = 0)batch_token_type_ids = torch.stack(token_type_ids_list, dim = 0)batch_ent_shaking_tag, batch_head_rel_shaking_tag, batch_tail_rel_shaking_tag = None, None, Noneif data_type != "test":batch_ent_shaking_tag = self.handshaking_tagger.sharing_spots2shaking_tag4batch(ent_spots_list)batch_head_rel_shaking_tag = self.handshaking_tagger.spots2shaking_tag4batch(head_rel_spots_list)batch_tail_rel_shaking_tag = self.handshaking_tagger.spots2shaking_tag4batch(tail_rel_spots_list)return sample_list, \batch_input_ids, batch_attention_mask, batch_token_type_ids, tok2char_span_list, \batch_ent_shaking_tag, batch_head_rel_shaking_tag, batch_tail_rel_shaking_tag

其中比較重要的是batch_ent_shaking_tag, batch_head_rel_shaking_tag, batch_tail_rel_shaking_tag這三個(gè)函數(shù),在實(shí)體batch_ent_shaking_tag中用到了handshaking_tagger的sharing_spots2shaking_tag4batch的函數(shù)

def sharing_spots2shaking_tag4batch(self, batch_spots):'''convert spots to batch shaking seq tag因長(zhǎng)序列的stack是費(fèi)時(shí)操作,所以寫這個(gè)函數(shù)用作生成批量shaking tag如果每個(gè)樣本生成一條shaking tag再stack,一個(gè)32的batch耗時(shí)1s,太昂貴spots: [(start_ind, end_ind, tag_id), ], for entiyreturn: batch_shake_seq_tag: (batch_size, shaking_seq_len)'''shaking_seq_len = self.matrix_size * (self.matrix_size + 1) // 2batch_shaking_seq_tag = torch.zeros(len(batch_spots), shaking_seq_len).long()for batch_id, spots in enumerate(batch_spots):for sp in spots:shaking_ind = self.matrix_ind2shaking_ind[sp[0]][sp[1]] #在矩陣中找到實(shí)體的的start_int,跟end_int的位置值tag_id = sp[2]batch_shaking_seq_tag[batch_id][shaking_ind] = tag_id #鋪平上三角矩陣,標(biāo)注序列中的實(shí)體標(biāo)識(shí)1的位置return batch_shaking_seq_tag

在關(guān)系batch_head_rel_shaking_tag與batch_tail_rel_shaking_tag中用到了spots2shaking_tag4batch

def spots2shaking_tag4batch(self, batch_spots):
‘’’
convert spots to batch shaking seq tag
spots: [(rel_id, start_ind, end_ind, tag_id), ], for head relation and tail_relation
return:
batch_shake_seq_tag: (batch_size, rel_size, shaking_seq_len)
‘’’
shaking_seq_len = self.matrix_size * (self.matrix_size + 1) // 2
batch_shaking_seq_tag = torch.zeros(len(batch_spots), len(self.rel2id), shaking_seq_len).long()
for batch_id, spots in enumerate(batch_spots):
for sp in spots:
shaking_ind = self.matrix_ind2shaking_ind[sp[1]][sp[2]]
tag_id = sp[3]
rel_id = sp[0]
batch_shaking_seq_tag[batch_id][rel_id][shaking_ind] = tag_id
return batch_shaking_seq_tag

跟實(shí)體類似,只是多了關(guān)系總數(shù),然后整個(gè)函數(shù)的返回為

return sample_list,
batch_input_ids, tok2char_span_list,
batch_ent_shaking_tag, batch_head_rel_shaking_tag, batch_tail_rel_shaking_tag

初始化模型

rel_extractor = TPLinkerBert(encoder,
len(rel2id),
hyper_parameters[“shaking_type”],
hyper_parameters[“inner_enc_type”],
hyper_parameters[“dist_emb_size”],
hyper_parameters[“ent_add_dist”],
hyper_parameters[“rel_add_dist”],
)
模型的具體定義

class TPLinkerBert(nn.Module):def __init__(self, encoder, rel_size, shaking_type,inner_enc_type,dist_emb_size,ent_add_dist,rel_add_dist):super().__init__()self.encoder = encoderhidden_size = encoder.config.hidden_sizeself.ent_fc = nn.Linear(hidden_size, 2) #實(shí)體預(yù)測(cè),0,1self.head_rel_fc_list = [nn.Linear(hidden_size, 3) for _ in range(rel_size)] #rel_size多少種關(guān)系self.tail_rel_fc_list = [nn.Linear(hidden_size, 3) for _ in range(rel_size)]# 對(duì)每個(gè)關(guān)系進(jìn)行個(gè)linear層的3分類【0,1,2】for ind, fc in enumerate(self.head_rel_fc_list):self.register_parameter("weight_4_head_rel{}".format(ind), fc.weight) #過3層全連接層self.register_parameter("bias_4_head_rel{}".format(ind), fc.bias) #偏差for ind, fc in enumerate(self.tail_rel_fc_list):self.register_parameter("weight_4_tail_rel{}".format(ind), fc.weight)self.register_parameter("bias_4_tail_rel{}".format(ind), fc.bias)# handshaking kernelself.handshaking_kernel = HandshakingKernel(hidden_size, shaking_type, inner_enc_type)# distance embeddingself.dist_emb_size = dist_emb_sizeself.dist_embbedings = None # it will be set in the first forwardingself.ent_add_dist = ent_add_distself.rel_add_dist = rel_add_dist

self.head_rel_fc_list與self.tail_rel_fc_list相同,是關(guān)系的一個(gè)全連接(標(biāo)簽有三個(gè)0,1,2),每一種關(guān)系有一個(gè)獨(dú)立的MLP層,self.head_rel_fc_list是列表的形式。

上面為關(guān)系和實(shí)體關(guān)系預(yù)測(cè),實(shí)體和各個(gè)關(guān)系都經(jīng)過了mlp層,我們假設(shè)有5種關(guān)系,則會(huì)有11層MLP即為:1個(gè)實(shí)體預(yù)測(cè)層+(1個(gè)頭部層+1個(gè)尾部層)*5

def forward(self, input_ids, attention_mask, token_type_ids):# input_ids, attention_mask, token_type_ids: (batch_size, seq_len)context_outputs = self.encoder(input_ids, attention_mask, token_type_ids) # 0 last_hidden 1 pooled# last_hidden_state: (batch_size, seq_len, hidden_size)last_hidden_state = context_outputs[0]# shaking_hiddens: (batch_size, 1 + ... + seq_len, hidden_size)shaking_hiddens = self.handshaking_kernel(last_hidden_state) #鋪平上三角矩陣shaking_hiddens4ent = shaking_hiddensshaking_hiddens4rel = shaking_hiddens# add distance embeddings if it is setif self.dist_emb_size != -1:# set self.dist_embbedingshidden_size = shaking_hiddens.size()[-1]if self.dist_embbedings is None:dist_emb = torch.zeros([self.dist_emb_size, hidden_size]).to(shaking_hiddens.device)for d in range(self.dist_emb_size):for i in range(hidden_size):if i % 2 == 0:dist_emb[d][i] = math.sin(d / 10000**(i / hidden_size))else:dist_emb[d][i] = math.cos(d / 10000**((i - 1) / hidden_size))seq_len = input_ids.size()[1]dist_embbeding_segs = []for after_num in range(seq_len, 0, -1): #鋪平dist_embbeding_segs.append(dist_emb[:after_num, :])self.dist_embbedings = torch.cat(dist_embbeding_segs, dim = 0)if self.ent_add_dist:shaking_hiddens4ent = shaking_hiddens + self.dist_embbedings[None,:,:].repeat(shaking_hiddens.size()[0], 1, 1)if self.rel_add_dist:shaking_hiddens4rel = shaking_hiddens + self.dist_embbedings[None,:,:].repeat(shaking_hiddens.size()[0], 1, 1)# if self.dist_emb_size != -1 and self.ent_add_dist: # shaking_hiddens4ent = shaking_hiddens + self.dist_embbedings[None,:,:].repeat(shaking_hiddens.size()[0], 1, 1) # else: # shaking_hiddens4ent = shaking_hiddens # if self.dist_emb_size != -1 and self.rel_add_dist: # shaking_hiddens4rel = shaking_hiddens + self.dist_embbedings[None,:,:].repeat(shaking_hiddens.size()[0], 1, 1) # else: # shaking_hiddens4rel = shaking_hiddensent_shaking_outputs = self.ent_fc(shaking_hiddens4ent) #實(shí)體預(yù)測(cè),(0,1)head_rel_shaking_outputs_list = []nn.ModuleList()for fc in self.head_rel_fc_list:head_rel_shaking_outputs_list.append(fc(shaking_hiddens4rel)) #對(duì)每一種關(guān)系頭進(jìn)行分類tail_rel_shaking_outputs_list = []for fc in self.tail_rel_fc_list: #對(duì)每一種關(guān)系尾進(jìn)行分類tail_rel_shaking_outputs_list.append(fc(shaking_hiddens4rel))head_rel_shaking_outputs = torch.stack(head_rel_shaking_outputs_list, dim = 1) #n種關(guān)系拼接在一起tail_rel_shaking_outputs = torch.stack(tail_rel_shaking_outputs_list, dim = 1) #n種關(guān)系拼接在一起return ent_shaking_outputs, head_rel_shaking_outputs, tail_rel_shaking_outputs

ent_shaking_outputs為實(shí)體預(yù)測(cè),head_rel_shaking_outputs_list對(duì)關(guān)系頭進(jìn)行分類,tail_rel_shaking_outputs_list對(duì)關(guān)系尾進(jìn)行分類,其中關(guān)鍵函數(shù)shaking_hiddens4ent中的HandshakingKernel函數(shù)定義如下

class HandshakingKernel(nn.Module):def __init__(self, hidden_size, shaking_type, inner_enc_type):super().__init__()self.shaking_type = shaking_typeif shaking_type == "cat":self.combine_fc = nn.Linear(hidden_size * 2, hidden_size) #fc層elif shaking_type == "cat_plus":self.combine_fc = nn.Linear(hidden_size * 3, hidden_size)elif shaking_type == "cln":self.tp_cln = LayerNorm(hidden_size, hidden_size, conditional = True)elif shaking_type == "cln_plus":self.tp_cln = LayerNorm(hidden_size, hidden_size, conditional = True)self.inner_context_cln = LayerNorm(hidden_size, hidden_size, conditional = True)self.inner_enc_type = inner_enc_type #一層單向lstmif inner_enc_type == "mix_pooling":self.lamtha = Parameter(torch.rand(hidden_size))elif inner_enc_type == "lstm":self.inner_context_lstm = nn.LSTM(hidden_size, hidden_size, num_layers = 1, bidirectional = False, batch_first = True)def enc_inner_hiddens(self, seq_hiddens, inner_enc_type = "lstm"):# seq_hiddens: (batch_size, seq_len, hidden_size)def pool(seqence, pooling_type):if pooling_type == "mean_pooling":pooling = torch.mean(seqence, dim = -2)elif pooling_type == "max_pooling":pooling, _ = torch.max(seqence, dim = -2)elif pooling_type == "mix_pooling":pooling = self.lamtha * torch.mean(seqence, dim = -2) + (1 - self.lamtha) * torch.max(seqence, dim = -2)[0]return poolingif "pooling" in inner_enc_type:inner_context = torch.stack([pool(seq_hiddens[:, :i+1, :], inner_enc_type) for i in range(seq_hiddens.size()[1])], dim = 1)elif inner_enc_type == "lstm":inner_context, _ = self.inner_context_lstm(seq_hiddens)return inner_contextdef forward(self, seq_hiddens):'''seq_hiddens: (batch_size, seq_len, hidden_size)return:shaking_hiddenss: (batch_size, (1 + seq_len) * seq_len / 2, hidden_size) (32, 5+4+3+2+1, 5)'''#一句話中每個(gè)字與剩下的字構(gòu)成上三角矩陣如:長(zhǎng)度為5則的到的為[[batch,5,hidden_size],[batch,4,hidden_size]...]seq_len = seq_hiddens.size()[-2] #句子的長(zhǎng)度shaking_hiddens_list = []for ind in range(seq_len):hidden_each_step = seq_hiddens[:, ind, :] #取每個(gè)batch的每個(gè)字的維度visible_hiddens = seq_hiddens[:, ind:, :] # 從當(dāng)前取到最后repeat_hiddens = hidden_each_step[:, None, :].repeat(1, seq_len - ind, 1) #復(fù)制dim=1的維度跟visible維度保持一致if self.shaking_type == "cat":#選擇的是cat模式,可以在配置文件中設(shè)置shaking_hiddens = torch.cat([repeat_hiddens, visible_hiddens], dim = -1) #將當(dāng)前每個(gè)字的維度與其后的每個(gè)字的維度拼接在一起shaking_hiddens = torch.tanh(self.combine_fc(shaking_hiddens))#過一個(gè)線性層elif self.shaking_type == "cat_plus":inner_context = self.enc_inner_hiddens(visible_hiddens, self.inner_enc_type)shaking_hiddens = torch.cat([repeat_hiddens, visible_hiddens, inner_context], dim = -1)shaking_hiddens = torch.tanh(self.combine_fc(shaking_hiddens))elif self.shaking_type == "cln":shaking_hiddens = self.tp_cln(visible_hiddens, repeat_hiddens)elif self.shaking_type == "cln_plus":inner_context = self.enc_inner_hiddens(visible_hiddens, self.inner_enc_type)shaking_hiddens = self.tp_cln(visible_hiddens, repeat_hiddens)shaking_hiddens = self.inner_context_cln(shaking_hiddens, inner_context)shaking_hiddens_list.append(shaking_hiddens) #添加到列表中long_shaking_hiddens = torch.cat(shaking_hiddens_list, dim = 1)#鋪平上三角矩陣return long_shaking_hiddens

輸入的seq_hiddens維度是[batch,seq_len, hiddensize],是一句話經(jīng)過bert編碼過后的值,而HandshakingKernel函數(shù)的作用是將矩陣變?yōu)樯先蔷仃?#xff0c;即本身矩陣為[seq_len * seq_len],在經(jīng)過函數(shù)過后為每一行都減1,最后通過long_shakinghiddens把函數(shù)把結(jié)果鋪平,得到[seq_len+(seq_len -1) + (seq_len -2)…+1],對(duì)應(yīng)了圖片部分。

整個(gè)函數(shù)先是循環(huán)每句話中的詞,當(dāng)ind是0時(shí),hidden_each_step代表了循環(huán)的每個(gè)詞的編碼[batch,1,hidden_size],visiblehiddens是循環(huán)到的這個(gè)單詞以及之后的單詞的編碼,維度就是[batch,seq_len,hidden_size],repeat_hiddens對(duì)hidden_each_step的第二個(gè)維度進(jìn)行了復(fù)制,維度為[batch,seq_len,hidden_size],將當(dāng)前單詞和其后的各個(gè)單詞的編碼進(jìn)行拼接維度是[batch,seq_len,hidden_size*2]組成上三角矩陣的一行,在經(jīng)過MLP層后shakinghiddens的維度是[batch,seq_len,hidden_size],之后每一行依次類推。

關(guān)于loss部分

total_loss, total_ent_sample_acc, total_head_rel_sample_acc, total_tail_rel_sample_acc = 0., 0., 0., 0.for batch_ind, batch_train_data in enumerate(dataloader):t_batch = time.time()z = (2 * len(rel2id) + 1) # 2倍的關(guān)系steps_per_ep = len(dataloader) #有多少數(shù)據(jù)total_steps = hyper_parameters["loss_weight_recover_steps"] + 1 # + 1 avoid division by zero error #加速loss在一定的步數(shù)回歸current_step = steps_per_ep * ep + batch_ind # ?w_ent = max(1 / z + 1 - current_step / total_steps, 1 / z)w_rel = min((len(rel2id) / z) * current_step / total_steps, (len(rel2id) / z))loss_weights = {"ent": w_ent, "rel": w_rel} #給予不同任務(wù)的權(quán)重loss, ent_sample_acc, head_rel_sample_acc, tail_rel_sample_acc = train_step(batch_train_data, optimizer, loss_weights)scheduler.step()total_loss += losstotal_ent_sample_acc += ent_sample_acctotal_head_rel_sample_acc += head_rel_sample_acctotal_tail_rel_sample_acc += tail_rel_sample_accavg_loss = total_loss / (batch_ind + 1)avg_ent_sample_acc = total_ent_sample_acc / (batch_ind + 1)avg_head_rel_sample_acc = total_head_rel_sample_acc / (batch_ind + 1)avg_tail_rel_sample_acc = total_tail_rel_sample_acc / (batch_ind + 1)

隨著step加大,w_ent的權(quán)重遞減,w_rel權(quán)重遞增。先關(guān)注實(shí)體,保證實(shí)體抽準(zhǔn)確,后面關(guān)注關(guān)系的抽取,由于目前工作原因,更多細(xì)節(jié)待閑時(shí)在進(jìn)行解讀。

百度信息抽取Lic2020關(guān)系抽取:https://zhuanlan.zhihu.com/p/138858558

總結(jié)

以上是生活随笔為你收集整理的TPLinker 联合抽取 实体链接方式+源码分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

日韩中文字幕视频在线 | 四虎8848免费高清在线观看 | 欧美一级看片 | 久久精品99精品国产香蕉 | 免费日韩三级 | 美女精品在线 | www.com在线观看 | 日韩精品免费在线观看 | 91亚洲精品国产 | 1区2区3区在线观看 三级动图 | 九九九九九九精品任你躁 | 中文字幕在线看视频 | 日韩影视在线观看 | 久久久99精品免费观看app | 天天操夜操 | 国产精品久久久久久久久久妇女 | 久久久久久高潮国产精品视 | 久久亚洲私人国产精品 | 波多野结衣电影一区二区三区 | 久久精选| 就操操久久 | 激情婷婷在线观看 | 国产123区在线观看 国产精品麻豆91 | 91在线看片 | 人人爽人人乐 | 在线观看一区 | 久久久久国产精品www | 欧美日韩一二三四区 | 亚洲在线成人精品 | 青青河边草免费直播 | 337p日本大胆噜噜噜噜 | 久久精品一二区 | 色综合网 | 色婷婷骚婷婷 | 最近中文字幕mv免费高清在线 | 亚洲久草在线视频 | 久久草av| 国产精品人人做人人爽人人添 | 人人爽人人做 | 成年人免费观看在线视频 | 99精品国产99久久久久久福利 | 人人玩人人添人人澡97 | 四川bbb搡bbb爽爽视频 | 日p在线观看 | 精品一二三四在线 | 人人爽人人爽av | 中文字幕乱码亚洲精品一区 | 一区二区中文字幕在线观看 | 97精品国产 | 欧美日韩不卡一区 | 欧美激情xxxx | 中文字幕日韩av | 夜夜夜精品 | 探花视频免费观看高清视频 | 欧美午夜精品久久久久 | 丁香六月五月婷婷 | 日韩网站在线看片你懂的 | 午夜色大片在线观看 | 综合影视| av免费在线观看1 | 欧美国产精品久久久久久免费 | 国产vs久久 | 蜜臀av.com | 亚洲精品女 | 国产精品一区二区视频 | av免费看av| 久久久久麻豆 | 狠狠狠狠狠操 | 天躁狠狠躁 | 美女一二三区 | 久久久久北条麻妃免费看 | 欧美极品少妇xbxb性爽爽视频 | 日韩视频在线观看免费 | 国产一级二级在线观看 | 国产99久久久国产精品免费二区 | 国产一区二三区好的 | 欧美日韩在线观看视频 | 久久有精品 | 美女网站视频免费黄 | 综合久久一本 | 亚洲 在线| 亚洲在线视频观看 | av先锋中文字幕 | 99re久久精品国产 | 久久精品草| 国产一级在线播放 | 日韩高清一 | 国产日韩视频在线观看 | av一区在线播放 | 日韩激情av在线 | 综合激情网 | av中文字幕剧情 | 伊人资源站| 天天操天天操天天操天天操 | 九九热在线观看 | 少妇做爰k8经典 | 精品久久久久久亚洲综合网站 | 亚洲成熟女人毛片在线 | 一区二区三区在线看 | 在线观看亚洲电影 | 在线高清| 国产香蕉久久 | 欧美日韩在线视频观看 | 欧美一级在线观看视频 | 久久99精品国产麻豆婷婷 | 精品在线一区二区三区 | 国产 日韩 在线 亚洲 字幕 中文 | 69精品在线 | 91精品免费视频 | 日韩精品视频免费 | 日日夜夜操操操操 | 中文字幕2021 | 日本公乱妇视频 | 国产精品大尺度 | 高清不卡一区二区三区 | 97在线精品视频 | 国产成人久久精品77777综合 | 亚洲精品视频在线免费 | 亚洲片在线 | 欧美日韩国产二区三区 | 婷香五月 | 久久激情综合 | 中文字幕在线观看的网站 | 精品国产乱码久久久久久1区二区 | 国产精品男女视频 | 国产精品久久久久亚洲影视 | 免费av 在线| www欧美色 | 精品视频资源站 | 亚洲日本va在线观看 | 91精品国产成人www | 久久99九九99精品 | av在线网站免费观看 | 久久久亚洲电影 | 91av看片 | 九九九在线观看视频 | 国产小视频免费在线观看 | 久久久影院一区二区三区 | 免费a级观看 | av视屏在线 | 一区二区国产精品 | 国产亚洲午夜高清国产拍精品 | 国产精品成人在线观看 | 天天插天天干天天操 | 久久九九影视 | 国产精品久久久久久久7电影 | 超碰精品在线 | 国产精品视频免费在线观看 | 日韩高清在线一区二区 | 444av| 久久综合桃花 | 久久新视频 | 欧美ⅹxxxxxx | 中文字幕中文字幕 | 精品一区精品二区高清 | 日韩艹| 日韩欧美在线影院 | 成人午夜剧场在线观看 | 日韩国产精品一区 | 亚洲手机av | 久久久私人影院 | av黄色在线观看 | 97精品欧美91久久久久久 | 免费高清看电视网站 | av在线网站免费观看 | 麻豆果冻剧传媒在线播放 | 天天干一干 | 欧美日韩免费一区 | 国产成人av网站 | 美女免费视频观看网站 | 在线观看不卡视频 | 97精品国产 | 久久久久五月天 | 国产亚洲资源 | av网站手机在线观看 | 超碰国产人人 | 日韩精品一区二区三区免费观看 | 日韩精品在线一区 | 视频99爱| 午夜婷婷综合 | 少妇bbb | 亚洲一级片 | 一区二区三区精品久久久 | 亚洲精品系列 | 中文字幕中文 | 久久久国产一区二区三区 | 国产日韩在线视频 | 99精品国产免费久久久久久下载 | 亚洲精品久久久久58 | 天天综合日日夜夜 | 69av视频在线观看 | 日韩在线二区 | 人人爽人人舔 | 亚洲涩涩涩 | av手机在线播放 | 久久久精品 | 999久久国精品免费观看网站 | 国产精品美女久久久网av | 精品久久久久国产免费第一页 | www.五月天激情 | 黄色成年片 | 久久久久国产精品一区 | 国产第一二区 | 日日草视频 | 精品国产电影一区 | 91福利视频网站 | 久久久久久久久久久久亚洲 | 黄色av网站在线免费观看 | 97精产国品一二三产区在线 | 丁香六月久久综合狠狠色 | 999久久久精品视频 日韩高清www | 美女免费视频一区 | 中文字幕亚洲五码 | 日本中文在线观看 | 婷婷六月综合网 | 欧美先锋影音 | 99精品国产高清在线观看 | 日韩精品一区二区在线观看视频 | 96视频免费在线观看 | 欧美大荫蒂xxx | 在线观看久 | 国产一区在线不卡 | 91在线视频免费播放 | 狠狠狠色狠狠色综合 | 中文字幕精品三级久久久 | 日日夜夜狠狠操 | 天天干天天操天天爱 | 久久久国产精品成人免费 | 国产精品视频免费看 | 免费看三级黄色片 | 深爱激情久久 | 国产人成免费视频 | 精品欧美一区二区精品久久 | 国产一区电影在线观看 | 91看片麻豆 | 国产又黄又硬又爽 | 999成人免费视频 | 亚洲免费av在线播放 | 丁香五香天综合情 | av综合站| 久久ww| 视色网站 | 国产一级二级三级在线观看 | 久久久久色 | 在线观看中文 | 欧美日韩视频网站 | 亚洲日本在线一区 | 国产精品久久久久999 | 黄色成人小视频 | 日韩三级在线观看 | 久久久www成人免费毛片 | 麻豆免费精品视频 | 伊人射 | 99免费在线观看视频 | 免费在线观看中文字幕 | 99久高清在线观看视频99精品热在线观看视频 | 日韩午夜精品福利 | 国产精品久久久久久模特 | av中文字幕日韩 | 国产99爱| 超碰最新网址 | 91精品视频一区 | 日本动漫做毛片一区二区 | 亚洲天天在线日亚洲洲精 | 色噜噜日韩精品欧美一区二区 | 天天摸天天舔天天操 | av在线免费在线 | 六月天综合网 | 黄色成人免费电影 | 日韩在线视频网站 | 中文字幕av在线免费 | 免费h精品视频在线播放 | 日韩欧美有码在线 | 国产视频2| 婷婷午夜激情 | 欧美污污视频 | 99在线观看视频网站 | 在线观看你懂的网址 | 狠狠操狠狠干2017 | 日韩在线观看视频一区二区三区 | 三级黄色网址 | 精品国产免费人成在线观看 | 欧美91精品久久久久国产性生爱 | 黄色资源在线观看 | 四虎在线视频免费观看 | 国产免费又爽又刺激在线观看 | 日韩中文字幕在线 | 中文字幕在线久一本久 | 国产精品精品久久久久久 | 久久综合免费视频影院 | 在线观看午夜 | 久久99久久99 | 色91在线 | 美女网站在线播放 | 日韩国产精品一区 | 日韩h在线观看 | 69xxxx欧美 | av大全在线| 91视频麻豆视频 | 久久夜av| 91九色蝌蚪视频在线 | 中文字幕在线观看视频一区二区三区 | www天天干| 97品白浆高清久久久久久 | 国产一区二区不卡视频 | 日韩午夜电影网 | 久久综合网色—综合色88 | 日韩久久久久久久 | 国产不卡视频 | 久久久久久精 | 日韩美一区二区三区 | 国产一级a毛片视频爆浆 | 日韩国产在线观看 | 国产精品91一区 | 麻豆91在线看 | 天天干天天综合 | 亚洲免费专区 | av大片免费 | 色97在线| 久久丝袜视频 | 国产精品国产三级国产不产一地 | av日韩精品| 欧美一区二区视频97 | 五月天婷婷在线播放 | 日韩视频三区 | 超碰精品在线 | 国产香蕉视频 | 国色天香永久免费 | 在线韩国电影免费观影完整版 | 日韩在线视频国产 | 黄色免费大片 | 麻豆视频www| 爱爱一区 | 免费观看一区二区三区视频 | 永久免费av在线播放 | 欧美成人xxxx | 在线av资源 | 久久精品国亚洲 | 国产一区欧美日韩 | 日韩欧美精品免费 | 国产成人精品999在线观看 | 久久精精品视频 | 一区二区三区在线观看免费 | 国产无遮挡猛进猛出免费软件 | 精品久久久久久久 | 99精品热视频 | 成人av一区二区三区 | 日韩三级久久 | 久久久一本精品99久久精品 | 玖操| 色综合天天天天做夜夜夜夜做 | 性色av免费在线观看 | 在线免费性生活片 | 国产区高清在线 | 免费成人在线视频网站 | 精品国产aⅴ一区二区三区 在线直播av | 毛片一区二区 | 美女网站视频一区 | 久久综合婷婷综合 | 欧美一二三视频 | 毛片区 | 色哟哟国产精品 | 欧美日韩在线免费观看视频 | 久久国产精品视频观看 | 日产av在线播放 | 韩国精品在线 | 丁香婷婷基地 | 日本三级全黄少妇三2023 | 午夜久久网站 | 久久伦理影院 | 黄色www免费| 欧美乱淫视频 | 国产亚洲情侣一区二区无 | 精产嫩模国品一二三区 | av中文字幕在线播放 | 久久99久久99精品 | 国产视 | 欧美日韩精品免费观看视频 | 日日弄天天弄美女bbbb | 日韩精品视频一二三 | 亚洲国产婷婷 | 久久综合毛片 | 狠狠干综合| 国产美女网站在线观看 | 麻豆视频免费在线播放 | 亚州精品视频 | 亚洲精品大片www | 91视频这里只有精品 | 五月婷婷色播 | 久久精品国产精品亚洲 | 综合天天网 | 黄色特一级| 免费看色网站 | 日韩高清www | 国产在线观看你懂得 | 精品一区二区av | 正在播放亚洲精品 | 国产精品99久久久久久大便 | 99精品视频在线播放观看 | 中午字幕在线观看 | 久久亚洲在线 | 91福利视频免费 | 亚洲国内精品视频 | 欧洲一区精品 | 91在线影院 | 国产视频不卡 | 久久深爱网 | 久久精品a | 国产精品黄 | 亚洲日日夜夜 | 亚洲精品视频免费在线 | 久久久久久久国产精品视频 | 美女视频网站久久 | 天操夜夜操 | 欧美国产不卡 | 亚洲成a人片77777kkkk1在线观看 | 国产在线永久 | 美女视频黄的免费的 | 国产精品一区二区三区在线免费观看 | 在线精品观看国产 | 激情欧美日韩一区二区 | 有码中文字幕在线观看 | 国产无吗一区二区三区在线欢 | 99久久久久 | 国产免费xvideos视频入口 | 高清一区二区 | 天天天综合| 狠狠操夜夜 | 伊人天堂av | 91亚洲精品久久久久图片蜜桃 | 97免费在线观看视频 | 国产免费av一区二区三区 | 狠狠狠狠狠狠狠狠 | 国产97av| 玖玖视频精品 | 亚洲精品在线二区 | 国产日产av| 天天射天天干天天爽 | 亚洲91中文字幕无线码三区 | 欧美在线视频一区二区三区 | 亚洲免费精品视频 | 国精产品999国精产品视频 | 一本一本久久a久久精品综合妖精 | 人人超碰人人 | 国产视频日韩 | av 一区二区三区 | 视频一区二区在线 | 中文字幕之中文字幕 | 福利视频一二区 | www.久久色 | 日本乱码在线 | 日韩欧美国产成人 | 成人av电影在线观看 | 久久综合干 | 91亚色视频在线观看 | 午夜色影院| 欧美精品在线一区二区 | av成人免费在线 | 国产福利不卡视频 | 69亚洲乱 | 国产a级片免费观看 | 五月婷婷欧美视频 | 欧美日韩国产精品久久 | 国产理伦在线 | 免费在线观看av电影 | 伊人五月天综合 | 成人免费视频网站 | 97在线视频观看 | 国产精品久久一区二区三区不卡 | 欧美日韩一区二区免费在线观看 | 天堂资源在线观看视频 | 欧美在线视频一区二区三区 | 亚洲精品国产精品99久久 | av在线播放快速免费阴 | 色天天综合久久久久综合片 | 九九九在线 | 亚洲成人黄色网址 | 99久久精品久久久久久清纯 | 在线观看91精品视频 | 五月香视频在线观看 | 97在线资源 | 亚洲资源 | 欧美a√在线 | 精品一区三区 | 久精品视频在线观看 | 狠狠干我| 成年人黄色大全 | 久久看免费视频 | 国产一区高清在线 | 毛片在线播放网址 | 免费日韩一级片 | 亚洲精品国产成人av在线 | 久久久久看片 | 国产一级二级三级在线观看 | 亚洲午夜在线视频 | 国产又粗又猛又色又黄视频 | 美国av大片 | 久草在线网址 | 天天撸夜夜操 | 激情文学综合丁香 | 夜夜干天天操 | 91麻豆网站 | av综合在线观看 | 欧美在线观看视频一区二区 | 久久官网| 福利视频第一页 | 国产精品ⅴa有声小说 | 黄色小视频在线观看免费 | 精品视频中文字幕 | 免费日韩一区二区三区 | 91av99| 日韩精品一区二区在线 | 99色视频在线 | 九九热只有精品 | 午夜av在线播放 | 国产成人综合精品 | 日本亚洲国产 | 天天操操操操操操 | 国产乱老熟视频网88av | 久操97 | 午夜视频一区二区 | 久久综合成人 | 成人免费影院 | 亚洲精品国产精品乱码在线观看 | 伊人中文网 | 天天艹天天 | 欧美国产日韩在线视频 | 亚洲精品小视频 | 国产精品久久亚洲 | 美女很黄免费网站 | 亚洲精品国偷拍自产在线观看 | 亚洲国产日韩一区 | 日韩一区精品 | 日韩特黄一级欧美毛片特黄 | 国产日韩中文字幕 | 免费看污黄网站 | 五月婷网站 | 亚洲激情视频在线 | 亚洲成年人av | 在线观看资源 | 精品字幕| 日本黄色免费观看 | 2021国产精品 | 伊人久操 | 久久亚洲综合国产精品99麻豆的功能介绍 | 亚洲永久字幕 | 夜夜操天天干, | 日本爱爱免费 | 精品伦理一区二区三区 | 91九色蝌蚪视频在线 | 很黄很色很污的网站 | 天天超碰 | 三级黄色大片在线观看 | 国产成人精品在线观看 | 国产1区在线 | 五月天最新网址 | 在线91av| 人人玩人人添人人澡97 | 成人av一区二区三区 | 欧美精品一区二区性色 | 一级淫片a | 伊人久久在线观看 | 国产免费小视频 | 精品人人爽 | 国产 中文 日韩 欧美 | 久久久综合九色合综国产精品 | 日韩美女一级片 | 97超碰国产精品女人人人爽 | 黄色av电影网 | 久草在线免费色站 | 亚洲天堂网在线视频 | 中文字幕资源在线观看 | 2017狠狠干 | 免费在线观看av的网站 | 国产精品久久久久久久毛片 | 亚洲国内精品 | 免费在线观看av电影 | 国产精品九九久久99视频 | 国产精品久久久99 | 久久国产一二区 | 在线观看中文av | 夜添久久精品亚洲国产精品 | 亚洲视屏在线播放 | 亚洲精品国产精品国自产观看 | 毛片888 | 国产精品国产三级国产不产一地 | 91精品久久久久 | 97超碰资源 | 99热在线精品观看 | 99热在线国产精品 | 99久久久成人国产精品 | 久久精品欧美一 | 国产资源网 | 中文字幕亚洲在线观看 | 亚洲一级片免费观看 | 天天舔夜夜操 | 国产精品一区二区三区免费看 | 中文字幕av免费观看 | 免费黄a | 国产99区 | 日日干夜夜操视频 | 精品一区二区在线播放 | 最新精品国产 | 亚洲伦理中文字幕 | 粉嫩av一区二区三区免费 | 亚洲影院色 | 草久久av | 丁香在线视频 | 精品一区二区在线观看 | 亚洲精品美女久久 | 国产va在线 | 永久免费av在线播放 | 一区二区三区在线免费观看 | 成年人免费在线观看 | 久久久久国产成人免费精品免费 | 美女黄视频免费看 | 精品久久久久久国产偷窥 | 久久人视频 | 最近中文字幕国语免费高清6 | 亚洲涩涩涩涩涩涩 | 亚洲国产精品一区二区久久,亚洲午夜 | 色婷婷国产精品 | 成人精品一区二区三区中文字幕 | 久99久久 | 天天干天天摸 | 97成人在线观看视频 | 中文字幕免费高清在线观看 | 久久av高清 | 狠狠色综合欧美激情 | 蜜臀av夜夜澡人人爽人人桃色 | av丝袜在线 | 亚洲区另类春色综合小说校园片 | 在线免费黄色毛片 | 久久精品五月 | 麻豆影视在线免费观看 | 亚洲一区免费在线 | 欧美日韩免费一区二区三区 | 欧美日韩一区二区在线观看 | 三级黄色在线 | 夜夜操天天 | 在线观看激情av | 97免费中文视频在线观看 | 国产99在线免费 | 91九色国产蝌蚪 | 精品99免费 | 成人h动漫在线看 | 国偷自产视频一区二区久 | 久久精品屋| 操综合 | 精品无人国产偷自产在线 | 四虎成人在线 | 久久官网 | 日韩国产精品毛片 | 国产精品成人a免费观看 | 亚洲精品99久久久久久 | 天天综合操 | 国产精品色在线 | 狠狠狠狠狠狠狠狠干 | 国产精品一区在线观看你懂的 | 欧美一二区视频 | 国产麻豆剧传媒免费观看 | 亚洲国产中文字幕 | 久久久久久久久久久影院 | 黄色免费网站 | 欧洲av不卡 | 九九九热精品免费视频观看 | 久久国产亚洲精品 | www.天天操.com | 国产99久久久久久免费看 | 天天操操操操操操 | 日韩一级理论片 | 国产午夜精品免费一区二区三区视频 | 久草在线视频看看 | 最近中文字幕在线中文高清版 | 五月婷婷黄色网 | 91成品视频 | 黄色大片av | 国产精品视频线看 | 中文字幕2021| 久久精品综合网 | 娇妻呻吟一区二区三区 | 最近中文字幕视频网 | 日本大片免费观看在线 | 久久99热精品这里久久精品 | www日| 这里只有精彩视频 | 最近中文字幕大全 | 毛片99 | 久久激情婷婷 | 国产精品手机播放 | 亚洲视频在线播放 | 丁香电影小说免费视频观看 | 国产精品 欧美 日韩 | 亚洲精品三级 | 国产免费一区二区三区最新6 | 亚洲综合网 | 国产在线高清 | 国产福利在线不卡 | 亚洲全部视频 | 国产精品每日更新 | 久久久激情视频 | 免费看成人片 | 欧美激情精品久久久 | 国产精品中文字幕在线播放 | 婷婷色影院| av一级片网站 | 欧美日韩激情网 | 国产伦理一区 | 日韩中文字幕免费视频 | 成人av资源 | 国产午夜在线 | 欧美一区二区在线刺激视频 | 成人在线黄色 | 插婷婷| 麻豆视频免费入口 | 精品成人在线 | 亚洲黄色在线看 | 久久天天躁狠狠躁夜夜不卡公司 | 精品一区二区三区久久久 | 成人av在线观 | 中文字幕在线观看一区 | 欧美日韩在线观看一区二区 | 亚洲永久国产精品 | 国内精品久久久久久久久久久 | 日韩欧美视频在线播放 | 国产午夜亚洲精品 | 伊人婷婷激情 | 天天操天天弄 | 久久久av电影 | 久久综合中文色婷婷 | 中文字幕有码在线 | 日韩特级片 | 91在线看网站 | 五月婷婷六月丁香 | 中文字幕免费一区二区 | 九九热精品在线 | 91成人网在线播放 | 中文字幕av播放 | 色综合久久中文字幕综合网 | 国产一级片免费播放 | 久久国产视频网 | 色亚洲激情 | 婷婷夜夜 | 日韩电影中文 | 久久免费福利 | 国产日韩欧美综合在线 | 国产成人精品一区二区在线观看 | 国产高清99 | 欧美a级在线免费观看 | 国产裸体永久免费视频网站 | 国产一区二区精品久久 | 久久久久久久久久久久久久免费看 | 久久精品一二三区白丝高潮 | 日韩欧美91 | 亚洲一级片在线看 | 中文字幕精品在线 | 在线观看日本高清mv视频 | 人人干网站| 久久久久五月天 | 欧美精品亚洲二区 | 日韩av不卡播放 | 97成人精品视频在线观看 | 国产三级在线播放 | 亚洲区另类春色综合小说校园片 | 在线视频欧美亚洲 | 一区中文字幕电影 | 精品国产观看 | 亚州欧美视频 | 久艹在线免费观看 | 国产一级二级三级视频 | 免费av看片 | 国产精品av电影 | 成人在线免费看 | 亚洲国产精品第一区二区 | 最近中文字幕高清字幕免费mv | 精品影院| 综合精品在线 | 亚洲一级性| 久久天堂亚洲 | 国产精品毛片久久久久久久久久99999999 | av在线免费网 | 午夜神马福利 | 丁香六月激情 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 免费合欢视频成人app | 99久久精品免费看国产麻豆 | 欧美在线free | 99久久99久久精品 | 又黄又爽的视频在线观看网站 | 中文字幕成人 | 亚洲综合一区二区精品导航 | 久久国产精品免费 | 97成人在线观看视频 | 色五丁香| 男女全黄一级一级高潮免费看 | 手机看片国产日韩 | www.狠狠干 | 日韩电影中文字幕 | 日韩精品视频在线观看网址 | 麻豆传媒视频在线播放 | 成年人免费在线观看网站 | 亚洲区另类春色综合小说校园片 | 亚洲三级毛片 | 午夜123 | 丁香午夜 | 国产香蕉视频在线播放 | 黄色免费观看视频 | 色综合天天狠天天透天天伊人 | 久久国产精品免费一区 | 看污网站 | 国产亚洲精品成人av久久影院 | 午夜精品999 | 亚洲少妇影院 | 91精品少妇偷拍99 | 久久精品欧美一区 | 日韩欧美视频在线 | 丁香在线视频 | av+在线播放在线播放 | 三级黄色片在线观看 | 免费在线看成人av | 91精品办公室少妇高潮对白 | 一区二区三区久久精品 | 天天草天天干天天射 | 天堂av在线免费 | 五月婷婷伊人网 | 国产伦精品一区二区三区四区视频 | 青青河边草免费观看完整版高清 | 97人人看 | 免费在线成人av电影 | 精品欧美小视频在线观看 | 日韩乱理 | 亚洲不卡av一区二区三区 | 色婷婷福利视频 | 亚洲伊人成综合网 | 久久免费视频7 | 国产亚洲精品久久19p | 狠狠色狠狠色 | 日韩中文字| 亚洲专区视频在线观看 | 91精品亚洲影视在线观看 | 国产精品久久久区三区天天噜 | 中文字幕第一页av | 亚洲,国产成人av | 成人18视频| 日韩欧美在线综合网 | 97超碰在线资源 | 免费看毛片在线 | 中文字幕a在线 | 久久久久国产精品免费免费搜索 | 国产精品网址在线观看 | 精品久久久久国产免费第一页 | 久久夜色精品国产欧美乱极品 | av电影免费在线看 | 九九精品视频在线观看 | 国产欧美久久久精品影院 | 国产精品乱码高清在线看 | 亚洲天堂网视频 | 深爱激情站 | 久久久精品99| 国产成人99久久亚洲综合精品 | 久久精彩视频 | av短片在线 | 91网站在线视频 | 在线看小早川怜子av | 在线看黄网站 | 五月婷婷激情综合网 | www操操操 | 五月天六月婷婷 | 992tv在线| 丁香5月婷婷久久 | 久久久久久久免费 | 热九九精品 | 天堂av在线网址 | 国产黄色片免费观看 | 国产精品美女久久久久久免费 | 国产在线更新 | 久久小视频| 狠狠操操操 | 色网站在线观看 | 天天草天天色 | 中文视频一区二区 | 成人免费共享视频 | 五月婷网站 | 91av原创 | 久久久久久久久网站 | 天天av综合网 | 国产日韩欧美在线观看 | 久久国产精品一二三区 | 天天天射| 五月天婷婷在线观看视频 | 国产黄在线看 | 精品国产片 | 成人h视频在线播放 | 午夜国产福利在线 | 在线看国产 | 日韩欧美高清不卡 | 国产中文字幕国产 | 欧美福利视频 | 日韩免费电影一区二区 | 91在线日韩 | 日韩欧美精品在线 | 97人人澡人人爽人人模亚洲 | 亚洲va欧美 | 亚洲最大av网站 | 精品视频久久久 | 深爱激情开心 | a级成人毛片 | 色橹橹欧美在线观看视频高清 | 美女国产精品 | 韩国精品视频在线观看 | 亚洲欧美偷拍另类 | 中文字幕在线视频精品 | 激情五月在线视频 | 中文久久精品 | 午夜视频在线网站 | 在线你懂的视频 | 日韩欧美国产精品 | 91精品视频在线免费观看 | 私人av| 亚洲视频每日更新 | 色福利网站 | 免费看十八岁美女 | 特级黄色视频毛片 | 久久香蕉国产精品麻豆粉嫩av | 在线播放你懂 | 亚洲最大在线视频 | 国产最新91 | 亚洲资源一区 | 久久久久久久久福利 | 天天操天天干天天插 | 日韩在线网 | 欧美精品一区二区免费 | 91桃色国产在线播放 | 超碰在线个人 | 三上悠亚一区二区在线观看 | 欧美精品中文字幕亚洲专区 | 在线综合 亚洲 欧美在线视频 | 九九热在线精品视频 | 中文av影院 | 五月激情五月激情 | 激情婷婷在线 | 欧美日韩在线观看一区二区三区 | 天天摸天天弄 | 在线婷婷| 91麻豆精品91久久久久同性 | 久久综合视频网 | 婷婷综合av | 中文字幕在线观看av | 欧美日韩精品在线视频 | 成年人视频在线免费播放 | 成人久久电影 | 久久久资源| av一区二区三区在线观看 | 人人讲下载 | 国内精品久久久久影院一蜜桃 | 麻豆播放 | 97久久久免费福利网址 | 西西人体www444 | 久久久久久免费网 | 国产精品一区欧美 | 2018好看的中文在线观看 | 九九热.com| 毛片激情永久免费 | 国产日产精品一区二区三区四区 | 成年人电影免费在线观看 | 天天操天天操天天操天天操天天操天天操 | 精品视频9999 | 日韩在线视频网 | 亚洲精品一区二区三区在线观看 | 亚洲日本精品视频 | 免费在线观看黄色网 | 丁香六月国产 | 久久69精品久久久久久久电影好 | 国产99久久久国产精品成人免费 | 日韩美在线观看 | 九九热视频在线 | 中文字幕在线观看日本 | 国产精品综合久久久 | 久久不卡免费视频 | 久久久国产毛片 | 中文字幕国语官网在线视频 | 国产黄色片网站 | 欧洲色吧| 亚洲国产成人av网 | 亚洲伦理一区 | 国产亚洲精品xxoo | 免费能看的黄色片 | 99精品偷拍视频一区二区三区 | 精品中文字幕在线播放 | 欧美性性网 | 国产第一页福利影院 | 91在线影院 | 亚洲精品视频在线观看视频 | 精品毛片在线 | 国产成人精品久久久 | 久久免费福利 | 亚州人成在线播放 | 99久久婷婷国产精品综合 |