ChatGPT_APIで任意のテキストを敬体・常体変換させるためのPythonコード

ChatGPTに敬体・常体を変換するPythonコードを書いてもらいました。

最初に提示されたのはシンプルな置換ルールを定義するもので、実用には堪えません。

敬体・常体変換・統一を高い精度で行う良いライブラリも見当たらず、現時点では自力で機械学習などで厳密なルールベースを構築する必要がありそうです。

そこで、敬体・常態変換タスクをChatGPTなりBing_AI-Chatにさせたほうが手っ取り早いので、ChatGPT(OpenAI)にAPIで変換指示を投げ込むコードも書いてもらいました。

以下、単純置換ベースとOpenAI-APIベースの二つを比較してます。

 

指示文1(プロンプト) 単純な置換ベースの場合:

入力された文章に対して、敬体もしくは常体に適宜変換して出力するPythonコードを提示してください。

 

回答:

以下は、Pythonで敬体もしくは常体に文章を変換するためのサンプルコードです。敬体と常体の変換は非常に複雑な問題であり、完璧な変換を行うことは難しいですが、基本的なパターンに対して簡単な変換を行うことができます。


def convert_to_honorific(sentence):
    honorific_mapping = {
        'です': 'ます',
        'である': 'でございます',
        'だ': 'です',
        'ですか': 'ますか',
        'でしょうか': 'でしょうか',
        'でしょう': 'でしょう',
        'だろうか': 'でしょうか',
        'だろう': 'でしょう',
        'ない': 'ありません',
        'ません': 'ません',
    }

    for key, value in honorific_mapping.items():
        sentence = sentence.replace(key, value)

    return sentence


def convert_to_plain(sentence):
    plain_mapping = {
        'ます': 'です',
        'でございます': 'である',
        'ですか': 'だ',
        'でしょうか': 'だろうか',
        'でしょう': 'だろう',
        'ありません': 'ない',
        'ません': 'ない',
    }

    for key, value in plain_mapping.items():
        sentence = sentence.replace(key, value)

    return sentence


input_sentence = input('文章を入力してください: ')
mode = input('変換モードを選択してください(敬体: 1, 常体: 2): ')

if mode == '1':
    converted_sentence = convert_to_honorific(input_sentence)
elif mode == '2':
    converted_sentence = convert_to_plain(input_sentence)
else:
    print('無効なモードが選択されました。')

print('変換結果:', converted_sentence)
    

このコードでは、convert_to_honorific関数とconvert_to_plain関数を定義しています。convert_to_honorific関数は常体の文章を敬体に変換し、convert_to_plain関数は敬体の文章を常体に変換します。

プログラムは、ユーザーに文章と変換モード(敬体または常体)を入力してもらいます。入力されたモードに応じて適切な変換関数を呼び出し、変換結果を表示します。

ただし、このコードは単純な置換に基づいており、全ての文脈に対して適切な変換を行うわけではありません。実際の敬体や常体の変換は非常に複雑であり、文化や状況によっても異なる場合があります。したがって、このコードはあくまで簡易的な例であり、完璧な変換を行うためにはより高度な自然言語処理の手法が必要です。

結果:

一応、以下のように成功はしましたが、シンプルな文章にしか使えません。上記コード中のmappingをもっと充実させれば、それなりには・・・とも思いましたが、少なくとも同じ文字列(表現)でも文末と文中を判別するなどの処理がないと厳しそうですね。

 

指示文(プロンプト)2_OpenAIのAPIを利用する場合:

ChatGPTに、APIを通して、敬体・常体を変換するタスクを行わせるPythonコードを書いてください。

回答:

以下は、OpenAIのChatGPT APIを使用して、敬体・常体の変換タスクを実行するPythonコードの例です。このコードは、OpenAIのopenai.ChatCompletion.create()メソッドを呼び出してAPIリクエストを送信し、応答を取得します。


import openai

def convert_to_honorific(prompt):
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "次の文章を敬体に変換してください。"},
            {"role": "user", "content": prompt}
        ],
        max_tokens=50,
        temperature=0.6
    )

    reply = response.choices[0].message.get('content', '')
    return reply

def convert_to_plain(prompt):
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": "次の文章を常体に変換してください。"},
            {"role": "user", "content": prompt}
        ],
        max_tokens=50,
        temperature=0.6
    )

    reply = response.choices[0].message.get('content', '')
    return reply

# OpenAI APIの設定
openai.api_key = "YOUR_API_KEY"

input_sentence = input('文章を入力してください: ')
mode = input('変換モードを選択してください(敬体: 1, 常体: 2): ')

if mode == '1':
    converted_sentence = convert_to_honorific(input_sentence)
elif mode == '2':
    converted_sentence = convert_to_plain(input_sentence)
else:
    print('無効なモードが選択されました。')

print('変換結果:', converted_sentence)
    
    

上記のコードでは、OpenAI APIのクライアントライブラリを使用して、openai.ChatCompletion.create()メソッドを呼び出してAPIリクエストを送信しています。APIキーを適切に設定する必要があります。

convert_to_honorific関数とconvert_to_plain関数は、敬体と常体の変換を実行するためにAPIに対してメッセージを送信し、応答を取得します。APIリクエストのパラメータとして、モデルの指定、メッセージの役割と内容、最大トークン数、温度などを設定します。

ユーザーからの入力を受け取り、選択された変換モードに応じて適切な関数を呼び出し、変換結果を表示します。

注意点として、OpenAIのAPIは有料であり、適切なプランと課金情報が必要です。また、敬体・常体の変換は非常に複雑な問題であり、 完璧な変換を保証するものではありません。

結果:

以下のように成功しました。提示されたコードでは、「max_tokens=50」となってますが、これだと短すぎるので、実際には500にしてテストしてます。

単純置換ベースに比べて、圧倒的に高精度になりました。ただ、少し複雑な文章で試すと、文体自体から変えられ意味合いが少し変わってしまう場合も(汗)。実用的なツールにするには、もう少し絞った指示文を生成してから投げ込む必要がありそうです。