データセットの準備

import pandas as pd
import numpy as np

Japanese Realistic Textual Entailment Corpus

データセットをダウンロードします。 データセットのラインセスについては データセット情報 を確認してください。

データセットのリポジトリをclone をします。

$ git clone https://github.com/megagonlabs/jrte-corpus

データのロード

pn_df = pd.read_table(
    "jrte-corpus/data/pn.tsv",
    header=None,
    names=["id", "label", "text", "judges", "usage"]
)
pn_df.head()
id label text judges usage
0 pn17q00001 0 出張でお世話になりました。 {"0": 3} test
1 pn17q00002 0 朝食は普通でした。 {"0": 3} test
2 pn17q00003 1 また是非行きたいです。 {"1": 3} test
3 pn17q00004 1 また利用したいと思えるホテルでした。 {"1": 3} test
4 pn17q00005 1 駅から近くて便利でした。 {"0": 1, "1": 2} test

ラベルの変換

pn_df["label"] = pn_df["label"].map({1: "positive", 0: "neutral", -1: "negative"})
pn_df.head()
id label text judges usage
0 pn17q00001 neutral 出張でお世話になりました。 {"0": 3} test
1 pn17q00002 neutral 朝食は普通でした。 {"0": 3} test
2 pn17q00003 positive また是非行きたいです。 {"1": 3} test
3 pn17q00004 positive また利用したいと思えるホテルでした。 {"1": 3} test
4 pn17q00005 positive 駅から近くて便利でした。 {"0": 1, "1": 2} test

データの保存

# 保存用のディレクトリを作成します
import pathlib

pathlib.Path("input").mkdir(exist_ok=True)
save_columns = ["label", "text", "judges"]
pn_df[save_columns].to_csv("input/pn.csv", index=None)

後のモデル学習の際に利用するために、ジャッジが一致しているサンプルのみを取り出した結果も保存しておきます。

import json

judges_all_same = pn_df["judges"] \
    .apply(lambda x: len(json.loads(x).keys()) == 1)

pn_df[judges_all_same] \
    .reset_index(drop=True)[save_columns] \
    .to_csv("input/pn_same_judge.csv", index=None)

二値分類モデルの学習データの作成

二値分類モデルの学習データの例としてすぐに使えるように、テキストに前処理を行った結果も保存しておきます。

# positive, neutral, negative の中から negative なレビューを当てるタスクとして、
# negativeを1に、それ以外のpositive, neutralを0に設定します。
pn_df["label_num"] = pn_df["label"].map({"positive": 0, "neutral": 0, "negative": 1})
import spacy

nlp = spacy.load("ja_core_news_md")

def tokenize(text):
   return [token.lemma_ for token in nlp(text)]
2022-05-27 01:08:58.535669: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory
2022-05-27 01:08:58.535760: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
pn_df["tokens"] = pn_df["text"].apply(lambda x: " ".join(tokenize(x)))
pn_df.head()
id label text judges usage label_num tokens
0 pn17q00001 neutral 出張でお世話になりました。 {"0": 3} test 0 出張 で お 世話 に なる ます た 。
1 pn17q00002 neutral 朝食は普通でした。 {"0": 3} test 0 朝食 は 普通 です た 。
2 pn17q00003 positive また是非行きたいです。 {"1": 3} test 0 また 是非 行く たい です 。
3 pn17q00004 positive また利用したいと思えるホテルでした。 {"1": 3} test 0 また 利用 する たい と 思える ホテル です た 。
4 pn17q00005 positive 駅から近くて便利でした。 {"0": 1, "1": 2} test 0 駅 から 近い て 便利 です た 。
save_columns = ["text", "label_num", "tokens"]

pn_df[judges_all_same] \
    .reset_index(drop=True)[save_columns] \
    .to_csv("input/pn_same_judge_preprocessed.csv", index=None)
df = pd.read_csv("input/pn_same_judge_preprocessed.csv")