Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

2/55 この講演で得られること AIを使った誤字検出機能の開発⽅法 データセットの作り⽅、UIの改善、 ルールベースの⽂章校正 AIによる⾃然⾔語処理のためのアイデア

Slide 3

Slide 3 text

3/55 1. 昨年までの開発状況 2. 新しい誤字検出機能の開発 3. 実装上の改良点 4. シナリオ執筆ツールのUIを改良 5. ルールベースの⽂章校正機能 6. まとめ アジェンダ

Slide 4

Slide 4 text

4/55 ⽴福 寛 開発運営⽀援 / エンジニア 複数のゲーム会社でコンテンツパイプラインの構築、モバイルゲームの開 発・運営などを担当。2018年10⽉に株式会社Cygamesへ⼊社。2019年 後半からAIの社内導⼊に取り組んでいる。 CEDEC2021では「ゲーム制作効率化のためのAIによる画像認識・⾃然⾔ 語処理への取り組み」という発表を⾏った。 ⾃⼰紹介

Slide 5

Slide 5 text

5/55 昨年までの開発状況

Slide 6

Slide 6 text

6/55 はじめに n 社内のシナリオライターが使⽤するツール n 執筆、監修、台本作成などの豊富な機能 n Cygames Tech Conference : ウマ娘 プリティーダービーの⼤規模シナ リオ制作を効率化するソリューション 〜社内Webアプリ開発運⽤事例〜 社内向けのシナリオ執筆ツール

Slide 7

Slide 7 text

7/55 最初の誤字検出機能を開発 誤字なし 誤字あり 誤字の種類 写真を撮ってほしい 写真を取ってほしい 漢字の間違い おはようございます おはいようございます 余計な⽂字が⼊っている 掛けてもらった 掛けて貰った 補助動詞が漢字 n 誤字検出機能を開発、ツールへ組み込み n 誤字の位置を求めることができるようになった 最初の誤字検出機能 n シナリオ執筆ツールのユーザー「シナリオの誤字をAIで⾒つけて欲しい」 開発の経緯

Slide 8

Slide 8 text

8/55 最初の誤字検出機能の構成 3つのモデルから誤字の位置を求める ⽂章を誤字なし・ありに分類 形態素解析 単語の出現順を求める 誤字の位置を決定

Slide 9

Slide 9 text

9/55 最初の誤字検出機能の結果 成功「イベントは⼤盛況のちに終わった」 単語1 単語2 単語3 単語4 単語5 単語6 単語7 イベント は ⼤ 盛況 のち に 終わった

Slide 10

Slide 10 text

10/55 最初の誤字検出機能の課題 n 誤検出のときにわかりにくい 結果が「誤字の位置」のみ n ツールのUIを改善する必要がある n 後半で詳しく説明 利⽤するユーザーが限られていた

Slide 11

Slide 11 text

11/55 新しい誤字検出機能の開発

Slide 12

Slide 12 text

12/55 以前のバージョンの課題 n 誤検出のときに問題 n 誤字なのか︖ 誤検出なのか︖ 「誤字の位置」だけではわかりにくい ここに誤字があります 「彼⼥の⼿を放した」 あってるけどなぁ︖

Slide 13

Slide 13 text

13/55 訂正候補を出すように変更 n AIがどのように考えたのか理解しやすい n 誤字と誤検出の判断が簡単に 「訂正候補」があるとわかりやすい こちらが正しいのでは︖ 「彼⼥の⼿を放した」 ↓ 「彼⼥の⼿を離した] 違うよ︕ (誤検出か〜)

Slide 14

Slide 14 text

14/55 新しい誤字検出のモデル

Slide 15

Slide 15 text

15/55 新しい誤字検出機能の概要 n 元の⽂章と誤字を⼊れた⽂章のセットを学習 n 誤字を⼊れた⽂書を元の⽂章の差をなくすように学習 n 誤字を含む⽂章を⼊⼒すると元の⽂章を出⼒ BERTを使った⽂章校正 誤字のある⽂章 誤字の位置、訂正候補 BERT

Slide 16

Slide 16 text

16/55 ⾃然⾔語処理モデルBERT n 2018年10⽉にGoogleから発表された⾃然⾔語処理モデル n 翻訳、⽂書分類、質問応答などのタスクで当時の最⾼スコアを達成 n ⾃然⾔語処理でよく使われている BERT n 新しいモデルが登場 n 前回使ったので慣れている n ドキュメントが充実 なぜBERT? n 今回の実装で参考 n 資料の最後に記載 参考⽂献

Slide 17

Slide 17 text

17/55 BERTの学習 ⼊⼒ 今⽇ は MASK です いい BERT 分類スコアが最⼤の単語 正解ラベル 今⽇ は ? です いい 今⽇ は 天気 です いい n ⼊⼒トークンをランダムで[MASK]に⼊れ替え n 正しいトークンをクラス分類問題として学習(クラス数=BERTの語彙数) n BERTはトークンごとのラベルの分類スコアを出⼒ テキストの⽳埋め問題

Slide 18

Slide 18 text

18/55 BERTによる⽂章校正(学習) 誤字のある⽂章 今⽇ MASK 天気 です いや BERT 誤字のない⽂章 今⽇ ︖ 天気 です いか 今⽇ は 天気 です いい 分類スコアが最⼤の単語 n ⼊⼒︓誤字のある⽂章 n 正解ラベル︓誤字のない⽂章 ⼊⼒と正解を⼊れ替え

Slide 19

Slide 19 text

19/55 BERTによる⽂章校正(推論) 推論時にはトークンごとに分類スコアを求める n 分類スコアが最⼤の単語を選ぶ 誤字のある⽂章 今⽇は は 天気 です BERT 分類スコアが最⼤の単語 >訂正候補 今⽇ は 天気 です 推論結果 {c:[ʻ今⽇ʼ,ʼはʼ,ʼいいʼ,ʼ天気ʼ,ʼですʼ], index:2} いや いい

Slide 20

Slide 20 text

20/55 学習データセットについて

Slide 21

Slide 21 text

21/55 学習データセット 学習データセット n ゲームシナリオの⽂章 n 上記に独⾃の⽅法で誤字を⼊れた⽂章(後ほど詳しく説明) n ゲーム中の表⽰単位︓1⾏ 元の⽂章と誤字を⼊れた⽂章のセットで学習 誤字を⼊れた⽂章 元の⽂章

Slide 22

Slide 22 text

22/55 ゲームシナリオ 学習データセット ⽣成した誤字パターンの数 シナリオ1⾏ 誤字を⽣成 x5 誤字あり⽂章 元の⽂章 x5 元の⽂章 元の⽂章 x5 n 元の⽂章も5つ追加して、5:5とした n 正しい⽂章を正しいと学習してほしい ゲームシナリオ1⾏から5パターンの誤字を⽣成

Slide 23

Slide 23 text

23/55 プロジェクトA+B プロジェクトB プロジェクトA データセットを分ける︖合体する︖ n 明らかに精度が落ちたのでボツ n ゲームごとのシナリオの傾向が原因か 合体したほうが精度が⾼いのでは︖ データセット モデル データセット モデル データセット モデル n 90万⾏と170万⾏のゲームシナリオ n 今回はデータセットとモデルをそれぞれ作成 2つのゲームプロジェクトが対象

Slide 24

Slide 24 text

24/55 以前のバージョンとの⽐較 以前のバージョン 新しいバージョン 機械学習モデル 3つの機械学習モデル BERT>BERT>RandomForest 1つの機械学習モデル BERT メンテナンス性 低い ⾼い 実⾏時間(AWS Lambda上) 5〜10分 5分以下 出⼒ 誤字の位置 誤字の位置と訂正候補 誤字が無いことを正しく推論 88% 90% 誤字の位置を正しく推論 23% 63%

Slide 25

Slide 25 text

25/55 実装上の改良点

Slide 26

Slide 26 text

26/55 実装上の改良点3つと精度 誤字パターンの改良 トークンのマッチングの⼯夫 学習・テストデータの分割⽅法の改善 最終的な精度

Slide 27

Slide 27 text

27/55 誤字パターンの改良

Slide 28

Slide 28 text

28/55 誤字パターンの改良(その1) n 「よく間違えられる単語リスト」を使って⼊れ替え(*) n ひらがなに囲まれている「ない」を削除 n 「っ」を落とす n 「が」「を」などの助詞を⼊れ替える n 助詞を落とす n ひらがなのABをBABにする n ひらがなorカタカナをランダムで1⽂字落とす n 詳細はCEDEC2021の発表資料を参照 以前の誤字パターン(7つ) n (*)の部分と⼊れ替え n 詳細を次で説明 ⽇本語Wikipedia⼊⼒誤りデータセットを導⼊

Slide 29

Slide 29 text

29/55 ⼊⼒誤りデータセット 誤字パターンの改良(その2) 訂正前の⽂章 訂正後の⽂章 訂正される単語 訂正後の単語 訂正の種類 n 京都⼤学 ⿊橋・褚・村脇研究室 n JSON形式で⼊⼒誤りを訂正した情報 ⽇本語Wikipedia⼊⼒誤りデータセットを導⼊

Slide 30

Slide 30 text

30/55 ⼊⼒誤りデータセット ゲームシナリオ 誤字パターンの改良(その3) 教 ⇨ 今⽇ 今⽇はいい天気です 学習データ 教はいい天気です ゲームシナリオに適⽤ n 訂正後の単語をゲームシナリオから検索 n 訂正前の単語で置き換えて誤字を⽣成 n 単純な⽂字列マッチング(2⽂字以上、品詞は無視)

Slide 31

Slide 31 text

31/55 トークンマッチングの⼯夫

Slide 32

Slide 32 text

32/55 トークンマッチングの⼯夫(その1) n トークン数が⼀致するデータセットしか利⽤できない n 全体の6割程度しか利⽤できない(もったいない︕) 今回の仕組みはトークン数の⼀致が必要 n 2つの⽂章のトークンがずれている場合の処理 n 元の⽂章にPADを⼊れて対応を取る(⼀番対応が取りやすいところへ) n 推論時の出⼒にPADがあれば削除 PADを使って調整 誤字のある⽂章 教 は 休み に し よ ー 元の⽂章 今⽇ は 休み に し よ ー 誤字のある⽂章 準備 は で い て いる。 元の⽂章 準備 は でき て いる。 調整後 準備 は [PAD] でき て いる。

Slide 33

Slide 33 text

33/55 トークンマッチングの⼯夫(その2) PADの数 利⽤できる⽂章の割合 0 64.12% 1 78.57% 2 85.84% 3 86.50% 4 86.64% n PADの数を増やすと利⽤できる⽂章が増える n 増やしすぎると推論の精度が落ちる n PADの最⼤数3が推論の精度が最⼤に PADの数を増やした場合の⽐較

Slide 34

Slide 34 text

34/55 学習・テストデータの分割⽅法の改善

Slide 35

Slide 35 text

35/55 学習・テストデータの分割⽅法の改善 前回のバージョンのデータセット ゲームシナリオ 誤字追加 学習データ テストデータ 今回のバージョンのデータセット ゲームシナリオ 学習⽤ テスト⽤ 学習データ テストデータ 誤字追加 誤字追加 シャッフルして分割 同じ⽂章から⽣成した⽂章が含まれる︕!

Slide 36

Slide 36 text

36/55 最終的な精度

Slide 37

Slide 37 text

37/55 最終的な精度 n テストデータ10万⾏(誤字なし・あり、40%が誤字) n プロジェクトA︓データセット 170万⾏ n プロジェクトB : データセット 90万⾏ 分離しておいたテストデータでテスト 正しく判定 プロジェクトA 正しく判定 プロジェクトB 誤字を正しく訂正 38% 32% 誤字の位置を正しく検出 66% 60% 正しく判定 プロジェクトA 正しく判定 プロジェクトB 誤字のない⽂章 94% 87% 誤字のある⽂章 72% 72%

Slide 38

Slide 38 text

38/55 シナリオ執筆ツールのUIを改良

Slide 39

Slide 39 text

39/55 以前のUI n 誤字検出機能は別の「⼀括処理画⾯」に⼊っていた n UIの実装⼯数は少ない シナリオ執筆画⾯から移動して誤字検出を実⾏ ユーザーによっては使い勝⼿が悪い AIの機能を開発してもUIが悪いと使われない 別画⾯へ 移動して実⾏

Slide 40

Slide 40 text

40/55 シナリオ執筆ツールのユーザー シナリオ執筆 誤字検出︓使ってない シナリオ校正 誤字検出︓使ってる n 執筆されたシナリオを⼀括でチェックする n 複数シナリオをまとめて誤字検出 シナリオを校正する⼈ n シナリオ執筆画⾯をメインに使う>別の画⾯の機能は使いにくい シナリオを執筆する⼈

Slide 41

Slide 41 text

41/55 誤字検出実⾏までのUIの改善 シナリオ執筆画⾯ ⼀括処理画⾯ シナリオ検索 誤字検出実⾏ 結果待ち 結果確認 以前のUI 新しいUI シナリオ執筆画⾯ 誤字検出実⾏ 結果待ち 結果確認 シナリオ執筆画⾯に 追加されたボタン

Slide 42

Slide 42 text

42/55 バックグラウンドで⾃動実⾏ n ⼀定時間経過後に実⾏(AWSのコストのため) シナリオ保存時に⾃動実⾏ n 結果⼀覧画⾯でユーザーが実⾏した結果と⾃動実⾏の結果が混じる n ユーザー「結果が確認しにくい」 n ユーザー⽬線での確認が⾜りていなかったと反省 問題があったので保留

Slide 43

Slide 43 text

43/55 ルールベースの⽂章校正機能

Slide 44

Slide 44 text

44/55 ルールベースの⽂章校正機能 n 漢検1級、準1級の漢字を検出 n よく使われる漢字ならOK n 漢字のテーブルを持っておいてマッチしているだけ 難しい漢字の検出 胡 坐 n 補助動詞に漢字が使われていたら検出 n 例︓ちょっと寄って来る 補助動詞の漢字を検出 n ⽂章校正のチェック対象 n ら抜き⾔葉が全部NGではない ら抜き⾔葉を検出

Slide 45

Slide 45 text

45/55 補助動詞の検出

Slide 46

Slide 46 text

46/55 補助動詞の検出 n Juman++ : 形態素解析システム 京都⼤学 Juman++での形態素解析の結果を利⽤ ⾒出し 参考 に して 頂く 品詞 名詞 助詞 動詞 動詞 意味情報 - - - 付属動詞候補 n 「参考にして頂く」の「頂く」を検出したい n Juman++で形態素解析 n 品詞と意味情報をパターンとして登録 検出したい⽂章からパターンを作成 パターンとして登録

Slide 47

Slide 47 text

47/55 補助動詞の検出例 ⾒出し 今 から 話して 下さい 品詞 名詞 助詞 動詞 接尾辞 意味情報 - - - - ⾒出し これ まで も 戦って 参り ました が 品詞 指⽰詞 助詞 助詞 動詞 動詞 接尾辞 助詞 意味情報 - - - - 付属動詞候補 - - 品詞 動詞 接尾辞 意味情報 - - 品詞 助詞 動詞 動詞 接尾辞 意味情報 - - 付属動詞候補 パターン マッチング パターン マッチング

Slide 48

Slide 48 text

48/55 ら抜き⾔葉の検出

Slide 49

Slide 49 text

49/55 ら抜き⾔葉を検出(その1) n Webの記事を参考にして実装 n ラ抜き⾔葉判定アルゴリズムを考えてみる (https://blog.mohyo.net/2015/03/1343/) ら抜き⾔葉の検出について調べる n Juman++で形態素解析して代表表記と活⽤形1を利⽤ n あるトークンの代表表記が「れる/れる」 n ⼀つ前のトークンの活⽤形1が「未然形」「カ変動詞来」「⺟⾳動詞」 判定⽅法

Slide 50

Slide 50 text

50/55 ら抜き⾔葉を検出(その2) ⾒出し 5 時 に 来 れ ます か 代表表記 - 時/じ - 来る/くる れる/れる ます/ます か 活⽤形1 * * * カ変動詞来 ⺟⾳動詞 動詞性接尾辞ます型 * n あるトークンの代表表記が「れる/れる」 n ⼀つ前のトークンの活⽤形1が「未然形」「カ変動詞来」「⺟⾳動詞」 検出の例︓5時に来(ら)れますか

Slide 51

Slide 51 text

51/55 ら抜き⾔葉を検出(その3) n 検出158 正解148 失敗10 n ⾒逃しているケースもある n 誤検出は少ない シナリオ全体でテスト n こんなにたくさん⾷べ(ら)れない n 初⽇の出が⾒(ら)れた n あの⼈が来るとは考え(ら)れない 正しく検出 n 写真撮ってきたから⾒れ︕ n あれ︖あれれれ︖ n 今こそ来たれ︕ 誤検出

Slide 52

Slide 52 text

52/55 まとめ

Slide 53

Slide 53 text

53/55 まとめ BERTを使った誤字検出機能の開発 データセットの作成、UIの改良、 ルールベースの⽂章校正 AIによる⾃然⾔語処理のためのアイデア

Slide 54

Slide 54 text

54/55

Slide 55

Slide 55 text

55/55 参考⽂献 n BERTの各種タスクの使い⽅をわかりやすく説明 n 第9章 ⽂章校正を参考にして誤字検出を実装 BERTによる⾃然⾔語処理⼊⾨ ストックマーク株式会社 (編集), 近江 崇宏, ⾦⽥ 健太郎, 森⻑ 誠, 江間⾒ 亜利 (共著) オーム社 n Transformer/BERTの動作の説明が詳しい 作ってわかる! ⾃然⾔語処理AI 坂本 俊之 シーアンドアール研究所