見出し画像

妙高市の方言チャットボットVerUp:旧辞書 vs 新辞書を比較する ── フェーズ2 定量実験

旧辞書 vs 新辞書を比較する ── フェーズ2 定量実験

前回の記事では、方言辞書をフラット構造から 3 セクション構成に書き直しました。

今回はいよいよ実験スクリプト(`experiment.py`)を再実行し、旧辞書と新辞書の翻訳結果を並べて比較します。


先回までの振り返り

フェーズ1 では、実験スクリプトで方言変換の動作確認を行いました。その際の辞書(旧辞書)はアイウエオ順のフラット構造で、文法ルールと語彙と会話例が同じ列に混在していました。

フェーズ2 では、その辞書を次の 3 セクションに書き直しました。

$$
\begin{array}{|l|l|}
\hline
\text{セクション} & \text{役割} \\
\hline
\texttt{文法・語法ルール} & \text{LLM が最優先で参照すべき変換ルール集(8 ルール)} \\
\texttt{語彙(品詞別)} & \text{単語の対応表(9 カテゴリ)} \\
\texttt{会話例} & \text{Few-shot として機能する用例} \\
\hline
\end{array}
$$

旧辞書をバックアップした `dialect_dict_old.txt` が存在する状態でスクリプトを実行すると、旧辞書・新辞書の両方で同じフレーズを翻訳し、結果を比較するモードで動きます。今回はこれを 2 回実行(Run1・Run2)しました。


実験結果

10 文の標準語を旧辞書と新辞書でそれぞれ変換した結果を編集して並べます。各文について「Run1(1 回目)」と「Run2(2 回目)」の計 4 パターンの出力比較です。

文1 標準語:こんにちは。今日はいい天気ですね。
文1 旧辞書1:こんにちは。今日はええ天気だねや。
文1 旧辞書2:こんにちは。今日はええ天気だねや。
文1 新辞書1:こんにちは。今日はええ天気ねや。
文1 新辞書2:こんにちは。今日はええ天気だねや】【。

文2 標準語:そうですね。だいぶ暖かくなってきました。
文2 旧辞書1:そうだねや。だいぶあったけくなってきたわ。
文2 旧辞書2:そうだねや。だいぶあったかくなってきたわね。
文2 新辞書1:そうだねや。だいぶあったかくなってきたわね。
文2 新辞書2:そうだねや。だいぶあったけくなってきたわ。

文3 標準語:体調はどうですか?しばらく顔を見ませんでしたが。
文3 旧辞書1:なじょだね?しばらく顔めえねかったでも。
文3 旧辞書2:なじょだね?しばらく顔見ねかったでも。
文3 新辞書1:なじょだね?こねだ顔見ねかったでも。
文3 新辞書2:なじょだね?しばらく顔めえねかったでも。

文4 標準語:気温が上がったり下がったりしたせいか、風邪をひいて寝込んでいました。だいぶ元気になりました。
文4 旧辞書1:気温が上がったり下がったりしたすけか、風邪ひいて寝込んでたんだわ。ばかえかになったわね。
文4 旧辞書2:気温が上がったり下がったりしたせいか、風邪ひいてねぶってました。ばかえかったわね。
文4 新辞書1:気温が上がったり下がったりしたすけか、風邪ひいて寝込んでたんだわね。だいぶ元気になったわね。
文4 新辞書2:気温が上がったり下がったりしたすけか、風邪ひいて寝込んでおったんだわね。だいぶ元気になったわ。

文5 標準語:そうですか。それは大変でしたね。
文5 旧辞書1:そうかね。それはたいそだったねや。
文5 旧辞書2:そうだかね。それは、たいそだったねや。
文5 新辞書1:そうだねや。それはたいそだったねや。
文5 新辞書2:そうだねや。それはたいそだったねや。

文6 標準語:元気になったんで山菜を取りにでも行こうかと思っています。
文6 旧辞書1:元気んなったんで山菜取りにでも行こうかと思ってんだわ。
文6 旧辞書2:元気になったんで山菜取りにでも行こかと思ってます。
文6 新辞書1:あんべえくなったすけ、山菜取りにでも行こうかと思ってるんだわ。
文6 新辞書2:元気になったすけ、山菜取いにでも行こうかと思ってます。

文7 標準語:いいですね。山菜といえば、先日温泉宿で美味しい山菜料理をいただきました。ごちそうでした。
文7 旧辞書1:ええねや。山菜といえば、こねだ温泉宿でうんめえ山菜料理くんねたわ。ごっつぉだったわ。
文7 旧辞書2:いいねや。山菜といえば、こねだ温泉宿でうんめえ山菜料理くんないました。ごっつぉだったわね。
文7 新辞書1:いいわねや。山菜っつったら、こねだ温泉宿でうんめえ山菜料理いただいたんだわ。ごっつぉだったわ。
文7 新辞書2:いいねや。山菜っちゅうたら、こねだ温泉宿でうんめえ山菜料理をいただいたんだわ。ごっつぉだったわ。

文8 標準語:それは良かったですね。温泉はしばらく行ってないので、私も行ってみたいです。
文8 旧辞書1:それはえかったねや。温泉はしばらく行ってねぇすけ、おらも行ってみてぇです。
文8 旧辞書2:それはえかったねや。温泉はしばらく行ってねぇすけ、おらも行ってみてぇだわ。
文8 新辞書1:そりゃえかったねや。温泉はしばらく行ってねえすけ、おらも行ってみてぇわ。
文8 新辞書2:そりゃえかったねや。温泉はしばらく行ってねぇすけ、おらも行ってみてぇです。

文9 標準語:温泉に入って、ゆったりするのが大好きなんですよ。
文9 旧辞書1:温泉入って、じょんのびするのがばか好きなんだわね。
文9 旧辞書2:温泉入って、じょんのびするんがばか好きなんだわね。
文9 新辞書1:よに入って、じょんのびすんのがでーじ好きなんだわね
文9 新辞書2:よに入って、じょんのびするんがだいすきなんですよ。

文10 標準語:温かいお湯に浸かって、美味しいごちそうを食べるのは天国みたいですね。
文10 旧辞書1:あったけえよに浸かって、うんめえごっつぉ食うのは天国みてぇだねや。
文10 旧辞書2:あったけよに浸かって、うんめえごっつぉ食うのは天国みてえだねや。
文10 新辞書1:あったけよに浸かって、うんめえごっつぉ食うのは天国みてぇだねや】【。
文10 新辞書2:あったけぇよに浸かって、うんめえごっつぉ食うのは天国みてえだねや。

次にトークン数の比較です。

$$
\begin{array}{|l|r|r|r|}
\hline
\text{指標} & \text{旧辞書} & \text{新辞書} & \text{差分} \\
\hline
\text{合計入力Token Run1} & \text{35,516} & \text{36,906} & \text{+1,390} \\
\text{キャッシュToken Run1} & \text{29,952} & \text{29,952} & \text{0} \\
\text{キャッシュ率 Run1} & \text{84.3\%} & \text{81.2\%} & \text{-} \\
\hline
\text{合計入力Token Run2} & \text{35,516} & \text{36,906} & \text{+1,390} \\
\text{キャッシュToken Run2} & \text{33,280} & \text{33,280} & \text{0} \\
\text{キャッシュ率 Run2} & \text{93.7\%} & \text{90.2\%} & \text{- } \\
\hline
\end{array}
$$


実験結果の考察

どちらが優れているかは、単純には言えない

旧辞書でも新辞書でも、全体的には方言らしさが出ています。「なじょだね?」「こねだ」「ごっつぉ」「えかった」「たいそ」「じょんのび」などの語彙は両方でしっかり機能しています。「明確に旧辞書の方が優れている」とも「新辞書の方が優れている」とも言い切れない部分があります。

新辞書で改善が見られた点

Run1・Run2 の両方で再現した改善がいくつかあります。

`すけ`(〜だから)の適用が安定した。 文4「気温が上がったり下がったりしたせいか」では、旧辞書 Run2 で「せいか」のまま残ってしまいましたが、新辞書では両 Run とも「すけか」に変換されています。文法ルールを先頭セクションに集約した効果が出ています。ただし正しい方言では「すけか」ではなく「すけ」になるため、辞書のエントリをさらに調整する余地があります。

文6「元気になったんで」の変換が自然になった。 旧辞書では「元気んなったんで」や「元気になったんで」とぎこちない訳が出ていましたが、新辞書 Run1 では「あんべえくなったすけ」と辞書の語彙(`具合 → あんべ`)をうまく活用した訳が出ました。

文頭の表現が豊かになった。 「いいわねや」「そりゃえかったねや」など、語彙を組み合わせた自然な文頭が新辞書でよく出るようになりました。

文9「温泉に入って」が「よに入って」と正しく方言に変換された。 新辞書の `### 名詞(生活・食)` セクションに `湯 → よ` というエントリがあります。LLM は「温泉」を「湯(お湯)」の一種と意味的に推論し、このルールを適用しました。旧新井市の方言では温泉の湯も「よ」と呼ぶため、「よに入って」は方言として正しい表現です。旧辞書では同じエントリがフラット構造に埋もれていたため LLM がルールとして認識しにくく、「温泉入って」のまま残りました。新辞書で `## 語彙(品詞別)` に整理されたことで LLM がルールを明確に参照し、「温泉」にも推論を働かせた結果です。

新辞書で気になった点

`】【` というノイズが混入した。 文10(Run1)と文1(Run2)に `】【` という文字が出ています。これは辞書の会話例セクションで使われているカッコ表記が影響している可能性があります。現時点では 2 文だけなので引き続き様子を見ますが、フェーズ3 のチャット実装後にも確認が必要です。

文9 新辞書2 で方言変換が戻ってしまった。 「じょんのびするんがだいすきなんですよ。」と、`ばか好き`(とても好き)が消えて標準語の「大好きなんですよ」に戻っています。新辞書でも Run によって変換の精度がばらつくことがあります。

トークン数のトレードオフ

新辞書は旧辞書より約 +1,400 トークン/回 増えます。辞書が 73 行増えた(180 → 253 行)分、instructions が増量されたためです。

キャッシュ率は Run2 で旧辞書 93.7%・新辞書 90.2% と高い水準を保っています。Run1 のキャッシュ率が低かったのは初回実行でキャッシュが積まれる前だったからです。定常運用ではキャッシュが効くため、1,400 トークン増のコストは許容範囲と見ています。


次回: 方言変換の 2 ステップ方式を試す

実験を重ねるうちに、一つ気になることが出てきました。

今のアプリは「ユーザーの入力 → 直接方言で返答」という 1 ステップ方式 です。しかし「ユーザーの入力 → まず標準語で返答 → それを方言に変換」という 2 ステップ方式 の方が、方言変換の精度が上がるのではないかと考えています。

標準語を経由することで LLM の返答自体が整理されてから変換にかかるため、自然な方言が出やすくなりそうな気がします。ただしその分、API を 2 回叩くことになるので時間はかかります。

次回はこの 2 方式を比較する実験をやってみます。


続く



書いている人について

最後まで読んでいただき、ありがとうございます。
私のnoteの紹介記事です。
よろしければ、お読みいただければと思います。

この記事の連載マガジンです。

私の生まれ故郷の歴史

最後に
この記事が気に入ったら、スキをいただけると励みになります。

いいなと思ったら応援しよう!