この記事は、NTTコミュニケーションズ Advent Calendar 2023 20日目の記事です。
はじめに
こんにちは。 コミュニケーション&アプリケーションサービス部の吉仲です。 新卒2年目で、普段はB向け/C向けメールシステムと文書要約APIサービスの開発・運用に関する業務に取り組んでいます。
今回は、昨年から引き続き話題の生成AIのひとつ、大規模言語モデル (LLM: Large Language Model) を題材に、LLMを使って文章を「やさしい」表現へ言い換える例を紹介します。
この記事の内容
この記事では、以下の内容を扱います。
- やさしい日本語
- 言い換え技術とテキスト平易化
- LLMを使ったやさしい日本語への言い換え
前半にやさしい日本語、言い換え技術・テキスト平易化について簡単に解説し、後半はLLMによるやさしい日本語への言い換えの例を紹介します。 なお、この記事ではLLMの技術的詳細やプロンプトエンジニアリングの細かいテクニックには触れません。
なぜ「やさしい日本語」を使うのか?
厚生労働省によると、令和4年10月時点の外国人労働者の数は180万人を超え、過去最高を更新しています1。 今後も労働人口の減少やグローバル化を背景に、日本に住む外国人はますます増え、その国籍もさらに多様化していくと考えられます。
日本に住む (あるいは訪れる) 外国人へ正しく情報を伝えるためには、多言語翻訳・通訳のほか、やさしい日本語での情報提供も有効な手段となります2。 また、在留外国人に限らず、より多くの人に伝わりやすい日本語表現を使うことが、ユニバーサルコミュニケーション3 へのアプローチにもなると考えます。
やさしい日本語の書き方や話し方について、出入国在留管理庁と文化庁がガイドラインを作成しています。 www.bunka.go.jp
書き方のガイドラインでは、日本人に分かりやすい文章、そして外国人にも分かりやすい文章の作り方のポイントが紹介されています。 テキストでのコミュニケーションが一層増えた昨今、このガイドラインを読みながら自身の文章の書き方を一度振り返ってみると良いかもしれません。
かく言う私も、普段の仕事の中で難しく回りくどい書き方やカタカナ語を多用してしまい、分かりやすさを意識できていないことが多いです。 やはりすぐにやさしい日本語を書き出すことは難しく、どうしても推敲に時間がかかってしまうと感じます。
そこで今回は、LLMを用いて文章を自動的にやさしい日本語へ言い換えることを試してみます。 なお、この記事ではあくまで文章の分かりやすさにフォーカスすることとします。 文書全体の読みやすい構成や展開には触れません。
言い換え技術とテキスト平易化
ここからは自然言語処理 (NLP: Natural Language Processing) の話になります。
言い換え技術
NLPでの重要な問題のひとつにテキストの持つ曖昧さがあります。 この曖昧さには以下の問題が含まれます。
- 多義性の問題:同じ言語表現でも意味が異なる
- 同義性の問題:(近似的に) 同じ意味でも言語表現が異なる
前者は例えば「多義性解消」といったキーワードなどで、NLPの黎明期から研究されています。 後者は主に言い換え (Paraphrase) 技術として研究されています。
言い換え技術とは、以下の認識技術と生成技術のことをまとめて指します。
- 言い換え認識:意味が同じ言語表現かどうかを判定する
- 言い換え生成:ある言語表現から (意味を保ちながら) 別の表現に変換する
後者の言い換え生成では、ニューラル機械翻訳モデル4 を使い、同じ言語の中で翻訳する手法が近年の主流です5。 さらには、報酬を同義性や文法性、目的の言い換えの指標 (例えば、簡単な表現にしたければ難易度) に基づき設計した強化学習の手法も存在します6。
テキスト平易化
テキスト平易化 (Text Simplification) は、言い換え生成タスクのひとつです。 テキスト平易化では、入力文の意味を保ちながら、難しい表現をより易しい表現へ言い換えます。 例えば、あるテキストの中の表現「捺印する」を「はんこを押す」という表現へ変換していきます。
最近では以下の論文のように、ChatGPTなどのLLMを用いてテキスト平易化タスクを解く手法7 も研究されています。 arxiv.org
この論文では、以下のようなZero-ShotもしくはFew-Shotプロンプト8 でテキスト平易化を行っています。 (※例は論文内のZero-Shotプロンプトの図から引用)
I want you to replace my complex sentence with simple sentence. Keep the meaning same, but make them simpler.
Complex: His next work, Saturday, follows an especially eventful day in the life of a successful neurosurgeon.
Simple: {Outputs}
テキスト平易化に限る話ではないですが、LLMはごく少数の例 (今回は難しい文と易しい文のペア) を用意するだけで、 もっと言えば例を用意しなくとも、さまざまなタスクを解いてしまいます。
以降では、このLLMでのZero-Shot/Few-Shotプロンプトによって、やさしい日本語への言い換えを行います。 さらに、上記の「やさしい日本語」ガイドラインを活用し、 押さえるべきポイントをプロンプトに組み込むことで、より上手くやさしい日本語へ言い換えられないか模索してみます。
LLMでやさしい日本語へ言い換える
前置きが長くなりましたが、ここからが本題の「LLMによるやさしい日本語への言い換え」の話です。
今回は以下の環境・モデルを使用します。
- Azure OpenAI
- GPT-4 (32kトークン)
また、やさしい日本語への言い換え例として、前述のガイドラインの例文を引用させていただきます。
以降では、ガイドライン中の以下の例文をやさしい日本語へ言い換えてみます。
父母が共に外国籍の場合、出生届が受理されると、子供が生まれた日から60日の間は、 在留資格を有することなく住民票が作成されます。 子供が生まれた日から60日を超えて日本に滞在しようとする場合は、 子供が生まれた日から30日以内に最寄りの地方出入国在留管理官署において、 在留資格の取得申請をする必要があります。
Zero-Shotプロンプト
まずは、Zero-Shotプロンプトでテキスト平易化を行います。 プロンプトは前述の論文を参考に以下のように設計します。
I want you to replace my complex sentence with simple and easy-to-read sentence in Japanese. Keep the meaning same, but make them simpler. Complex: """ {Input} """ Simple:
指示文は英語のまま9、読みやすさについての指示 ("easy-to-read sentence") と、日本語での言い換え指示 ("in Japanese") を追加しています。
結果は以下のようになりました。 (※実行環境はAzure AI Studio チャットプレイグラウンド)
「資格を有することなく」を「資格なしで」に言い換えるなど、表現の平易化はできていそうです。 一方で「60日を超え」が「60日以上」になったり、申請場所の情報が抜けたりなどが見られます。
もし情報提供などでこの出力を使うなら、やや情報の不正確さ・欠落が気になるかなと思いました。
Few-Shotプロンプト
次に、Few-Shotプロンプトでテキスト平易化を行います。 プロンプトはZero-Shotのときと同様のものを使います。 プロンプトに組み込む例として、再びガイドライン中の例文をお借りします。
結果は以下のようになりました。
Zero-Shotのときに見られた情報の不正確さ・欠落がやや緩和されつつ、やさしい表現になっていますね。 ただ、プロンプトに入れた例が1つだけなのもあり、箇条書きで読みやすくするような言い換えは再現できていません。
ガイドラインを活用したプロンプト
ガイドラインに載っている言い換え例は以下のような文章です。
日本で生まれた子供が、
・日本国籍を持たない
・出生後60日を超えて引き続き日本に滞在したい
ときは、出生した日から30日以内に、地方出入国在留管理局で在留資格取得の申請を行う必要があります。
上で紹介したZero-Shot/Few-Shotプロンプトでは残念ながら再現できていません。
そこで、この例のような言い換えを目標に、ガイドライン中のアドバイスをプロンプトに組み込んでみます。 (ただし「父母が共に外国籍」→「子供が日本国籍を持たない」のような言い換えはさすがに難しいと思うので、可能な範囲での再現を目指します)
プロンプトは以下のように設計します。 ガイドライン中のアドバイスを英語に訳して追加しています。 このプロンプトをテンプレートとし、Zero-Shot/Few-Shotでの言い換えを試します。
I want you to replace my complex sentence with simple and easy-to-read sentence. Keep the meaning same, but make them simpler in Japanese. Follow the instructions below; 1. organize what I want to say, 2. select and discard information, 3. keep each sentence short (only one thing to say in one sentence), 4. use bullet points if there are more than three things to say, 5. use no roundabout phrases. Complex: """ {Input} """ Simple:
結果は以下の通りです。
Zero-Shotプロンプトによる言い換え:
Few-Shotプロンプトによる言い換え:
後者の結果は、ガイドライン中の言い換え例にいくらか近くなったのではないでしょうか。 もう少しプロンプトを作り込むとしたら、複数の前提条件を箇条書きするような指示を与えると良いかもしれません。 今回はここまでとしますが、元のべた書きの文章よりもかなり分かりやすくなったと思います。
LangChain Chainsを使った二段階の言い換え
ここまで触れませんでしたが、ガイドラインには「外国人にも分かりやすい文章」のアドバイスも含まれます。 最後はこちらにも挑戦してみます。
外国人にも分かりやすい日本語へ言い換えるためのプロンプトは以下のように設計します。 日本語の非ネイティブ向けであることを明示し、ガイドライン中のアドバイスを指示に組み込んでいます。
I want you to replace my sentence with easy sentence for non-native of Japanese. Keep the meaning same, but make them easier in Japanese. Follow the instructions below; 1. use simple phrases, 2. note the amount of kanji and supplement Furigana of difficult kanji. Input: """ {Input} """ Output:
今回は最初から外国人にも分かりやすい文章を生成するのではなく、前章で生成した言い換えの結果をさらに言い換える形とします。
LangChain10 のChainsのうちSimpleSequentialChain
は、1つめの出力を2つめのプロンプトに渡すという処理を簡単に実装できます。
今回はそれほど複雑な処理ではありませんが、せっかくなのでこれを使用してみます。
実装には以下のライブラリを使用します。
langchain==0.0.345
openai==0.28
ソースコードは以下の通りです。 Azure OpenAIの各種情報や、Few-Shotプロンプトに使う例文、入力文は適宜埋めてください。
import os from langchain.chains import LLMChain, SimpleSequentialChain from langchain.chat_models import ChatOpenAI from langchain.prompts import PromptTemplate os.environ["OPENAI_API_TYPE"] = "azure" os.environ["OPENAI_API_KEY"] = "xxxxx" os.environ["OPENAI_API_BASE"] = "https://your-resource-name.openai.azure.com/" os.environ["OPENAI_API_VERSION"] = "2023-07-01-preview" os.environ["DEPLOYMENT_NAME"] = "xxxxx" template_for_simple_ja = "xxxxx" # プロンプトのテンプレート、入力文の位置には`{input}`を入れる template_for_easy_ja = "xxxxx" # プロンプトのテンプレート、入力文の位置には`{input}`を入れる def main(): llm = ChatOpenAI( model_name="gpt-4-32k", model_kwargs={"deployment_id": os.environ["DEPLOYMENT_NAME"]}, temperature=0, ) prompt_1 = PromptTemplate(input_variables=["input"], template=template_for_simple_ja) chain_1 = LLMChain(llm=llm, prompt=prompt_1) prompt_2 = PromptTemplate(input_variables=["input"], template=template_for_easy_ja) chain_2 = LLMChain(llm=llm, prompt=prompt_2) overall_chain = SimpleSequentialChain(chains=[chain_1, chain_2], verbose=True) text = "xxxxx" # 言い換えたい入力文 print(overall_chain(text)) if __name__ == "__main__": main()
このプログラムの実行結果は以下のようになります。
$ python3 text-simplification.py > Entering new SimpleSequentialChain chain... """ 両親が外国籍の場合、子供が生まれたら、 ・60日間は在留資格なしで住民票が作成されます。 ・60日を超えて日本に滞在する場合、生まれてから30日以内に在留資格の申請が必要です。 ・申請は最寄りの地方出入国在留管理官署で行います。 """ """ お父さんとお母さんが外国の人だったら、赤ちゃんが生まれたら、 ・60日間は、ビザ(ざいりゅうしかく)がなくても、住んでいるところを登録(とうろく)できます。 ・60日より長く日本にいるなら、赤ちゃんが生まれてから30日以内にビザの申し込み(もうしこみ)が必要(ひつよう)です。 ・申し込みは、近くの出入国管理事務所(しゅつにゅうこくかんりじむしょ)でやります。 """ > Finished chain. {'input': '父母が共に外国籍の場合、出生届が受理されると、子供が生まれた日から60日の間は、在留資格を有することなく住民票が作成されます。子供が生まれた日から60日を超えて日本に滞在しようとする場合は、子供が生まれた日から30日以内に最寄りの地方出入国在留管理官署において、在留資格の取得申請をする必要があります。', 'output': '"""\nお父さんとお母さんが外国の人だったら、赤ちゃんが生まれたら、\n・60日間は、ビザ(ざいりゅうしかく)がなくても、住んでいるところを登録(とうろく)できます。\n・60日より長く日本にいるなら、赤ちゃんが生まれてから30日以内にビザの申し込み(もうしこみ)が必要(ひつよう)です。\n・申し込みは、近くの出入国管理事務所(しゅつにゅうこくかんりじむしょ)でやります。\n"""'}
私は日本語ネイティブのため、非ネイティブが分かりやすい表現になったかどうかは判断しづらいですが、ガイドライン中の例文には近くなったのではと思います。 ただ、「漢字の量に注意」という指示が「在留資格」→「ビザ」というやや異なる意味への単語の言い換えを誘発してしまっています。
例えば在留外国人向けの資料や案内を作成したいとき、AIによる多言語翻訳で対応すると、誤訳の修正などのコストが大きくなりがちだと思います。 一方、やさしい日本語への言い換えで対応するなら、上記の程度の間違いであれば修正コストも高くないのではと思います。
おわりに
この記事では、LLMによってやさしい日本語へ言い換える例を紹介しました。 もしすぐにやさしい日本語で書くことが難しいと感じるなら、ぜひこの記事を参考にLLMを使った言い換えを試してみてください。
また、今回は定量評価まで行いませんでしたが、言い換え技術・テキスト平易化の評価手法も奥が深い研究分野だと思います。 気になった方はぜひ調べてみてください。
最後までご覧いただきありがとうございました!それでは、明日の記事もお楽しみに!
- 『「外国人雇用状況」の届出状況まとめ(令和4年10月末現在)』 (厚生労働省, 令和5年1月27日)↩
- 『東京都在住外国人向け 情報伝達に関するヒアリング調査報告書』によると、機械翻訳された母国語よりもやさしい日本語の方が好まれる傾向にある。↩
- 『「ユニバーサルコミュニケーションデザイン」(UCD)とは』 (ユニバーサルコミュニケーションデザイン協会 (UCDA))↩
- "Sequence to Sequence Learning with Neural Networks" (Sutskever et al., arXiv 2014)↩
- "Exploring Neural Text Simplification Models" (Nisioi et al., ACL 2017)↩
- "Text Simplification with Reinforcement Learning Using Supervised Rewards on Grammaticality, Meaning Preservation, and Simplicity" (Nakamachi et al., AACL 2020)↩
- "Sentence simplification via large language models" (Feng et al., arXiv 2023)↩
- "Language Models are Few-Shot Learners" (Brown et al., arXiv 2020)↩
- 生成の質向上 (経験的には英語のプロンプトの方が良い) とトークン数削減のため。↩
- https://www.langchain.com/↩