LLM で日本語文章校正したいメモ

とりあえずは BERT を試しました.

BERTのMasked Language Modelを利用して文の校正を行う
https://qiita.com/wwacky/items/0101b2797c89626d65b2

ありがとうございます.

https://huggingface.co/cl-tohoku/bert-large-japanese
(bert-large-japanese-char は単語単位なので文章校正とかにはむかなさそう)

を使うとちょっとはよい結果になりましたが, 「絵がとても上手い」はだめでした
「絵がとても上手です」は top_k 10 に入った!

```
DEBUG:models.bert_proofreader:top k word=['料理', '歌', 'ダンス', 'ピアノ', '音楽', '絵', 'ギター', '英語', '
声', 'トランペット']
INFO:models.bert_proofreader:が: True
DEBUG:models.bert_proofreader:top k word=['が', 'は', 'も', '、', ':', '-', 'って', 'とても', 'なんて', 'で']
INFO:models.bert_proofreader:とても: True
DEBUG:models.bert_proofreader:top k word=['お', 'とても', 'いちばん', '少し', '超', 'ちょっと', 'すごい', '大', 'あまり', '大変']
INFO:models.bert_proofreader:上手: True
DEBUG:models.bert_proofreader:top k word=['上手', '好き', '得意', '大好き', '下手', 'きれい', '綺麗', '苦手', '巧み', 'うま']
INFO:models.bert_proofreader:です: True
DEBUG:models.bert_proofreader:top k word=['。', ')', '!', '」', 'です', '?', 'で', 'な', '.', '(']
True
```

また, 人物など固有名詞があるとうまくいきません.

`図書館で勉強している田中さんを見ました`

```
DEBUG:models.bert_proofreader:top k word=['図書', '美術', '映画', '小学', '立命', '大使', '博物', '公民', '水
族', '天文']
INFO:models.bert_proofreader:館: True
DEBUG:models.bert_proofreader:top k word=['館', '室', '委員', 'センター', '倉庫', 'コーナー', '研', '売り場', '庫', '園']
INFO:models.bert_proofreader:で: True
DEBUG:models.bert_proofreader:top k word=['で', 'を', 'の', 'にて', 'に', 'と', '受験', 'が', 'も', 'は']
INFO:models.bert_proofreader:勉強: True
DEBUG:models.bert_proofreader:top k word=['読書', '勉強', '朗読', '作業', 'アルバイト', 'バイト', '講演', '休
憩', '整理', '活動']
INFO:models.bert_proofreader:し: True
DEBUG:models.bert_proofreader:top k word=['し', 'やっ', '##っ', '##張っ', '行っ', 'でき', '見', '立っ', '聞い', '##合っ']
INFO:models.bert_proofreader:て: True
DEBUG:models.bert_proofreader:top k word=['て', 'で', 'てる', 'に', 'ながら', 'って', 'ちゃ', 'つつ', 'た', '
と']
INFO:models.bert_proofreader:いる: True
DEBUG:models.bert_proofreader:top k word=['いる', '、', '初めて', 'た', 'から', 'いく', 'も', 'くれる', 'い', 'くる']
INFO:models.bert_proofreader:田中: False
DEBUG:models.bert_proofreader:top k word=['おじ', '奥', 'みな', '皆', 'おば', '橋本', '花子', '学生', '鈴木', '小林']
INFO:models.bert_proofreader:さん: True
DEBUG:models.bert_proofreader:top k word=['さん', '先生', 'くん', '裕子', '君', '氏', '久美子', '公平', '直樹', '涼子']
INFO:models.bert_proofreader:を: True
DEBUG:models.bert_proofreader:top k word=['を', 'が', 'も', '、', 'は', 'から', 'ちょっと', '初めて', 'と', '
夢']
INFO:models.bert_proofreader:見: True
DEBUG:models.bert_proofreader:top k word=['見', '見かけ', '見つけ', '訪ね', '撮り', '助け', '描き', '迎え', '
み', '映し']
INFO:models.bert_proofreader:まし: True
DEBUG:models.bert_proofreader:top k word=['まし', 'たかっ', 'られ', 'て', 'かね', '間違え', '##上げ', '始め', 'たく', '##つけ']
INFO:models.bert_proofreader:た: True
DEBUG:models.bert_proofreader:top k word=['た', 'て', '。', 'たら', '##ょ', '##く', 'たり', 'てる', '.', 'たい']
False
```

最初に Ginza などで固有名詞はマスクから除外するなどするとよいかもしれません.
文章がある程度まとまっているのであれば, ファインチューンで対応も考えられるかもしれません(未検証)

## 文章補完(?)したい

`図書館で勉強してい人を見ました`

みたいに欠けている(?)ときに `図書館で勉強している人を見ました` と補完(?)したい.

```
DEBUG:models.bert_proofreader:top k word=['図書', '映画', '小学', '大使', '美術', '水族', '体育', '立命', '公
民', '博物']
INFO:models.bert_proofreader:館: True
DEBUG:models.bert_proofreader:top k word=['館', '室', 'センター', '委員', 'コーナー', '研', '園', '倉庫', '売
り場', 'ホール']
INFO:models.bert_proofreader:で: True
DEBUG:models.bert_proofreader:top k word=['で', 'の', 'を', 'に', 'にて', 'は', 'が', '、', 'さん', 'と']
INFO:models.bert_proofreader:勉強: True
DEBUG:models.bert_proofreader:top k word=['読書', '勉強', '作業', '整理', 'アルバイト', '朗読', '休憩', '活動', 'バイト', '勤務']
INFO:models.bert_proofreader:し: True
DEBUG:models.bert_proofreader:top k word=['し', 'やっ', '##張っ', '行っ', 'でき', '##っ', '見', '疲れ', '考え', '聞い']
INFO:models.bert_proofreader:て: True
DEBUG:models.bert_proofreader:top k word=['て', 'てる', 'に', 'ちゃ', 'た', 'で', 'あ', 'ながら', 'たり', '中']
INFO:models.bert_proofreader:い: False
DEBUG:models.bert_proofreader:top k word=['いる', 'くれる', 'いく', 'くる', 'ない', '働く', '2', '若い', 'みる
', '暮らす']
INFO:models.bert_proofreader:人: False
DEBUG:models.bert_proofreader:top k word=['テレビ', 'の', '映画', '夢', '授業', 'アニメ', '本', '鏡', 'た', '
ビデオ']
INFO:models.bert_proofreader:を: True
DEBUG:models.bert_proofreader:top k word=['を', 'が', 'に', 'から', 'も', 'は', 'と', '初めて', 'か', 'なら']
INFO:models.bert_proofreader:見: True
DEBUG:models.bert_proofreader:top k word=['見つけ', '助け', '集め', '見かけ', '見', '励まし', '呼び', '探し', '亡くし', '撮り']
INFO:models.bert_proofreader:まし: True
DEBUG:models.bert_proofreader:top k word=['まし', 'られ', 'たかっ', '間違え', 'て', 'かね', '始め', '##張っ', 'なかっ', '##上げ']
INFO:models.bert_proofreader:た: True
DEBUG:models.bert_proofreader:top k word=['た', 'て', '。', 'たら', 'たり', '##ょ', 'てる', '##く', 'ちゃ', '
ます']
```

一応候補にはでてきます. 
ただ, こちらは Ginza などでの対応でも十分かもしれません.

より欠けが多い場合, text-generation で前と後が決まっているときに文章を生成や, Mask 内で生成される単語増やしたりできるのかしらん?


## GPT とかで高みを目指したい

近いうちに, GPT-4 や, より大きな LLM とその処理ライブラリ(e.g. huggingface transformers)でなにかよりぺろっとやってくれそうな気もします! それまでは BERT あたりで予習しておくのがよいですかね.