塩見周子の徒然日記

自分のことを塩見周子と思い込んでいるオタクです

Huggingfaceのライブラリを使って分類器を作る時の流れと、jsonl形式のファイルを読む時の話(自分用メモ)

分類器を作る

1. データを精査する
カテゴリ数や文字数についての統計をとる
どのカテゴリを使うかを決める そのまま使うとヤバいカテゴリとかの問題を見つけ、除くか決める

2. 訓練用・テスト用データを作る
使うと決めたカテゴリをラベルとし、本文("text")とカテゴリ("label")のベアを抜いてきてcsvファイルにする
文章中からURLを抜いたり表記揺れを直したりする前処理を適宜行う

3. モデルを訓練する
使うモデル(AutoModelとかAutoModelForSequenceClassificationとか)、トークナイザ、データの準備、訓練のコンフィグとかを決めたらTrainerに投げる




jsonl形式のファイル

jsonl形式とは、jsonオブジェクトが改行区切りでたくさん並んでいるファイル形式。

ふつうのjsonファイルであれば、

with open("hoge.json", "r") as f:
    L = json.load(f)

みたいにできると思う。json.load()は、ファイルオブジェクト型を引数にとる。

しかし、jsonl形式のファイルを上のようにjson.load()しようとすると、多分Extra data: line 2 column 1みたいなエラーが出るはず。
なので、それを防止するための方法が2通りある。

一つは、jsonl形式のファイルを一行ずつ読み取り、それをjson.loads()という、文字列を引数にとってjson形式だと解釈するみたいな関数を使う。(loadsの"s"はstringのs)

with open("hoge.json", "r") as f:
    temp = f.readline()  # 1行読み込み
    fuga = json.loads(temp)  # fugaに1つのjsonオブジェクトが代入される

もう一つは、JSONDecoder()クラスのクラスメソッドであるJSONDecoder.raw_decode()を使う方法がある。

decoder = json.JSONDecoder()
with open("hoge.json", "r") as f:
    temp = f.readline()  # 1行読みこみ
    fuga = decoder.raw_decode(temp)  # タプルで帰るので、fuga[0]が所望のjsonオブジェクト