From 192fd6ccd855a203be8e5b8ea34abea07b75a0e3 Mon Sep 17 00:00:00 2001 From: tlk-dsg <467460833@qq.com> Date: Thu, 23 Sep 2021 16:23:03 +0800 Subject: [PATCH] test --- .../standard/tools/preprocess.py | 2 +- tutorial-notebooks/ae/standard/LM.ipynb | 565 ++++++++++++++++++ .../ae/standard/{RNN_AE.ipynb => RNN.ipynb} | 5 +- tutorial-notebooks/ae/standard/img/Bert.png | Bin 0 -> 69799 bytes 4 files changed, 569 insertions(+), 3 deletions(-) create mode 100644 tutorial-notebooks/ae/standard/LM.ipynb rename tutorial-notebooks/ae/standard/{RNN_AE.ipynb => RNN.ipynb} (99%) create mode 100644 tutorial-notebooks/ae/standard/img/Bert.png diff --git a/src/deepke/attribution_extraction/standard/tools/preprocess.py b/src/deepke/attribution_extraction/standard/tools/preprocess.py index 232b661..f8e4d9b 100644 --- a/src/deepke/attribution_extraction/standard/tools/preprocess.py +++ b/src/deepke/attribution_extraction/standard/tools/preprocess.py @@ -96,7 +96,7 @@ def preprocess(cfg): test_data = load_csv(test_fp) attribute_data = load_csv(attribute_fp) - logger.info('convert relation into index...') + logger.info('convert attribution into index...') atts = _handle_attribute_data(attribute_data) _add_attribute_data(atts,train_data) _add_attribute_data(atts,test_data) diff --git a/tutorial-notebooks/ae/standard/LM.ipynb b/tutorial-notebooks/ae/standard/LM.ipynb new file mode 100644 index 0000000..d4c807b --- /dev/null +++ b/tutorial-notebooks/ae/standard/LM.ipynb @@ -0,0 +1,565 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "## attribution extraction experiment\n", + "> Tutorial author: 陶联宽(22051063@zju.edu.cn)\n", + "\n", + "On this demo, we use `pretrain_language model` to extract attributions.\n", + "We hope this demo can help you understand the process of construction knowledge graph and the principles and common methods of triplet extraction.\n", + "\n", + "This demo uses `Python3`.\n", + "\n", + "### Dataset\n", + "In this example,we get some Chinese text to extract the triples\n", + "\n", + "sentence|attribute|entity|entity_offset|attribute_value|attribute_value_offset\n", + ":---:|:---:|:---:|:---:|:---:|:---:\n", + "苏轼(1037~1101年),字子瞻,又字和仲,号“东坡居士”,眉州眉山(即今四川眉州)人,是宋代(北宋)著名的文学家、书画家|字|苏轼|0|和仲|21\n", + "阳成俊,男,汉族,贵州省委党校大学学历|民族|阳成俊|0|汉族|6\n", + "司马懿,字仲达,河南温县人|字|司马懿|0|仲达|6\n", + "\n", + "- train.csv: It contains 6 training triples,each lines represent one triple,sorted by sentence,attribute,entity,entity's offset,attribute value attribute value's offset,and separated by ,.\n", + "- valid.csv: It contains 2 training triples,each lines represent one triple,sorted by sentence,attribute,entity,entity's offset,attribute value attribute value's offset,and separated by ,.\n", + "- test.csv: It contains 2 training triples,each lines represent one triple,sorted by sentence,attribute,entity,entity's offset,attribute value attribute value's offset,and separated by ,.\n", + "- attribute.csv: It contains 3 attribute triples,each lines sorted by attribute,index and separated by ,." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### BERT \n", + "\n", + "![BERT](img/Bert.png)\n", + "\n", + "After Bert coding, the original sentence can get rich semantic information. The obtained results are input into the bidirectional LSTM, and the output results can obtain the relationship information of the sentence.\n" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "### Code experience\n", + "\n", + "Important tips:\n", + "- When we use pretrain language model, we need to load about 500MB of model data,so it is more recommended to download to the local and run.At this time, you only need to add `lm_file` value to the address of the local folder. See the link [transformers](https://huggingface.co/transformers/)" + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "# Run the neural network with pytorch and confirm whether it is installed before running\n", + "!pip install torch\n", + "!pip install matplotlib\n", + "!pip install transformers" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "# import the whole modules\n", + "import os\n", + "import csv\n", + "import math\n", + "import pickle\n", + "import logging\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.nn.functional as F\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from torch import optim\n", + "from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence\n", + "from torch.utils.data import Dataset,DataLoader\n", + "from sklearn.metrics import precision_recall_fscore_support\n", + "from typing import List, Tuple, Dict, Any, Sequence, Optional, Union\n", + "from transformers import BertTokenizer, BertModel\n", + "\n", + "logger = logging.getLogger(__name__)" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "# Configuration file of model parameters\n", + "class Config(object):\n", + " model_name = 'lm' # ['cnn', 'gcn', 'lm', 'rnn']\n", + " use_pcnn = True\n", + " min_freq = 1\n", + " pos_limit = 20\n", + " out_path = 'data/out' \n", + " batch_size = 2 \n", + " word_dim = 10\n", + " pos_dim = 5\n", + " dim_strategy = 'sum' # ['sum', 'cat']\n", + " out_channels = 20\n", + " intermediate = 10\n", + " kernel_sizes = [3, 5, 7]\n", + " activation = 'gelu'\n", + " pooling_strategy = 'max'\n", + " dropout = 0.3\n", + " epoch = 10\n", + " num_relations = 4\n", + " learning_rate = 3e-4\n", + " lr_factor = 0.7 # 学习率的衰减率\n", + " lr_patience = 3 # 学习率衰减的等待epoch\n", + " weight_decay = 1e-3 # L2正则\n", + " early_stopping_patience = 6\n", + " train_log = True\n", + " log_interval = 1\n", + " show_plot = True\n", + " only_comparison_plot = False\n", + " plot_utils = 'matplot'\n", + " lm_file = 'bert-base-chinese'\n", + " # lm_file = '/Users/yuhaiyang/transformers/bert-base-chinese'\n", + " lm_num_hidden_layers = 2\n", + " rnn_layers = 2\n", + " \n", + "cfg = Config()" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "# Functions required for preprocessing\n", + "Path = str\n", + "\n", + "def load_csv(fp: Path, is_tsv: bool = False, verbose: bool = True) -> List:\n", + " if verbose:\n", + " logger.info(f'load csv from {fp}')\n", + "\n", + " dialect = 'excel-tab' if is_tsv else 'excel'\n", + " with open(fp, encoding='utf-8') as f:\n", + " reader = csv.DictReader(f, dialect=dialect)\n", + " return list(reader)\n", + "\n", + " \n", + "def load_pkl(fp: Path, verbose: bool = True) -> Any:\n", + " if verbose:\n", + " logger.info(f'load data from {fp}')\n", + "\n", + " with open(fp, 'rb') as f:\n", + " data = pickle.load(f)\n", + " return data\n", + "\n", + "\n", + "def save_pkl(data: Any, fp: Path, verbose: bool = True) -> None:\n", + " if verbose:\n", + " logger.info(f'save data in {fp}')\n", + "\n", + " with open(fp, 'wb') as f:\n", + " pickle.dump(data, f)\n", + " \n", + " \n", + "def _handle_attribute_data(attribute_data: List[Dict]) -> Dict:\n", + " atts = OrderedDict()\n", + " attribute_data = sorted(attribute_data, key=lambda i: int(i['index']))\n", + " for d in attribute_data:\n", + " atts[d['attribute']] = {\n", + " 'index': int(d['index'])\n", + " }\n", + " return atts\n", + "\n", + "\n", + "def _add_attribute_data(atts: Dict, data: List) -> None:\n", + " for d in data:\n", + " d['att2idx'] = atts[d['attribute']]['index']\n", + "\n", + "\n", + "def seq_len_to_mask(seq_len: Union[List, np.ndarray, torch.Tensor], max_len=None, mask_pos_to_true=True):\n", + " \n", + " if isinstance(seq_len, list):\n", + " seq_len = np.array(seq_len)\n", + "\n", + " if isinstance(seq_len, np.ndarray):\n", + " seq_len = torch.from_numpy(seq_len)\n", + "\n", + " if isinstance(seq_len, torch.Tensor):\n", + " assert seq_len.dim() == 1, logger.error(f\"seq_len can only have one dimension, got {seq_len.dim()} != 1.\")\n", + " batch_size = seq_len.size(0)\n", + " max_len = int(max_len) if max_len else seq_len.max().long()\n", + " broad_cast_seq_len = torch.arange(max_len).expand(batch_size, -1).to(seq_len.device)\n", + " if mask_pos_to_true:\n", + " mask = broad_cast_seq_len.ge(seq_len.unsqueeze(1))\n", + " else:\n", + " mask = broad_cast_seq_len.lt(seq_len.unsqueeze(1))\n", + " else:\n", + " raise logger.error(\"Only support 1-d list or 1-d numpy.ndarray or 1-d torch.Tensor.\")\n", + "\n", + " return mask\n", + "\n", + "\n", + "def _lm_serialize(data: List[Dict], cfg):\n", + " logger.info('use bert tokenizer...')\n", + " tokenizer = BertTokenizer.from_pretrained(cfg.lm_file)\n", + " for d in data:\n", + " sent = d['sentence'].strip()\n", + " sent += '[SEP]' + d['entity'] + '[SEP]' + d['attribute_value']\n", + " d['token2idx'] = tokenizer.encode(sent, add_special_tokens=True)\n", + " d['seq_len'] = len(d['token2idx'])" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "# Preprocess\n", + "logger.info('load raw files...')\n", + "train_fp = os.path.join('data/train.csv')\n", + "valid_fp = os.path.join('data/valid.csv')\n", + "test_fp = os.path.join('data/test.csv')\n", + "attribute_fp = os.path.join('data/attribute.csv')\n", + "\n", + "train_data = load_csv(train_fp)\n", + "valid_data = load_csv(valid_fp)\n", + "test_data = load_csv(test_fp)\n", + "attribute_data = load_csv(attribute_fp)\n", + "\n", + "for d in train_data:\n", + " d['tokens'] = eval(d['tokens'])\n", + "for d in valid_data:\n", + " d['tokens'] = eval(d['tokens'])\n", + "for d in test_data:\n", + " d['tokens'] = eval(d['tokens'])\n", + " \n", + "llogger.info('convert attribution into index...')\n", + "atts = _handle_attribute_data(attribute_data)\n", + "_add_attribute_data(atts,train_data)\n", + "_add_attribute_data(atts,test_data)\n", + "_add_attribute_data(atts,valid_data)\n", + "\n", + "logger.info('verify whether use pretrained language models...')\n", + "\n", + "logger.info('use pretrained language models serialize sentence...')\n", + "_lm_serialize(train_data, cfg)\n", + "_lm_serialize(valid_data, cfg)\n", + "_lm_serialize(test_data, cfg)\n", + "\n", + "logger.info('save data for backup...')\n", + "os.makedirs(cfg.out_path, exist_ok=True)\n", + "train_save_fp = os.path.join(cfg.out_path, 'train.pkl')\n", + "valid_save_fp = os.path.join(cfg.out_path, 'valid.pkl')\n", + "test_save_fp = os.path.join(cfg.out_path, 'test.pkl')\n", + "save_pkl(train_data, train_save_fp)\n", + "save_pkl(valid_data, valid_save_fp)\n", + "save_pkl(test_data, test_save_fp)" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "# pytorch construct Dataset\n", + "def collate_fn(cfg):\n", + " def collate_fn_intra(batch):\n", + " batch.sort(key=lambda data: data['seq_len'], reverse=True)\n", + " max_len = batch[0]['seq_len']\n", + "\n", + " def _padding(x, max_len):\n", + " return x + [0] * (max_len - len(x))\n", + "\n", + " x, y = dict(), []\n", + " word, word_len = [], []\n", + " head_pos, tail_pos = [], []\n", + " pcnn_mask = []\n", + " for data in batch:\n", + " word.append(_padding(data['token2idx'], max_len))\n", + " word_len.append(data['seq_len'])\n", + " y.append(int(data['att2idx']))\n", + "\n", + " if cfg.model_name != 'lm':\n", + " head_pos.append(_padding(data['entity_pos'], max_len))\n", + " tail_pos.append(_padding(data['attribute_value_pos'], max_len))\n", + " if cfg.model_name == 'cnn':\n", + " if cfg.use_pcnn:\n", + " pcnn_mask.append(_padding(data['entities_pos'], max_len))\n", + "\n", + " x['word'] = torch.tensor(word)\n", + " x['lens'] = torch.tensor(word_len)\n", + " y = torch.tensor(y)\n", + "\n", + " if cfg.model_name != 'lm':\n", + " x['entity_pos'] = torch.tensor(head_pos)\n", + " x['attribute_value_pos'] = torch.tensor(tail_pos)\n", + " if cfg.model_name == 'cnn' and cfg.use_pcnn:\n", + " x['pcnn_mask'] = torch.tensor(pcnn_mask)\n", + " if cfg.model_name == 'gcn':\n", + " # 没找到合适的做 parsing tree 的工具,暂时随机初始化\n", + " B, L = len(batch), max_len\n", + " adj = torch.empty(B, L, L).random_(2)\n", + " x['adj'] = adj\n", + " return x, y\n", + "\n", + " return collate_fn_intra\n", + "\n", + "\n", + "class CustomDataset(Dataset):\n", + " \"\"\"\n", + " 默认使用 List 存储数据\n", + " \"\"\"\n", + " def __init__(self, fp):\n", + " self.file = load_pkl(fp)\n", + "\n", + " def __getitem__(self, item):\n", + " sample = self.file[item]\n", + " return sample\n", + "\n", + " def __len__(self):\n", + " return len(self.file)" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "# pretrain language model\n", + "class PretrainLM(nn.Module):\n", + " def __init__(self, cfg):\n", + " super(PretrainLM, self).__init__()\n", + " self.num_layers = cfg.rnn_layers\n", + " self.lm = BertModel.from_pretrained(cfg.lm_file, num_hidden_layers=cfg.lm_num_hidden_layers)\n", + " self.bilstm = nn.LSTM(768,10,batch_first=True,bidirectional=True,num_layers=cfg.rnn_layers,dropout=cfg.dropout)\n", + " self.fc = nn.Linear(20, cfg.num_relations)\n", + "\n", + " def forward(self, x):\n", + " N = self.num_layers\n", + " word, lens = x['word'], x['lens']\n", + " B = word.size(0)\n", + " output, pooler_output = self.lm(word)\n", + " output = pack_padded_sequence(output, lens, batch_first=True, enforce_sorted=True)\n", + " _, (output,_) = self.bilstm(output)\n", + " output = output.view(N, 2, B, 10).transpose(1, 2).contiguous().view(N, B, 20).transpose(0, 1)\n", + " output = output[:,-1,:]\n", + " output = self.fc(output)\n", + " \n", + " return output" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "# p,r,f1 measurement\n", + "class PRMetric():\n", + " def __init__(self):\n", + " \n", + " self.y_true = np.empty(0)\n", + " self.y_pred = np.empty(0)\n", + "\n", + " def reset(self):\n", + " self.y_true = np.empty(0)\n", + " self.y_pred = np.empty(0)\n", + "\n", + " def update(self, y_true:torch.Tensor, y_pred:torch.Tensor):\n", + " y_true = y_true.cpu().detach().numpy()\n", + " y_pred = y_pred.cpu().detach().numpy()\n", + " y_pred = np.argmax(y_pred,axis=-1)\n", + "\n", + " self.y_true = np.append(self.y_true, y_true)\n", + " self.y_pred = np.append(self.y_pred, y_pred)\n", + "\n", + " def compute(self):\n", + " p, r, f1, _ = precision_recall_fscore_support(self.y_true,self.y_pred,average='macro',warn_for=tuple())\n", + " _, _, acc, _ = precision_recall_fscore_support(self.y_true,self.y_pred,average='micro',warn_for=tuple())\n", + "\n", + " return acc,p,r,f1" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "# Iteration in training process\n", + "def train(epoch, model, dataloader, optimizer, criterion, cfg):\n", + " model.train()\n", + "\n", + " metric = PRMetric()\n", + " losses = []\n", + "\n", + " for batch_idx, (x, y) in enumerate(dataloader, 1):\n", + " optimizer.zero_grad()\n", + " y_pred = model(x)\n", + " loss = criterion(y_pred, y)\n", + "\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + " metric.update(y_true=y, y_pred=y_pred)\n", + " losses.append(loss.item())\n", + "\n", + " data_total = len(dataloader.dataset)\n", + " data_cal = data_total if batch_idx == len(dataloader) else batch_idx * len(y)\n", + " if (cfg.train_log and batch_idx % cfg.log_interval == 0) or batch_idx == len(dataloader):\n", + " acc,p,r,f1 = metric.compute()\n", + " print(f'Train Epoch {epoch}: [{data_cal}/{data_total} ({100. * data_cal / data_total:.0f}%)]\\t'\n", + " f'Loss: {loss.item():.6f}')\n", + " print(f'Train Epoch {epoch}: Acc: {100. * acc:.2f}%\\t'\n", + " f'macro metrics: [p: {p:.4f}, r:{r:.4f}, f1:{f1:.4f}]')\n", + "\n", + " if cfg.show_plot and not cfg.only_comparison_plot:\n", + " if cfg.plot_utils == 'matplot':\n", + " plt.plot(losses)\n", + " plt.title(f'epoch {epoch} train loss')\n", + " plt.show()\n", + "\n", + " return losses[-1]\n", + "\n", + "\n", + "# Iteration in testing process\n", + "def validate(epoch, model, dataloader, criterion,verbose=True):\n", + " model.eval()\n", + "\n", + " metric = PRMetric()\n", + " losses = []\n", + "\n", + " for batch_idx, (x, y) in enumerate(dataloader, 1):\n", + " with torch.no_grad():\n", + " y_pred = model(x)\n", + " loss = criterion(y_pred, y)\n", + "\n", + " metric.update(y_true=y, y_pred=y_pred)\n", + " losses.append(loss.item())\n", + "\n", + " loss = sum(losses) / len(losses)\n", + " acc,p,r,f1 = metric.compute()\n", + " data_total = len(dataloader.dataset)\n", + " if verbose:\n", + " print(f'Valid Epoch {epoch}: [{data_total}/{data_total}](100%)\\t Loss: {loss:.6f}')\n", + " print(f'Valid Epoch {epoch}: Acc: {100. * acc:.2f}%\\tmacro metrics: [p: {p:.4f}, r:{r:.4f}, f1:{f1:.4f}]\\n\\n')\n", + "\n", + " return f1,loss" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "# Load dataset\n", + "train_dataset = CustomDataset(train_save_fp)\n", + "valid_dataset = CustomDataset(valid_save_fp)\n", + "test_dataset = CustomDataset(test_save_fp)\n", + "\n", + "train_dataloader = DataLoader(train_dataset, batch_size=cfg.batch_size, shuffle=True, collate_fn=collate_fn(cfg))\n", + "valid_dataloader = DataLoader(valid_dataset, batch_size=cfg.batch_size, shuffle=True, collate_fn=collate_fn(cfg))\n", + "test_dataloader = DataLoader(test_dataset, batch_size=cfg.batch_size, shuffle=True, collate_fn=collate_fn(cfg))" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "# main entry, define optimization function, loss function and so on\n", + "# start epoch\n", + "# Use the loss of the valid dataset to make an early stop judgment. When it does not decline, this is the time when the model generalization is the best.\n", + "model = PretrainLM(cfg)\n", + "print(model)\n", + "\n", + "optimizer = optim.Adam(model.parameters(), lr=cfg.learning_rate, weight_decay=cfg.weight_decay)\n", + "scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, factor=cfg.lr_factor, patience=cfg.lr_patience)\n", + "criterion = nn.CrossEntropyLoss()\n", + "\n", + "best_f1, best_epoch = -1, 0\n", + "es_loss, es_f1, es_epoch, es_patience, best_es_epoch, best_es_f1, = 1000, -1, 0, 0, 0, -1\n", + "train_losses, valid_losses = [], []\n", + "\n", + "logger.info('=' * 10 + ' Start training ' + '=' * 10)\n", + "for epoch in range(1, cfg.epoch + 1):\n", + " train_loss = train(epoch, model, train_dataloader, optimizer, criterion, cfg)\n", + " valid_f1, valid_loss = validate(epoch, model, valid_dataloader, criterion)\n", + " scheduler.step(valid_loss)\n", + "\n", + " train_losses.append(train_loss)\n", + " valid_losses.append(valid_loss)\n", + " if best_f1 < valid_f1:\n", + " best_f1 = valid_f1\n", + " best_epoch = epoch\n", + " if es_loss > valid_loss:\n", + " es_loss = valid_loss\n", + " es_f1 = valid_f1\n", + " best_es_f1 = valid_f1\n", + " es_epoch = epoch\n", + " best_es_epoch = epoch\n", + " es_patience = 0\n", + " else:\n", + " es_patience += 1\n", + " if es_patience >= cfg.early_stopping_patience:\n", + " best_es_epoch = es_epoch\n", + " best_es_f1 = es_f1\n", + "\n", + "if cfg.show_plot:\n", + " if cfg.plot_utils == 'matplot':\n", + " plt.plot(train_losses, 'x-')\n", + " plt.plot(valid_losses, '+-')\n", + " plt.legend(['train', 'valid'])\n", + " plt.title('train/valid comparison loss')\n", + " plt.show()\n", + "\n", + "\n", + "print(f'best(valid loss quota) early stopping epoch: {best_es_epoch}, '\n", + " f'this epoch macro f1: {best_es_f1:0.4f}')\n", + "print(f'total {cfg.epoch} epochs, best(valid macro f1) epoch: {best_epoch}, '\n", + " f'this epoch macro f1: {best_f1:.4f}')\n", + "\n", + "test_f1, _ = validate(0, model, test_dataloader, criterion,verbose=False)\n", + "print(f'after {cfg.epoch} epochs, final test data macro f1: {test_f1:.4f}')" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "This demo does not include parameter adjustment. Interested students can go to [deepke] by themselves( http://openkg.cn/tool/deepke )Warehouse, download and use more models:)" + ], + "metadata": {} + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/tutorial-notebooks/ae/standard/RNN_AE.ipynb b/tutorial-notebooks/ae/standard/RNN.ipynb similarity index 99% rename from tutorial-notebooks/ae/standard/RNN_AE.ipynb rename to tutorial-notebooks/ae/standard/RNN.ipynb index 7785e89..dacb468 100644 --- a/tutorial-notebooks/ae/standard/RNN_AE.ipynb +++ b/tutorial-notebooks/ae/standard/RNN.ipynb @@ -6,7 +6,8 @@ "## attribution extraction experiment\n", "> Tutorial author: 陶联宽(22051063@zju.edu.cn)\n", "\n", - "On this demo, we use `lstm` to extract attributions.We hope this demo can help you understand the process of construction knowledge graph and the principles and common methods of triplet extraction.\n", + "On this demo, we use `lstm` to extract attributions.\n", + "We hope this demo can help you understand the process of construction knowledge graph and the principles and common methods of triplet extraction.\n", "\n", "This demo uses `Python3`.\n", "\n", @@ -302,7 +303,7 @@ "for d in test_data:\n", " d['tokens'] = eval(d['tokens'])\n", "\n", - "logger.info('convert relation into index...')\n", + "logger.info('convert attribution into index...')\n", "atts = _handle_attribute_data(attribute_data)\n", "_add_attribute_data(atts,train_data)\n", "_add_attribute_data(atts,test_data)\n", diff --git a/tutorial-notebooks/ae/standard/img/Bert.png b/tutorial-notebooks/ae/standard/img/Bert.png new file mode 100644 index 0000000000000000000000000000000000000000..980cee5254928eb3408406b2bca2d644f8f17690 GIT binary patch literal 69799 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 Z*sUKhvMM`{d|1FoMNw0sO5Qx=KLG6Fgb@G$ literal 0 HcmV?d00001