{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport gc\nimport math\nimport time\nimport random\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport warnings\nwarnings.simplefilter('ignore')\nfrom tqdm import tqdm\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nfrom torch.optim import lr_scheduler\nfrom torch.utils.data import DataLoader, Dataset\n\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import log_loss\n\nfrom transformers import AutoModel, AutoConfig, AutoTokenizer, AdamW, DataCollatorWithPadding\nfrom transformers import get_linear_schedule_with_warmup, get_cosine_schedule_with_warmup\nfrom torch.cuda.amp import autocast, GradScaler\n# https://github.com/huggingface/transformers/issues/9919\nfrom torch.utils.checkpoint import checkpoint\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:01:26.287370Z","iopub.execute_input":"2022-08-04T00:01:26.288451Z","iopub.status.idle":"2022-08-04T00:01:26.297385Z","shell.execute_reply.started":"2022-08-04T00:01:26.288400Z","shell.execute_reply":"2022-08-04T00:01:26.296179Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# CFG","metadata":{}},{"cell_type":"code","source":"class CFG:\n    wandb = False\n    apex = True #\n    model = '../input/deberta-v3-base/deberta-v3-base'\n    fast = True\n    seed = 42\n    n_splits = 5\n    max_len = 512\n    dropout = 0.1\n    target_size = 3\n    print_freq = 50\n    min_lr = 1e-6\n    scheduler = 'cosine'\n    batch_size = 8\n    num_workers = 0\n    lr = 3e-5\n    weigth_decay = 0.01\n    epochs = 3\n    n_fold = 5\n    trn_fold = [0, 1, 2, 3, 4]\n    train = True \n    num_warmup_steps = 0 #\n    num_cycles=0.5 #\n    CVs = []\n    debug_ver2 = False\n    gradient_checkpointing = True\n    AMP = False\n    freezing = True\n    n_accumulate= 1\n    \n    \n    \n    debug = True","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:01:26.888359Z","iopub.execute_input":"2022-08-04T00:01:26.888718Z","iopub.status.idle":"2022-08-04T00:01:26.896069Z","shell.execute_reply.started":"2022-08-04T00:01:26.888686Z","shell.execute_reply":"2022-08-04T00:01:26.895053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# ATTENTION","metadata":{}},{"cell_type":"markdown","source":"**Since this notebook is just a demo, so I just label a small amount of data for debugging. \nIf you want to get the whole pseudo labels, set 'debug = False'**","metadata":{}},{"cell_type":"markdown","source":"# Helper Function","metadata":{}},{"cell_type":"code","source":"# Loss Func\ndef criterion(outputs, labels):\n    return nn.CrossEntropyLoss()(outputs, labels)","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:01:27.890625Z","iopub.execute_input":"2022-08-04T00:01:27.891317Z","iopub.status.idle":"2022-08-04T00:01:27.896136Z","shell.execute_reply.started":"2022-08-04T00:01:27.891279Z","shell.execute_reply":"2022-08-04T00:01:27.895143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def softmax(z):\n    assert len(z.shape) == 2\n    s = np.max(z, axis=1)\n    s = s[:, np.newaxis] # necessary step to do broadcasting\n    e_x = np.exp(z - s)\n    div = np.sum(e_x, axis=1)\n    div = div[:, np.newaxis] # dito\n    return e_x / div","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:01:28.183106Z","iopub.execute_input":"2022-08-04T00:01:28.183999Z","iopub.status.idle":"2022-08-04T00:01:28.189954Z","shell.execute_reply.started":"2022-08-04T00:01:28.183958Z","shell.execute_reply":"2022-08-04T00:01:28.188770Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def freeze(module):\n    \"\"\"\n    Freezes module's parameters.\n    \"\"\"\n    \n    for parameter in module.parameters():\n        parameter.requires_grad = False\n        \ndef get_freezed_parameters(module):\n    \"\"\"\n    Returns names of freezed parameters of the given module.\n    \"\"\"\n    \n    freezed_parameters = []\n    for name, parameter in module.named_parameters():\n        if not parameter.requires_grad:\n            freezed_parameters.append(name)\n            \n    return freezed_parameters","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:01:28.527339Z","iopub.execute_input":"2022-08-04T00:01:28.527950Z","iopub.status.idle":"2022-08-04T00:01:28.534717Z","shell.execute_reply.started":"2022-08-04T00:01:28.527917Z","shell.execute_reply":"2022-08-04T00:01:28.533559Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# append to train/test.csv\ndef get_essay(essay_id, is_train=True):\n    parent_path = INPUT_DIR + 'train' if is_train else INPUT_DIR + 'test' \n    essay_path = os.path.join(parent_path, f\"{essay_id}.txt\")\n    essay_text = open(essay_path, 'r').read()\n    return essay_text","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:01:28.801660Z","iopub.execute_input":"2022-08-04T00:01:28.802232Z","iopub.status.idle":"2022-08-04T00:01:28.808099Z","shell.execute_reply.started":"2022-08-04T00:01:28.802201Z","shell.execute_reply":"2022-08-04T00:01:28.807082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Feedback-2021-Data","metadata":{}},{"cell_type":"code","source":"INPUT_DIR = '../input/feedback-prize-2021/'\nINPUT_DIR_2022 = '../input/feedback-prize-effectiveness/'\n\nif CFG.debug:\n    INPUT_DIR = '../input/debugpseudo/'","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:01:29.552775Z","iopub.execute_input":"2022-08-04T00:01:29.553454Z","iopub.status.idle":"2022-08-04T00:01:29.558446Z","shell.execute_reply.started":"2022-08-04T00:01:29.553421Z","shell.execute_reply":"2022-08-04T00:01:29.557467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = pd.read_csv(INPUT_DIR + 'train.csv')\ndisplay(test)","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:01:30.282742Z","iopub.execute_input":"2022-08-04T00:01:30.283444Z","iopub.status.idle":"2022-08-04T00:01:31.693729Z","shell.execute_reply.started":"2022-08-04T00:01:30.283409Z","shell.execute_reply":"2022-08-04T00:01:31.692710Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Remove Duplicate\ntest_2022 = pd.read_csv(INPUT_DIR_2022 + 'train.csv')\ntest_2022_essay = test_2022.loc[:, 'essay_id']\ntest_2022_essay = test_2022_essay.drop_duplicates(keep='first', inplace=False).reset_index(drop = True)\ntest_2022_essay = np.array(test_2022_essay)\ntest_2022_essay = test_2022_essay.tolist()\n#display(test_2022_essay)","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:01:31.696197Z","iopub.execute_input":"2022-08-04T00:01:31.697260Z","iopub.status.idle":"2022-08-04T00:01:31.836127Z","shell.execute_reply.started":"2022-08-04T00:01:31.697221Z","shell.execute_reply":"2022-08-04T00:01:31.835149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test['keep'] = True\nfor i in range(len(test)):\n    id = test.loc[i, 'id']\n    if id in test_2022_essay:\n        test.loc[i, 'keep'] = False\n#test_dup = test[(test['keep']) == False].reset_index(drop=True)\ntest = test[(test['keep'])].reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:01:31.838481Z","iopub.execute_input":"2022-08-04T00:01:31.839222Z","iopub.status.idle":"2022-08-04T00:01:51.705431Z","shell.execute_reply.started":"2022-08-04T00:01:31.839184Z","shell.execute_reply":"2022-08-04T00:01:51.704276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(test)","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:01:51.708328Z","iopub.execute_input":"2022-08-04T00:01:51.709412Z","iopub.status.idle":"2022-08-04T00:01:51.731848Z","shell.execute_reply.started":"2022-08-04T00:01:51.709374Z","shell.execute_reply":"2022-08-04T00:01:51.730748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Pseudo Data\ntest['essay_text'] = test['id'].apply(lambda x: get_essay(x, is_train=True))\ntest = test.loc[:, ['id', 'discourse_text', 'discourse_type', 'essay_text']]\n\ntest['id'] = 0\nfor i in range(len(test)):\n    test.loc[i, 'id'] = 'pseudo_data' + str(i)\ntest.head()","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:01:51.733569Z","iopub.execute_input":"2022-08-04T00:01:51.733950Z","iopub.status.idle":"2022-08-04T00:04:14.867261Z","shell.execute_reply.started":"2022-08-04T00:01:51.733914Z","shell.execute_reply":"2022-08-04T00:04:14.865778Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(test)","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:04:14.868550Z","iopub.status.idle":"2022-08-04T00:04:14.869292Z","shell.execute_reply.started":"2022-08-04T00:04:14.869031Z","shell.execute_reply":"2022-08-04T00:04:14.869057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if CFG.fast:\n    tokenizer = AutoTokenizer.from_pretrained(CFG.model, use_fast=True)\nelse:\n    tokenizer = AutoTokenizer.from_pretrained(CFG.model)\nCFG.tokenizer = tokenizer","metadata":{"execution":{"iopub.status.busy":"2022-08-03T23:59:21.145581Z","iopub.execute_input":"2022-08-03T23:59:21.146268Z","iopub.status.idle":"2022-08-03T23:59:22.238439Z","shell.execute_reply.started":"2022-08-03T23:59:21.146230Z","shell.execute_reply":"2022-08-03T23:59:22.237495Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Normalize","metadata":{}},{"cell_type":"code","source":"from text_unidecode import unidecode\nfrom typing import Dict, List, Tuple\nimport codecs\n\ndef replace_encoding_with_utf8(error: UnicodeError) -> Tuple[bytes, int]:\n    return error.object[error.start : error.end].encode(\"utf-8\"), error.end\n\n\ndef replace_decoding_with_cp1252(error: UnicodeError) -> Tuple[str, int]:\n    return error.object[error.start : error.end].decode(\"cp1252\"), error.end\n\n# Register the encoding and decoding error handlers for `utf-8` and `cp1252`.\ncodecs.register_error(\"replace_encoding_with_utf8\", replace_encoding_with_utf8)\ncodecs.register_error(\"replace_decoding_with_cp1252\", replace_decoding_with_cp1252)\n\ndef resolve_encodings_and_normalize(text: str) -> str:\n    \"\"\"Resolve the encoding problems and normalize the abnormal characters.\"\"\"\n    text = (\n        text.encode(\"raw_unicode_escape\")\n        .decode(\"utf-8\", errors=\"replace_decoding_with_cp1252\")\n        .encode(\"cp1252\", errors=\"replace_encoding_with_utf8\")\n        .decode(\"utf-8\", errors=\"replace_decoding_with_cp1252\")\n    )\n    text = unidecode(text)\n    return text","metadata":{"execution":{"iopub.status.busy":"2022-08-03T23:59:22.240489Z","iopub.execute_input":"2022-08-03T23:59:22.240869Z","iopub.status.idle":"2022-08-03T23:59:22.256392Z","shell.execute_reply.started":"2022-08-03T23:59:22.240834Z","shell.execute_reply":"2022-08-03T23:59:22.255463Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test['discourse_text'] = test['discourse_text'].apply(lambda x : resolve_encodings_and_normalize(x))\ntest['essay_text'] = test['essay_text'].apply(lambda x : resolve_encodings_and_normalize(x))\n# Tokenize the test data\ntest['text'] = test['discourse_type'] + ' '+ test['discourse_text'] + '[SEP]' + test['essay_text']\n#test['label'] = np.nan","metadata":{"execution":{"iopub.status.busy":"2022-08-03T23:59:22.366477Z","iopub.execute_input":"2022-08-03T23:59:22.366752Z","iopub.status.idle":"2022-08-03T23:59:22.378549Z","shell.execute_reply.started":"2022-08-03T23:59:22.366727Z","shell.execute_reply":"2022-08-03T23:59:22.377441Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(test)","metadata":{"execution":{"iopub.status.busy":"2022-08-03T23:59:22.804634Z","iopub.execute_input":"2022-08-03T23:59:22.805563Z","iopub.status.idle":"2022-08-03T23:59:22.826983Z","shell.execute_reply.started":"2022-08-03T23:59:22.805510Z","shell.execute_reply":"2022-08-03T23:59:22.825753Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dataset","metadata":{}},{"cell_type":"code","source":"# Testing Datasets\nclass TestDataset(Dataset):\n    def __init__(self, cfg, df):\n        self.cfg = cfg\n        self.text = df['text'].values\n\n    def __len__(self):\n        return len(self.text)\n\n    def __getitem__(self, item):\n        inputs = self.cfg.tokenizer.encode_plus(\n                        self.text[item],\n                        truncation=True,\n                        add_special_tokens=True,\n                        max_length=self.cfg.max_len\n                    )\n        samples = {\n            'input_ids': inputs['input_ids'],\n            'attention_mask': inputs['attention_mask'],\n        }\n\n        if 'token_type_ids' in inputs:\n            samples['token_type_ids'] = inputs['token_type_ids']\n        \n        return samples","metadata":{"execution":{"iopub.status.busy":"2022-08-03T23:59:23.806690Z","iopub.execute_input":"2022-08-03T23:59:23.807393Z","iopub.status.idle":"2022-08-03T23:59:23.817337Z","shell.execute_reply.started":"2022-08-03T23:59:23.807360Z","shell.execute_reply":"2022-08-03T23:59:23.815655Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dynamic padding","metadata":{}},{"cell_type":"code","source":"# Dynamic Padding (Collate)\n# collate_fn = DataCollatorWithPadding(tokenizer=CFG.tokenizer)\nclass Collate:\n    def __init__(self, tokenizer, isTrain=True):\n        self.tokenizer = tokenizer\n        self.isTrain = isTrain\n        # self.args = args\n\n    def __call__(self, batch):\n        output = dict()\n        output[\"input_ids\"] = [sample[\"input_ids\"] for sample in batch]\n        output[\"attention_mask\"] = [sample[\"attention_mask\"] for sample in batch]\n        if self.isTrain:\n            output[\"target\"] = [sample[\"target\"] for sample in batch]\n\n        # calculate max token length of this batch\n        batch_max = max([len(ids) for ids in output[\"input_ids\"]])\n\n        # add padding\n        if self.tokenizer.padding_side == \"right\":\n            output[\"input_ids\"] = [s + (batch_max - len(s)) * [self.tokenizer.pad_token_id] for s in output[\"input_ids\"]]\n            output[\"attention_mask\"] = [s + (batch_max - len(s)) * [0] for s in output[\"attention_mask\"]]\n        else:\n            output[\"input_ids\"] = [(batch_max - len(s)) * [self.tokenizer.pad_token_id] + s for s in output[\"input_ids\"]]\n            output[\"attention_mask\"] = [(batch_max - len(s)) * [0] + s for s in output[\"attention_mask\"]]\n\n        # convert to tensors\n        output[\"input_ids\"] = torch.tensor(output[\"input_ids\"], dtype=torch.long)\n        output[\"attention_mask\"] = torch.tensor(output[\"attention_mask\"], dtype=torch.long)\n        if self.isTrain:\n            output[\"target\"] = torch.tensor(output[\"target\"], dtype=torch.long)\n\n        return output\ncollate_fn = Collate(CFG.tokenizer, isTrain=False)","metadata":{"execution":{"iopub.status.busy":"2022-08-03T23:59:24.822570Z","iopub.execute_input":"2022-08-03T23:59:24.823732Z","iopub.status.idle":"2022-08-03T23:59:24.837856Z","shell.execute_reply.started":"2022-08-03T23:59:24.823686Z","shell.execute_reply":"2022-08-03T23:59:24.836769Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Layers","metadata":{}},{"cell_type":"code","source":"class MeanPooling(nn.Module):\n    def __init__(self):\n        super(MeanPooling, self).__init__()\n        \n    def forward(self, last_hidden_state, attention_mask):\n        input_mask_expanded = attention_mask.unsqueeze(-1).expand(last_hidden_state.size()).float()\n        sum_embeddings = torch.sum(last_hidden_state * input_mask_expanded, 1)\n        sum_mask = input_mask_expanded.sum(1)\n        sum_mask = torch.clamp(sum_mask, min=1e-9)\n        mean_embeddings = sum_embeddings / sum_mask\n        return mean_embeddings","metadata":{"execution":{"iopub.status.busy":"2022-08-03T23:59:25.680328Z","iopub.execute_input":"2022-08-03T23:59:25.681198Z","iopub.status.idle":"2022-08-03T23:59:25.687870Z","shell.execute_reply.started":"2022-08-03T23:59:25.681149Z","shell.execute_reply":"2022-08-03T23:59:25.686895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"class FeedBackModel(nn.Module):\n    def __init__(self, model_name):\n        super(FeedBackModel, self).__init__()\n        # Header (fast or normal)\n        self.model = AutoModel.from_pretrained(model_name)\n        \n        # Gradient_checkpointing\n        if CFG.gradient_checkpointing:\n            (self.model).gradient_checkpointing_enable()\n        \n        # Freezing\n        if CFG.freezing:\n            # freezing embeddings and first 2 layers of encoder\n            freeze((self.model).embeddings)\n            freeze((self.model).encoder.layer[:2])\n            CFG.after_freezed_parameters = filter(lambda parameter: parameter.requires_grad, (self.model).parameters())\n        \n        self.config = AutoConfig.from_pretrained(model_name)\n        self.drop = nn.Dropout(p=CFG.dropout)\n        self.pooler = MeanPooling()\n        self.fc = nn.Linear(self.config.hidden_size, CFG.target_size)\n        \n    def forward(self, ids, mask):        \n        out = self.model(input_ids=ids, \n                         attention_mask=mask,\n                         output_hidden_states=False)\n        out = self.pooler(out.last_hidden_state, mask)\n        out = self.drop(out)\n        outputs = self.fc(out)\n        return outputs","metadata":{"execution":{"iopub.status.busy":"2022-08-03T23:59:26.496600Z","iopub.execute_input":"2022-08-03T23:59:26.497297Z","iopub.status.idle":"2022-08-03T23:59:26.506217Z","shell.execute_reply.started":"2022-08-03T23:59:26.497257Z","shell.execute_reply":"2022-08-03T23:59:26.504767Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Prediction","metadata":{}},{"cell_type":"code","source":"# predict the test value result\ndef inference_fn(test_loader, model, device):\n    preds = []\n    model.eval()\n    model.to(device)\n    tk0 = tqdm(test_loader, total=len(test_loader))\n    for data in tk0:\n        ids = data['input_ids'].to(device, dtype = torch.long)\n        mask = data['attention_mask'].to(device, dtype = torch.long)\n        with torch.no_grad():\n            y_preds = model(ids, mask)\n        y_preds = softmax(y_preds.to('cpu').numpy())\n        # y_preds = y_preds.to('cpu').numpy()\n        preds.append(y_preds)\n    predictions = np.concatenate(preds)\n    return predictions","metadata":{"execution":{"iopub.status.busy":"2022-08-03T23:59:27.295358Z","iopub.execute_input":"2022-08-03T23:59:27.296213Z","iopub.status.idle":"2022-08-03T23:59:27.303410Z","shell.execute_reply.started":"2022-08-03T23:59:27.296165Z","shell.execute_reply":"2022-08-03T23:59:27.302158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"testDataset = TestDataset(CFG, test)\ntest_loader = DataLoader(testDataset,\n                          batch_size = CFG.batch_size,\n                          shuffle=False,\n                          collate_fn = Collate(CFG.tokenizer, isTrain=False),\n                          num_workers = CFG.num_workers,\n                          pin_memory = True,\n                          drop_last=False)\ndeberta_predictions = []\nfor i in CFG.trn_fold:\n    model = FeedBackModel(CFG.model)\n    model.load_state_dict(torch.load('../input/dbv3basemodels202279/models-deberta-v3-base-deberta-v3-base_fold' + str(i) +'_best.pth'))\n    prediction = inference_fn(test_loader, model, device)\n    deberta_predictions.append(prediction)\n    torch.cuda.empty_cache()\n    gc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-08-03T23:59:27.687596Z","iopub.execute_input":"2022-08-03T23:59:27.687949Z","iopub.status.idle":"2022-08-04T00:00:22.222819Z","shell.execute_reply.started":"2022-08-03T23:59:27.687920Z","shell.execute_reply":"2022-08-04T00:00:22.220473Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = np.mean(deberta_predictions, axis=0)\ntest['pre_Ineffective'] = predictions[:, 0]\ntest['pre_Adequate'] = predictions[:, 1]\ntest['pre_Effective'] = predictions[:, 2]","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:00:22.225228Z","iopub.execute_input":"2022-08-04T00:00:22.225957Z","iopub.status.idle":"2022-08-04T00:00:22.233746Z","shell.execute_reply.started":"2022-08-04T00:00:22.225919Z","shell.execute_reply":"2022-08-04T00:00:22.232832Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pseudo_rate = 0.9 #the lowest boundary of pseudo labels\ntest['discourse_effectiveness'] = ''\ntest['check'] = 0\ntest.loc[test['pre_Ineffective'] > pseudo_rate, ['discourse_effectiveness', 'check']] = 'Ineffective', 1\ntest.loc[test['pre_Adequate'] > pseudo_rate, ['discourse_effectiveness', 'check']] = 'Adequate', 1\ntest.loc[test['pre_Effective'] > pseudo_rate, ['discourse_effectiveness', 'check']] = 'Effective', 1\ndisplay(test)","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:00:22.235302Z","iopub.execute_input":"2022-08-04T00:00:22.235697Z","iopub.status.idle":"2022-08-04T00:00:22.262067Z","shell.execute_reply.started":"2022-08-04T00:00:22.235661Z","shell.execute_reply":"2022-08-04T00:00:22.261031Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.rename(columns={\"id\": \"discourse_id\"}, inplace=True)\npseudo_test = test[(test['check'] == 1)].reset_index(drop=True)\npseudo_test = pseudo_test.loc[:, ['discourse_id', 'discourse_text', 'discourse_type', 'discourse_effectiveness', 'essay_text', 'text']]\ndisplay(pseudo_test)","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:00:22.264241Z","iopub.execute_input":"2022-08-04T00:00:22.264661Z","iopub.status.idle":"2022-08-04T00:00:22.281043Z","shell.execute_reply.started":"2022-08-04T00:00:22.264619Z","shell.execute_reply":"2022-08-04T00:00:22.279819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pseudo_test.to_csv('pseudo_label.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-08-04T00:00:22.282387Z","iopub.execute_input":"2022-08-04T00:00:22.282711Z","iopub.status.idle":"2022-08-04T00:00:22.290536Z","shell.execute_reply.started":"2022-08-04T00:00:22.282678Z","shell.execute_reply":"2022-08-04T00:00:22.289221Z"},"trusted":true},"execution_count":null,"outputs":[]}]}