File size: 10,071 Bytes
4ba4a77
 
 
a199795
 
 
db9e998
 
71c9215
4ba4a77
97d7261
 
a199795
 
 
 
 
 
 
97d7261
 
 
455ee26
a199795
 
 
ea2cadc
 
a199795
ea2cadc
a199795
 
db9e998
 
a199795
 
 
 
ea2cadc
b507883
3a10092
8a63757
3a10092
b507883
a199795
 
 
 
05e2529
 
a199795
 
 
 
 
 
 
2443dec
3a10092
2443dec
3a10092
ef27278
a199795
 
 
 
 
b07867d
a199795
 
 
 
 
 
 
 
 
 
 
2443dec
3a10092
3fc83f7
3a10092
3fc83f7
 
 
 
3a10092
3fc83f7
2443dec
 
3a10092
3fc83f7
3a10092
3fc83f7
2443dec
a199795
3fc83f7
2443dec
8a63757
364b55a
 
7c51106
 
 
 
a199795
 
3fc97a9
db9e998
686b10f
 
a199795
 
 
 
 
 
 
686b10f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a199795
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
001f520
a199795
 
 
 
 
 
 
 
05e2529
 
686b10f
ef27278
a199795
 
 
 
 
 
2443dec
3a10092
2443dec
3a10092
a199795
3a10092
b42b0f4
a199795
 
 
 
 
05e2529
a199795
ef27278
a199795
 
 
686b10f
a199795
38df701
686b10f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a199795
 
 
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
import requests
import random
import time
import pandas as pd
import gradio as gr
import numpy as np
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from transformers import pipeline
import torch

def read3(num_selected_former):
    fname = 'data3_convai2_inferred.txt'
    with open(fname, encoding='utf-8') as f:
        content = f.readlines()
        index_selected = random.randint(0,len(content)/2-1)
        while index_selected == num_selected_former:
            index_selected = random.randint(0,len(content)/2-1)
        text = eval(content[index_selected*2])
        interpretation = eval(content[int(index_selected*2+1)])
        
        min_len = 5

        while len(text['text'].split(' ')) <= min_len or '\\' in text['text'] or '//' in text['text']:
            index_selected = random.randint(0,len(content)/2-1)
            text = eval(content[int(index_selected*2)])
        res_tmp = [(i, 0) for i in text['text'].split(' ')]
        res = {"original": text['text'], "interpretation": res_tmp}    
    return res, index_selected
    
def func3(num_selected, human_predict, num1, num2, user_important):
    chatbot = []
    # num1: Human score; num2: AI score
    fname = 'data3_convai2_inferred.txt'

    with open(fname) as f:
        content = f.readlines()
        text = eval(content[int(num_selected*2)])
        interpretation = eval(content[int(num_selected*2+1)])
        
        if text['binary_label'] == 1:
            golden_label = int(5 * (1 - text['binary_score']))
        else:
            golden_label = int(5 * (1 + text['binary_score']))
            
    # (START) off-the-shelf version -- slow at the beginning
    # Load model directly
    # Use a pipeline as a high-level helper

    device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
    classifier = pipeline("text-classification", model="padmajabfrl/Gender-Classification", device=device)
    output = classifier([text['text']])

    print(output)
    out = output[0]
    
    # (END) off-the-shelf version
    
    if out['label'] == 'Female':
        ai_predict = int(10 * out['score'])
    else:
        ai_predict = 10 - int(10 * out['score'])
    
    user_select = "You focused on "
    flag_select = False
    if user_important == "":
        user_select += "nothing. Interesting! "
    else:
        user_select += "'" + user_important + "'. "
    # for i in range(len(user_marks)):
    #     if user_marks[i][1] != None and h1[i][0] not in ["P", "N"]:
    #         flag_select = True
    #         user_select += "'" + h1[i][0] + "'"
    #         if i == len(h1) - 1:
    #             user_select += ". "
    #         else:
    #             user_select += ", "
    # if not flag_select:
    #     user_select += "nothing. Interesting! "
    user_select += "Wanna see how the AI made the guess? Click here. ⬅️"
    
    if golden_label > 6:
        gender = ' (female)'
    elif golden_label < 4:
        gender = ' (male)'    
    else:
        gender = ' (neutral)'
        
    if abs(golden_label - human_predict) <= 2  and abs(golden_label - ai_predict) <= 2:
        chatbot.append(("The correct answer is " + str(golden_label) + gender + ". Congratulations! πŸŽ‰ Both of you get the correct answer!", user_select))
        num1 += 1
        num2 += 1
    elif abs(golden_label - human_predict) > 2 and abs(golden_label - ai_predict) > 2:
        chatbot.append(("The correct answer is " + str(golden_label) + gender + ". Sorry.. No one gets the correct answer. But nice try! πŸ˜‰", user_select))
    elif abs(golden_label - human_predict) <= 2 and abs(golden_label - ai_predict) > 2:
        chatbot.append(("The correct answer is " + str(golden_label) + gender + ". Great! πŸŽ‰ You are closer to the answer and better than AI!", user_select))
        num1 += 1
    else:
        chatbot.append(("The correct answer is " + str(golden_label) + gender + ". Sorry.. AI wins in this round.", user_select))
        num2 += 1
    
    # tot_scores = ''' ### <p style="text-align: center;"> πŸ€– Machine &ensp; ''' + str(int(num2)) + ''' &ensp; VS &ensp; ''' + str(int(num1)) + ''' &ensp; Human πŸ‘¨πŸ‘© </p>'''
    
    # tot_scores = ''' #### <p style="text-align: center;"> Today's Scores:</p>
    #                 #### <p style="text-align: center;"> πŸ€– Machine &ensp; <span style="color: red;">''' + str(int(num2)) + '''</span> &ensp; VS &ensp; <span style="color: red;">''' + str(int(num1)) + '''</span> &ensp; Human πŸ™‹ </p>'''
    tot_scores = ''' #### <p style="text-align: center;"> Today's Scores: &ensp; &ensp; πŸ€– Machine &ensp; <span style="color: red;">''' + str(int(num2)) + '''</span> &ensp; VS &ensp; <span style="color: red;">''' + str(int(num1)) + '''</span> &ensp; Human πŸ™‹ </p>'''

    return ai_predict, chatbot, num1, num2, tot_scores

def interpre3(num_selected):
    fname = 'data3_convai2_inferred.txt'
    tokenizer = AutoTokenizer.from_pretrained("padmajabfrl/Gender-Classification")

    with open(fname) as f:
        content = f.readlines()
        text = eval(content[int(num_selected*2)])
        interpretation = eval(content[int(num_selected*2+1)])
    
    print(interpretation)

    encodings = tokenizer(text['text'], return_offsets_mapping=True)

    print(encodings['offset_mapping'])
    is_subword = [False, False]
    for i in range(2, len(encodings['offset_mapping'])):
        if encodings['offset_mapping'][i][0] == encodings['offset_mapping'][i-1][1]:
            is_subword.append(True)
        else:
            is_subword.append(False)
    print(is_subword)
    interpretation_combined = []

    index_tmp = 0
    while index_tmp < (len(interpretation) - 1):
        if not is_subword[index_tmp+1]:
            interpretation_combined.append(interpretation[index_tmp])
            index_tmp += 1
        else:
            text_combined = interpretation[index_tmp][0]
            score_combinded = interpretation[index_tmp][1]
            length = 1
            while is_subword[index_tmp+length]:
                text_combined += interpretation[index_tmp+length][0]
                score_combinded += interpretation[index_tmp+length][1]
                length += 1
            interpretation_combined.append((text_combined, score_combinded/length))
            index_tmp += length

    interpretation_combined.append(('', 0.0))
    print(interpretation_combined)
    
    res = {"original": text['text'], "interpretation": interpretation_combined}
    # pos = []
    # neg = []
    # res = []
    # for i in interpretation:
    #     if i[1] > 0:
    #         pos.append(i[1])
    #     elif i[1] < 0:
    #         neg.append(i[1])
    #     else:
    #         continue
    # median_pos = np.median(pos)
    # median_neg = np.median(neg)


    # res.append(("P", "+"))
    # res.append(("/", None))
    # res.append(("N", "-"))
    # res.append(("Review:", None))
    # for i in interpretation:
    #     if i[1] > median_pos:
    #         res.append((i[0], "+"))
    #     elif i[1] < median_neg:
    #         res.append((i[0], "-"))
    #     else:
    #         res.append((i[0], None))
    return res

    
def func3_written(text_written, human_predict):
    chatbot = []
    # num1: Human score; num2: AI score

    # (START) off-the-shelf version

    # tokenizer = AutoTokenizer.from_pretrained("nlptown/bert-base-multilingual-uncased-sentiment")
    # model = AutoModelForSequenceClassification.from_pretrained("nlptown/bert-base-multilingual-uncased-sentiment")

    device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
    classifier = pipeline("text-classification", model="padmajabfrl/Gender-Classification", device=device)
    tokenizer = AutoTokenizer.from_pretrained("padmajabfrl/Gender-Classification")

    output = classifier([text_written])

    print(output)
    out = output[0]
    # (END) off-the-shelf version

    if out['label'] == 'Female':
        ai_predict = int(10 * out['score'])
    else:
        ai_predict = 10 - int(10 * out['score'])
    
    if abs(ai_predict - human_predict) <= 2:
        chatbot.append(("AI gives it a close score! πŸŽ‰", "⬅️ Feel free to try another one! This time let’s see if you can trick the AI into giving a wrong rating. ⬅️"))
    else:
        chatbot.append(("AI thinks in a different way from human. πŸ˜‰", "⬅️ Feel free to try another one! ⬅️"))

    import shap

    gender_classifier = pipeline("text-classification", model="padmajabfrl/Gender-Classification", return_all_scores=True, device=device)

    explainer = shap.Explainer(gender_classifier)

    shap_values = explainer([text_written])
    interpretation = list(zip(shap_values.data[0], shap_values.values[0, :, 1]))

    
    encodings = tokenizer(text_written, return_offsets_mapping=True)

    print(encodings['offset_mapping'])
    is_subword = [False, False]
    for i in range(2, len(encodings['offset_mapping'])):
        if encodings['offset_mapping'][i][0] == encodings['offset_mapping'][i-1][1]:
            is_subword.append(True)
        else:
            is_subword.append(False)
    print(is_subword)
    interpretation_combined = []

    index_tmp = 0
    while index_tmp < (len(interpretation) - 1):
        if not is_subword[index_tmp+1]:
            interpretation_combined.append(interpretation[index_tmp])
            index_tmp += 1
        else:
            text_combined = interpretation[index_tmp][0]
            score_combinded = interpretation[index_tmp][1]
            length = 1
            while is_subword[index_tmp+length]:
                text_combined += interpretation[index_tmp+length][0]
                score_combinded += interpretation[index_tmp+length][1]
                length += 1
            interpretation_combined.append((text_combined, score_combinded/length))
            index_tmp += length

    interpretation_combined.append(('', 0.0))
    print(interpretation_combined)

    res = {"original": text_written, "interpretation": interpretation_combined}
    print(res)

    return res, ai_predict, chatbot