File size: 5,748 Bytes
a05078c
c702c67
f44c027
44d92db
3d3b90b
8001bcd
d9500e2
e3e0d46
cda9e4a
eac54c9
c3befcf
e54ce3e
83a2013
 
e54ce3e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d4a9711
e54ce3e
 
 
 
 
 
a096e1c
 
 
 
 
 
 
 
 
 
 
a5197d1
cc94ba9
 
 
 
 
 
957e21f
a096e1c
 
 
e3e0d46
953ff23
eac54c9
a096e1c
 
 
 
 
 
 
e3e0d46
953ff23
a096e1c
 
 
e54ce3e
 
ced75d4
e54ce3e
 
 
 
 
 
 
 
2bcf34a
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import gradio as gr
import pandas as pd
import itertools
import tempfile
import os
import ast 
import requests
import re
from chatgpt_api import get_chatgpt_response
from select_question import create_choice_question

def kousei(csv_file,input_text):

    prompt_text =input_text +  "指摘は、全ての問題において問題がない場合も含めて、必ず全問題、[問題ID]に続けて結果を書くフォーマットで返してください。[問題ID]の後は改行しないで。(必ず[問題ID]が5つ表示されるはずです)指摘方法は、問題ない場合は「問題なし」、指摘がある場合は「問題あり」\n「問題あり」の場合、問題のある箇所を具体的に指摘してください。\n#リスト"
    # CSVファイルを読み込む
    df = pd.read_csv(csv_file.name)
    # DataFrameを5行ごとに処理するためのグループ化
    df['group_id'] = df.index // 5
    grouped = df.groupby('group_id')

    # 各グループに対してフォーマットされたプロンプトを作成
    def create_prompt(group, base_prompt):
        prompt = base_prompt
        for _, row in group.iterrows():
            prompt += f"\n[{row['id']}]\n{row['原稿']}"
    
        return prompt
    
    # 各グループごとのプロンプトを生成
    prompts = grouped.apply(lambda g: create_prompt(g, prompt_text))
    
    
    
    prompts = prompts.reset_index(name='prompt_after')
    
    # 各プロンプトをAPIに送信
    prompts['response'] = prompts['prompt_after'].apply(get_chatgpt_response)
    
    
    # 応答を分割して元のDataFrameにマッピングする関数
    def split_responses(grouped_df):
        rows = []  # 結果を格納するための一時リスト
    
        for _, row in grouped_df.iterrows():
            response = row['response']
            # 正規表現でIDとテキストを抽出
            split_response = re.split(r'\[([A-Z0-9]+)\]\s*', response)
            ids_texts = list(zip(split_response[1::2], split_response[2::2]))
    
            for id_text in ids_texts:
                problem_id = id_text[0]
                correction_result = id_text[1].strip()
                original_content = df.loc[df['id'] == problem_id, '原稿'].iloc[0]  # 問題IDに対応する原稿を取得
    
                # 辞書をリストに追加
                rows.append({
                    'id': problem_id,
                    'contents': original_content,
                    '校正結果': correction_result
                })
    
        # 一時リストからDataFrameを生成
        result_df = pd.DataFrame(rows)
        return result_df
    
    
    final_results = split_responses(prompts)
     # ファイル出力
    with tempfile.NamedTemporaryFile(delete=False, suffix='.csv') as tmp:
        # cp932で保存、エラーは無視(置換しても良い)
        final_results.to_csv(tmp.name, index=False, encoding='cp932', errors='ignore')
        output_path = tmp.name
    
    # ファイル名を変更
    new_path = os.path.join(os.path.dirname(output_path), "output.csv")
    os.rename(output_path, new_path)
    return new_path



title = "英語生成ツール"

with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown(
        f"""
         # {title}
        """
    )
    with gr.Tab("問題生成(選択肢)"):
        with gr.Column():
            gr.Markdown("""
        ## 利用手順
        1. こちらの[マスタ](https://drive.google.com/uc?export=download&id=1VyDBtVrnDUlddmITiXg7ybqyB0CTCPeu)を手元に置く
        2. シート「input」に、生成したい問題パターンを書いてください(赤字の要素は固定。選択肢は可変。適宜行追加OK)
        3. 完成したら、「ファイル>名前を付けて保存」から「CSV UTF-8(コンマ区切り)(*.csv)」形式で保存
        4. 3のCSVを本サイトにアップロード
        """)

            with gr.Row():
                inputs=gr.File(label="CSVファイルをアップロード")
                outputs=gr.File(label="ダウンロード", file_count="singular")
            gr.Button("問題生成").click(
                create_choice_question,
                inputs=[inputs],
                outputs=[outputs]
            )
    with gr.Tab("問題生成(並び替え)"):
        with gr.Column():
            with gr.Row():
                inputs=gr.File(label="CSVファイルをアップロード")
                outputs=gr.File(label="ダウンロード", file_count="singular")
            gr.Button("問題生成").click(
                create_choice_question,
                inputs=[inputs],
                outputs=[outputs]
            )
    with gr.Tab("校正"):
        with gr.Column():
            input_text_kousei = gr.Textbox(label="校正観点を入力してください。",value="英単語習得を目的として、以下2種類の問題を用意しています。\n1.英語の正しい日本語訳を選択する4択問題\n2.日本語の正しい英語訳を選択する4択問題\n「#リスト」の誤答選択肢の中に、正解選択肢の別解になってしまっているもの、または別解とは言えないが紛らわしすぎるものがないか、探して指摘してください。")
            with gr.Row():
                inputs=gr.File(label="CSVファイルをアップロード")
                outputs=gr.File(label="ダウンロード", file_count="singular")
            gr.Button("問題生成").click(
                kousei,
                inputs=[inputs,input_text_kousei],
                outputs=[outputs]
            )
demo.launch(share=True)