Open14

GPT-2のファインチューニング試す

ピン留めされたアイテム
チャアーハンチャアーハン
  • なるべく手順通りにスクラップを並べたかったけど、スクラップの前後関係が動かせないので諦めている
  • 終わったらtech記事化してArchiveする?
  • 予備調査と本調査の分割
    • スクレイピング本格的にやる前に1/10ぐらいで全体の流れを確認すると良いかも
    • 色々アラが見つかるから
    • スクレイピングツールの調整不足など
チャアーハンチャアーハン

データスクレイピング

ツール設計

node でやる

  • データ欠損の確認などはpandasでやるのでスクレイピング周りはpython実装のが良いかもしれん

https://qiita.com/otchy/items/244c19c561ecb7211fa5

構成

  • node-fetch
  • jsdom
    • jsdomのtextContentとinnerText Chromeと挙動が違う?
  • NeDB
    • 自前でPromise化したけど、よく調べたらきちんとしたモジュールがあるじゃん…

jsdom

特殊なcssエラーへの対応

https://stackoverflow.com/questions/48830001/jsdom-could-not-parse-css-stylesheet

nedb

import文を使ったnedbの読み込み

import Database from 'nedb';
const db = new Database({ filename: "example.db"});
チャアーハンチャアーハン

スクレイピング

  • 全データ数14101だけど、ある程度スクレイピングにwaitかけると19時間以上かかる。
    • まずは1000件ぐらいのデータでとどめておく。

データチェック

  • 欠損データの調査と取り直し
  • パラメータ不足のデータの取り直し
    • 取得済みデータから類推できなかったので、取り直したほうが早い
チャアーハンチャアーハン

前処理

データ分析は前処理の時間が8割という警句あり

前処理の段階

  • 前処理は広い意味を持つ。いくつかの段階がある

https://qiita.com/Hironsan/items/2466fe0f344115aff177

  • クリーニング
  • 単語分割
  • 単語の正規化
  • ストップワード除去
  • 単語のベクトル表現

fine-tuning用のデータを考える

  • クリーニング
    • 制御文字と空白、url、定型文のカット
  • ハズレ値データの除去
    • このタイミング?
    • 検討
  • 単語分割(分かち書き)
    • 形態素解析器で分かち書き化
    • 結果が悪くなる?とりあえずやらない
  • 単語の正規化
    • 形態素解析結果を利用するパターン
    • 計算上良くなるらしいのでやる
  • ストップワード除去
    • GPT-2での効果不明
    • とりあえずやらない
  • 単語のベクトル表現
    • 日本語gpt-2にTokenizer含まれてるので手順通りで問題ない

メモ

  • GPT-2を試してみた記事を見ると、クリーニング以降は、特に何も考えずにGPT-2にそのまま入れてもよさそうではある
  • 改行表現は残すべきか?
    • 芸能人のblog記事でfine-tuningしてたものでは、空行ありのまま使ってた。
      • 文章の癖を表現するものとしては空行を残すのはありなのか?
    • 後処理(GiNZAによる文分割等)で文章を適切に分割できるなら、入力データとしてはいらない気がする
  • pandas使ったほうが良い?
    • ハズレ値を含むデータの除外高度な分析やるなら必要そうだ
    • 極端に漢字が少ないパターン等の雰囲気重視の文章の除外
    • 不要データの除去ってどのタイミングだろう?
      • データ分析に足を突っ込んでるので前処理が終わった後?
  • GiNZAによるパイプライン処理でうまくできない?
    • 知識不足で分からん。今はやらない。
  • 形態素解析いる?

参考記事

概論

https://qiita.com/dcm_sawayama/items/406408e8bda0840a8106

https://qiita.com/kakiuchis/items/9149c7249f748668bb9b

具体的な手法

  • いくつか調べたが、記事によってさほど手順が変わるわけではない
  • 新しい記事の方が、様々なツールを利用できている

https://zenn.dev/deepblackinc/books/ad568c611643c6/viewer/c37a9f

  • BARTでの前処理
    • クリーニングと正規化のみ実施
    • さしあたり行う前処理としてはこの2つが鉄板と考えて良さそうだ

https://ohke.hateblo.jp/entry/2019/02/09/141500

https://tuttieee.hatenablog.com/entry/ja-nlp-preprocess

https://qiita.com/chamao/items/7edaba62b120a660657e

新し目の技術

Encoder-Decoderモデルを用いた日本語崩れ表記の正規化

  • 実装したもの見つからず

https://logmi.jp/tech/articles/321981

https://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/P10-5.pdf

https://techlife.cookpad.com/entry/2017/10/30/080102

ツール

sudachiによる日本語文章の正規化

https://note.com/npaka/n/nd0a78d75bba3

https://ohke.hateblo.jp/entry/2019/03/09/101500

  • しょう油->醤油

GiNZAによる文分割

https://www.mojirca.com/2021/03/python-nlp-cheatsheet.html#toc_headline_11

  • 参考があんまりよくない。単に句読点で区切ってるだけでは…?

辞書とか

崩れ表記の修正に使えそうだが、正規化のためにどうやって使うのか?

https://engineering.linecorp.com/ja/blog/mecab-ipadic-neologd-new-words-and-expressions/

チャアーハンチャアーハン

Fine-tuning

GPT-2のファインチューニングに必要なデータ量ってどれぐらいだろうか?

  • 事例を調べたが、数百~数万まであるので特に決まりは無いっぽい
  • データが多くなるとそんなに良くなるとも思えない
    • そもそも少ないデータでタスクに適応させるみたいな思想じゃなかったか
    • 品質と学習時間とのトレードオフ
      • 最初は1000程度のデータでよい
  • 良いfine tuning用データとは?調査する

https://huggingface.co/transformers/training.html

  • haggingfaceのfine-tuning記事では、IMDbのdataseを利用。こいつは数万のデータのようだ

少し突っ込んだ使い方

https://qiita.com/m__k/items/36875fedf8ad1842b729

チャアーハンチャアーハン

顔文字の除去

https://qiita.com/ryo_grid/items/0c18513ae42778248a9f

NEologdにて顔文字登録有り(顔文字に手が付属してるのは無理っぽいが、ざっくりこれいいかも)

  • NEologdによる前処理の検討

https://qiita.com/dcm_murakami/items/4c016936a739bfb2a517

nagisaライブラリの利用
こっちは顔文字に手が付いてるやつの除去

https://qiita.com/ensan_hcl/items/ffa57c175aa5046cc7d6

実装が難しそう。手の表現は参考になるかも

チャアーハンチャアーハン

Pandas
特定の文字列を含む行のインデックスを取得

df[df['title'].str.contains('怖い')].index.tolist()