{"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-10T23:07:34.793699Z","iopub.execute_input":"2022-08-10T23:07:34.795064Z","iopub.status.idle":"2022-08-10T23:07:34.805102Z","shell.execute_reply.started":"2022-08-10T23:07:34.794995Z","shell.execute_reply":"2022-08-10T23:07:34.803836Z"},"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 = False","metadata":{"execution":{"iopub.status.busy":"2022-08-10T23:07:34.818670Z","iopub.execute_input":"2022-08-10T23:07:34.819344Z","iopub.status.idle":"2022-08-10T23:07:34.828332Z","shell.execute_reply.started":"2022-08-10T23:07:34.819304Z","shell.execute_reply":"2022-08-10T23:07:34.826703Z"},"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-10T23:07:34.836545Z","iopub.execute_input":"2022-08-10T23:07:34.837364Z","iopub.status.idle":"2022-08-10T23:07:34.845802Z","shell.execute_reply.started":"2022-08-10T23:07:34.837318Z","shell.execute_reply":"2022-08-10T23:07:34.844340Z"},"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-10T23:07:34.853434Z","iopub.execute_input":"2022-08-10T23:07:34.854976Z","iopub.status.idle":"2022-08-10T23:07:34.862507Z","shell.execute_reply.started":"2022-08-10T23:07:34.854915Z","shell.execute_reply":"2022-08-10T23:07:34.861145Z"},"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-10T23:07:34.869385Z","iopub.execute_input":"2022-08-10T23:07:34.870197Z","iopub.status.idle":"2022-08-10T23:07:34.878447Z","shell.execute_reply.started":"2022-08-10T23:07:34.870153Z","shell.execute_reply":"2022-08-10T23:07:34.876854Z"},"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-10T23:07:34.888581Z","iopub.execute_input":"2022-08-10T23:07:34.889687Z","iopub.status.idle":"2022-08-10T23:07:34.897411Z","shell.execute_reply.started":"2022-08-10T23:07:34.889622Z","shell.execute_reply":"2022-08-10T23:07:34.895867Z"},"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-10T23:07:34.904520Z","iopub.execute_input":"2022-08-10T23:07:34.906029Z","iopub.status.idle":"2022-08-10T23:07:34.911959Z","shell.execute_reply.started":"2022-08-10T23:07:34.905971Z","shell.execute_reply":"2022-08-10T23:07:34.910760Z"},"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-10T23:07:34.922418Z","iopub.execute_input":"2022-08-10T23:07:34.923242Z","iopub.status.idle":"2022-08-10T23:07:34.950211Z","shell.execute_reply.started":"2022-08-10T23:07:34.923196Z","shell.execute_reply":"2022-08-10T23:07:34.948989Z"},"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-10T23:07:34.952613Z","iopub.execute_input":"2022-08-10T23:07:34.953898Z","iopub.status.idle":"2022-08-10T23:07:35.139360Z","shell.execute_reply.started":"2022-08-10T23:07:34.953844Z","shell.execute_reply":"2022-08-10T23:07:35.138252Z"},"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-10T23:07:35.141585Z","iopub.execute_input":"2022-08-10T23:07:35.142303Z","iopub.status.idle":"2022-08-10T23:07:35.158858Z","shell.execute_reply.started":"2022-08-10T23:07:35.142253Z","shell.execute_reply":"2022-08-10T23:07:35.157714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(test)","metadata":{"execution":{"iopub.status.busy":"2022-08-10T23:07:35.160429Z","iopub.execute_input":"2022-08-10T23:07:35.161500Z","iopub.status.idle":"2022-08-10T23:07:35.184026Z","shell.execute_reply.started":"2022-08-10T23:07:35.161443Z","shell.execute_reply":"2022-08-10T23:07:35.182834Z"},"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['essay_id'] = test['id']\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-10T23:07:35.187106Z","iopub.execute_input":"2022-08-10T23:07:35.188477Z","iopub.status.idle":"2022-08-10T23:07:35.218550Z","shell.execute_reply.started":"2022-08-10T23:07:35.188418Z","shell.execute_reply":"2022-08-10T23:07:35.217235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(test)","metadata":{"execution":{"iopub.status.busy":"2022-08-10T23:07:35.220399Z","iopub.execute_input":"2022-08-10T23:07:35.222607Z","iopub.status.idle":"2022-08-10T23:07:35.235284Z","shell.execute_reply.started":"2022-08-10T23:07:35.222551Z","shell.execute_reply":"2022-08-10T23:07:35.233525Z"},"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-10T23:07:35.237785Z","iopub.execute_input":"2022-08-10T23:07:35.238633Z","iopub.status.idle":"2022-08-10T23:07:36.588908Z","shell.execute_reply.started":"2022-08-10T23:07:35.238578Z","shell.execute_reply":"2022-08-10T23:07:36.587834Z"},"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-10T23:07:36.590759Z","iopub.execute_input":"2022-08-10T23:07:36.591199Z","iopub.status.idle":"2022-08-10T23:07:36.602168Z","shell.execute_reply.started":"2022-08-10T23:07:36.591156Z","shell.execute_reply":"2022-08-10T23:07:36.600248Z"},"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-10T23:07:36.604500Z","iopub.execute_input":"2022-08-10T23:07:36.606190Z","iopub.status.idle":"2022-08-10T23:07:36.621612Z","shell.execute_reply.started":"2022-08-10T23:07:36.606131Z","shell.execute_reply":"2022-08-10T23:07:36.620173Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(test)","metadata":{"execution":{"iopub.status.busy":"2022-08-10T23:07:36.625685Z","iopub.execute_input":"2022-08-10T23:07:36.626225Z","iopub.status.idle":"2022-08-10T23:07:36.643082Z","shell.execute_reply.started":"2022-08-10T23:07:36.626178Z","shell.execute_reply":"2022-08-10T23:07:36.641852Z"},"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-10T23:07:36.647361Z","iopub.execute_input":"2022-08-10T23:07:36.647743Z","iopub.status.idle":"2022-08-10T23:07:36.655829Z","shell.execute_reply.started":"2022-08-10T23:07:36.647707Z","shell.execute_reply":"2022-08-10T23:07:36.654164Z"},"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-10T23:07:36.657815Z","iopub.execute_input":"2022-08-10T23:07:36.658772Z","iopub.status.idle":"2022-08-10T23:07:36.673852Z","shell.execute_reply.started":"2022-08-10T23:07:36.658721Z","shell.execute_reply":"2022-08-10T23:07:36.672304Z"},"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-10T23:07:36.676074Z","iopub.execute_input":"2022-08-10T23:07:36.676941Z","iopub.status.idle":"2022-08-10T23:07:36.690020Z","shell.execute_reply.started":"2022-08-10T23:07:36.676892Z","shell.execute_reply":"2022-08-10T23:07:36.688548Z"},"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-10T23:07:36.694642Z","iopub.execute_input":"2022-08-10T23:07:36.695538Z","iopub.status.idle":"2022-08-10T23:07:36.707195Z","shell.execute_reply.started":"2022-08-10T23:07:36.695488Z","shell.execute_reply":"2022-08-10T23:07:36.705894Z"},"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-10T23:07:36.710277Z","iopub.execute_input":"2022-08-10T23:07:36.711207Z","iopub.status.idle":"2022-08-10T23:07:36.721510Z","shell.execute_reply.started":"2022-08-10T23:07:36.711139Z","shell.execute_reply":"2022-08-10T23:07:36.720126Z"},"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-10T23:07:36.724698Z","iopub.execute_input":"2022-08-10T23:07:36.725771Z","iopub.status.idle":"2022-08-10T23:07:54.204806Z","shell.execute_reply.started":"2022-08-10T23:07:36.725710Z","shell.execute_reply":"2022-08-10T23:07:54.203469Z"},"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-10T23:07:54.206644Z","iopub.execute_input":"2022-08-10T23:07:54.207375Z","iopub.status.idle":"2022-08-10T23:07:54.217007Z","shell.execute_reply.started":"2022-08-10T23:07:54.207329Z","shell.execute_reply":"2022-08-10T23:07:54.215481Z"},"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-10T23:07:54.219164Z","iopub.execute_input":"2022-08-10T23:07:54.219996Z","iopub.status.idle":"2022-08-10T23:07:54.253737Z","shell.execute_reply.started":"2022-08-10T23:07:54.219942Z","shell.execute_reply":"2022-08-10T23:07:54.252323Z"},"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', 'essay_id', 'discourse_text', 'discourse_type', 'discourse_effectiveness', 'essay_text', 'text']]\n\ndisplay(pseudo_test)","metadata":{"execution":{"iopub.status.busy":"2022-08-10T23:07:54.256628Z","iopub.execute_input":"2022-08-10T23:07:54.257325Z","iopub.status.idle":"2022-08-10T23:07:54.280876Z","shell.execute_reply.started":"2022-08-10T23:07:54.257260Z","shell.execute_reply":"2022-08-10T23:07:54.279199Z"},"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-10T23:07:54.283310Z","iopub.execute_input":"2022-08-10T23:07:54.284029Z","iopub.status.idle":"2022-08-10T23:07:54.295298Z","shell.execute_reply.started":"2022-08-10T23:07:54.283972Z","shell.execute_reply":"2022-08-10T23:07:54.293998Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}