chatGPT-3.5を使うにあたり、である調で出力されることがあったので、ですます調に変換するコードを書きました。
一定のアルゴリズムさえ抑えておけば大丈夫だろうと思いきや、言い回しや法則で決まっていない活用形があるため、完全に法則化はできず、全ての動詞の活用形データを保有しないと完全に正確にはできませんでした。
例えば過去形。
「呼ぶ」の過去形は「呼んだ」で、ですます調は「呼びました」ですが、「”んだ”→”びました”」というアルゴリズムだと「読んだ」を変換すると「読びました」となってしまいます。
そのため、送り仮名だけでなく、漢字の読みまで確認しなければならず、そういう動詞の過去形は全部抑えておく必要があります。
また、「当然の報いだ」という「”い”で終わる名詞 + “だ”」言い回しがあったら、変換は「当然の報いです」となりますが、その変換のままだと、「ボートでオールを漕いだ」を「ボートでオールを漕いです」となってしまいます。
このような言い回しについても名詞を1つずつ抑えておく必要があります。
目的はchatGPT-3.5を使って出てきた文章を音声化するためであり、その音声化も自分の学習のためだったので、完全なですます調変換は多くのデータを網羅する必要があり、非常に大変なのである程度で止めにしました。
止めたとは言え、変換は一筋縄ではいかないとわかり、得るものがあったので良しとします。
以下はそのコードになります。
文字列が多い順番に変換すること、「した。」を「しました。」に変換するため、「書いた」を「書きましたXXX。」と変換し、後でそのXXXを取り除くようにしています。
import os
import GS_utils
# テキストファイルを開き、読み込む
filepath = "dir/path/file.txt"
with open(filepath, 'r') as file:
content = file.read()
output_path = os.path.splitext(filepath)[0] + "_ですます変換" + ".txt"
def dearu_to_desumasu(text):
# スプレッドシートから情報を取得
# ["変換前文字列","変換後文字列"]の二次元リストを、第一要素の文字列が多い順番に返す
conversion_strings = GS_utils.get_conversion_strings()
# 句点区切りの句点を改行に置き換えて、改行区切りを追加
add_string = []
for string in conversion_strings:
if "。" in string[0]:
add_string.append([string[0].replace("。","\n"),string[1].replace("。","\n")]),
conversion_strings += add_string
# 置換処理
for string in conversion_strings:
text = text.replace(string[0],string[1])
text = text.replace("XXX","")
return text
# 実施
converted_text = dearu_to_desumasu(content)
# テキストファイルを保存
with open(output_path, 'w', encoding='utf-8') as file:
file.write(converted_text)
・GS_utils
import gspread
from oauth2client.service_account import ServiceAccountCredentials
json_path = "(jsonファイルのパス)"
spreadsheet_id = "(スプレッドシートのid)"
# OAuth2の認証情報を使ってGoogle Sheets APIにアクセス
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name(json_path, scope)
client = gspread.authorize(creds)
all_data = []
# スプレッドシートを開く
spreadsheet = client.open_by_key(spreadsheet_id)
# 1番目の要素の文字数を返す関数
def length_of_first_element(sublist):
return len(str(sublist[0]))
def get_conversion_strings():
# すべてのワークシートに対して処理
for worksheet in spreadsheet.worksheets():
# F列とG列の2行目以降の値を取得
values_f = worksheet.col_values(6)[1:] # 変換前文字の列
values_g = worksheet.col_values(7)[1:] # 変換後文字の列
# 取得したデータを all_data に追加
for f, g in zip(values_f, values_g):
all_data.append([f, g])
# ソート実行
all_data.sort(key=length_of_first_element, reverse=True)
for data in all_data:
print(data)
return all_data