|
import gradio as gr |
|
|
|
|
|
questions = [ |
|
"1. Talks a lot", |
|
"2. Notices other people’s weak points", |
|
"3. Does things carefully and completely", |
|
"4. Is sad, depressed", |
|
"5. Is original, comes up with new ideas", |
|
"6. Keeps their thoughts to themselves", |
|
"7. Is helpful and not selfish with others", |
|
"8. Can be kind of careless", |
|
"9. Is relaxed, handles stress well", |
|
"10. Is curious about lots of different things", |
|
"11. Has a lot of energy", |
|
"12. Starts arguments with others", |
|
"13. Is a good, hard worker", |
|
"14. Can be tense; not always easy going", |
|
"15. Clever; thinks a lot", |
|
"16. Makes things exciting", |
|
"17. Forgives others easily", |
|
"18. Isn’t very organized", |
|
"19. Worries a lot", |
|
"20. Has a good, active imagination", |
|
"21. Tends to be quiet", |
|
"22. Usually trusts people", |
|
"23. Tends to be lazy", |
|
"24. Doesn’t get upset easily; steady", |
|
"25. Is creative and inventive", |
|
"26. Has a good, strong personality", |
|
"27. Can be cold and distant with others", |
|
"28. Keeps working until things are done", |
|
"29. Can be moody", |
|
"30. Likes artistic and creative experiences", |
|
"31. Is kind of shy", |
|
"32. Kind and considerate to almost everyone", |
|
"33. Does things quickly and carefully", |
|
"34. Stays calm in difficult situations", |
|
"35. Likes work that is the same every time", |
|
"36. Is outgoing; likes to be with people", |
|
"37. Is sometimes rude to others", |
|
"38. Makes plans and sticks to them", |
|
"39. Get nervous easily", |
|
"40. Likes to think and play with ideas", |
|
"41. Doesn’t like artistic things (plays, music)", |
|
"42. Likes to cooperate; goes along with others", |
|
"43. Has trouble paying attention", |
|
"44. Knows a lot about art, music and books" |
|
] |
|
|
|
|
|
def compute_bfi_scores(*args): |
|
responses = list(args) |
|
|
|
processed = [] |
|
for r in responses: |
|
if r == "No response": |
|
processed.append(None) |
|
else: |
|
processed.append(int(r)) |
|
|
|
|
|
traits = { |
|
'Extraversion': { |
|
'positive': [1, 11, 16, 26, 36], |
|
'reverse': [6, 21, 31], |
|
'threshold': 1, |
|
'formula_pos_mult': 5, |
|
'formula_reverse_mult': 3, |
|
'formula_reverse_const': 12 |
|
}, |
|
'Agreeableness': { |
|
'positive': [7, 17, 22, 32, 42], |
|
'reverse': [2, 12, 27, 37], |
|
'threshold': 1, |
|
'formula_pos_mult': 5, |
|
'formula_reverse_mult':4, |
|
'formula_reverse_const':16 |
|
}, |
|
'Conscientiousness': { |
|
'positive': [3, 13, 28, 33, 38], |
|
'reverse': [8, 18, 23, 43], |
|
'threshold': 1, |
|
'formula_pos_mult':5, |
|
'formula_reverse_mult':4, |
|
'formula_reverse_const':16 |
|
}, |
|
'Neuroticism':{ |
|
'positive':[4, 14, 19, 29, 39], |
|
'reverse':[9, 24, 34], |
|
'threshold':1, |
|
'formula_pos_mult':5, |
|
'formula_reverse_mult':3, |
|
'formula_reverse_const':12 |
|
}, |
|
'Openness':{ |
|
'positive':[5, 10, 15, 20, 25, 30, 40, 44], |
|
'reverse':[35, 41], |
|
'threshold':2, |
|
'formula_pos_mult':8, |
|
'formula_reverse_mult':2, |
|
'formula_reverse_const':8 |
|
} |
|
} |
|
|
|
scores = {} |
|
|
|
for trait, info in traits.items(): |
|
pos_items = [processed[i-1] for i in info['positive']] |
|
rev_items = [processed[i-1] for i in info['reverse']] |
|
|
|
missing_pos = pos_items.count(None) |
|
missing_rev = rev_items.count(None) |
|
total_missing = missing_pos + missing_rev |
|
|
|
if total_missing > info['threshold']: |
|
scores[trait] = "Incomplete" |
|
else: |
|
|
|
pos_values = [x for x in pos_items if x is not None] |
|
rev_values = [x for x in rev_items if x is not None] |
|
|
|
mean_pos = sum(pos_values) / len(pos_values) if pos_values else 0 |
|
mean_rev = sum(rev_values) / len(rev_values) if rev_values else 0 |
|
|
|
|
|
score = (mean_pos * info['formula_pos_mult']) + (info['formula_reverse_const'] - (mean_rev * info['formula_reverse_mult'])) |
|
score = round(score, 2) |
|
scores[trait] = score |
|
|
|
|
|
output = "## Your Big Five Personality Traits Scores\n\n" |
|
for trait, score in scores.items(): |
|
output += f"**{trait}**: {score}\n\n" |
|
|
|
return output |
|
|
|
|
|
def create_interface(): |
|
with gr.Blocks() as demo: |
|
gr.Markdown("## Big Five Inventory (BFI) Quiz") |
|
gr.Markdown("Please rate the following statements on a scale from **1 (Disagree a lot)** to **5 (Agree a lot)**. If you prefer not to respond to a particular statement, select **'No response'**.") |
|
|
|
|
|
with gr.Column(): |
|
dropdowns = [] |
|
for q in questions: |
|
dropdown = gr.Dropdown( |
|
choices=["No response", 1, 2, 3, 4, 5], |
|
label=q, |
|
value="No response" |
|
) |
|
dropdowns.append(dropdown) |
|
|
|
|
|
submit_btn = gr.Button("Submit") |
|
|
|
|
|
result = gr.Markdown() |
|
|
|
|
|
submit_btn.click(fn=compute_bfi_scores, inputs=dropdowns, outputs=result) |
|
|
|
return demo |
|
|
|
|
|
demo = create_interface() |
|
demo.launch() |
|
|