Spaces:
Running
Running
File size: 7,512 Bytes
685d696 125a49a 685d696 125a49a 685d696 125a49a 685d696 125a49a 685d696 125a49a 685d696 |
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 |
dimensions = ["A", "B-S", "B-O", "C-S", "C-O", "D"]
dimension_to_layer_name_raw = { # in raw annotation files (Ayal's outputs)
"A": "Segment Patient Affect (A)",
"B-S": "Segment Patient B-S",
"B-O": "Segment Patient B-O",
"C-S": "Segment Patient C-S",
"C-O": "Segment Patient C-O",
"D": "Segment Patient Desire (D)",
}
dimension_to_layer_name_cleaned = { # in cleaned annotation files (Yael's outputs)
"A": "Segment_Patient_A",
"B-S": "Segment_Patient_B-S",
"B-O": "Segment_Patient_B-O",
"C-S": "Segment_Patient_C-S",
"C-O": "Segment_Patient_C-O",
"D": "Segment_Patient_D",
}
def df_to_self_states_json(df, doc_name, annotator = None):
"""Convert a dataframe into a json object that can be more easily used for visualization."""
# df is the dataframe of annotations
# doc_name is the name of the document
# annotator is the name of the annotator (optional)
# select dimension_to_layer_name
if 'Segment_Patient_A' in df.layer.unique():
dimension_to_layer_name = dimension_to_layer_name_cleaned
else:
dimension_to_layer_name = dimension_to_layer_name_raw
def get_evidence_obj(evidence_df):
"Assume that the evidence_df is a partial dataframe including only annotation of a single evidence span."
evidence_obj = {k: v.value.iloc[0] for k, v in evidence_df.groupby("feature")}
# evidence_obj["text"] = evidence_df.span_text.iloc[0]
# evidence_obj["span_index_begin"] = evidence_df.begin.iloc[0]
# evidence_obj["span_index_end"] = evidence_df.end.iloc[0]
return evidence_obj
doc_object = {"document": doc_name, "annotator": annotator}
doc_object["segments"] = []
doc_df = df[df.document == doc_name]
if annotator:
doc_df = doc_df[doc_df.annotator == annotator]
# now add the segments
for segment_index, segment_group in df[df.document == doc_name].groupby("segment"):
# add Segment Summary features into segment object
segment_object = {"segment": segment_index}
segment_summary_df = segment_group[segment_group.layer == "Segment Summary"]
# # if not post-summary, skip this post
# if segment_summary_df.empty:
# continue
segment_object["Segment Summary"] = {k: v.value.iloc[0] for k, v in segment_summary_df.groupby("feature")}
state1_df = segment_group[segment_group.self_state_index == 1]
state2_df = segment_group[segment_group.self_state_index == 2]
states_list = list()
state1_obj = dict()
state2_obj = dict()
# set is_adaptive for each state
if not state1_df.empty:
state1_obj["is_adaptive"] = state1_df.is_adaptive.dropna().iloc[0]
states_list.append(state1_obj)
if not state2_df.empty:
state2_obj["is_adaptive"] = state2_df.is_adaptive.dropna().iloc[0]
states_list.append(state2_obj)
# collect elements per dimension
for dimension in dimensions:
segment_dim_layer_name = dimension_to_layer_name[dimension]
state1_dimension_df = state1_df[state1_df.layer == segment_dim_layer_name]
state2_dimension_df = state2_df[state2_df.layer == segment_dim_layer_name]
# search for evidence layers that match the same segment and dimension
dim_evidence_rows = segment_group[segment_group.layer == f"Patient_{dimension}_evidence"]
if not state1_dimension_df.empty:
state1_obj[dimension] = {k: v.value.iloc[0] for k, v in state1_dimension_df.groupby("feature")} # "Category", "Adaptivity", "Presence"
evidences_obj = []
# for _, evidence_df in dim_evidence_rows.groupby("span_text"):
for _, evidence_df in dim_evidence_rows.groupby(["begin", "end"]):
# take only the evidence that matches the category of the segment-level element of the same dimension
if not evidence_df.empty and evidence_df[evidence_df.feature == "Category"].value.iloc[0] == state1_obj[dimension]["Category"]:
evidences_obj.append(get_evidence_obj(evidence_df))
if evidences_obj:
state1_obj[dimension]["evidences"] = evidences_obj
if not state2_dimension_df.empty:
state2_obj[dimension] = {k: v.value.iloc[0] for k, v in state2_dimension_df.groupby("feature")} # "Category", "Adaptivity", "Presence"
evidences_obj = []
# for _, evidence_df in dim_evidence_rows.groupby("span_text"):
for _, evidence_df in dim_evidence_rows.groupby(["begin", "end"]):
# take only the evidence that matches the category of the segment-level element of the same dimension
if not evidence_df.empty and evidence_df[evidence_df.feature == "Category"].value.iloc[0] == state2_obj[dimension]["Category"]:
evidences_obj.append(get_evidence_obj(evidence_df))
if evidences_obj:
state2_obj[dimension]["evidences"] = evidences_obj
segment_object["self-states"] = states_list
# add the post object to the document object
doc_object["segments"].append(segment_object)
return doc_object
element_short_desc_map = {
'A:(11) Proud': 'A:(11) Proud',
'B-O:(1) Relating behavior': 'B-O:(1) Relating',
'C-S:(1) Self-acceptance and compassion': 'C-S:(1) Self-compassion',
'D:(1) Relatedness': 'D:(1) Relatedness',
'A:(4) Depressed, despair, hopeless': 'A:(4) Depressed',
'C-O:(4) Perception of the other as blocking autonomy needs': 'C-O:(4) Other blocks autonomy',
'C-S:(2) Self criticism': 'C-S:(2) Self-criticism',
'C-O:(2) Perception of the other as detached or over attached': 'C-O:(2) Other detached/overattached',
'C-O:(1) Perception of the other as related': 'C-O:(1) Other related',
'A:(3) Sad, emotional pain, grieving': 'A:(3) Sadness',
'B-O:(2) Fight or flight behavior': 'B-O:(2) Fight/flight',
'A:(14) Feel lonely': 'A:(14) Lonely',
'D:(2) Expectation that relatedness needs will not be met': 'D:(2) Relatedness (-)',
'B-S:(2) Self harm, neglect and avoidance': 'B-S:(2) Self-harm',
'A:(10) Angry (aggression), disgust, contempt': 'A:(10) Angry/Aggressive',
'A:(8) Apathic, don’t care, blunted': 'A:(8) Apathetic',
'B-S:(1) Self care and improvement': 'B-S:(1) Self-care',
'D:(5) Competence, self esteem, self-care': 'D:(5) Competence',
'D:(6) Expectation that competence needs will not be met': 'D:(6) Competence (-)',
'C-O:(3) Perception of the other as facilitating autonomy needs': 'C-O:(3) Other supports autonomy',
'A:(2) Anxious/ fearful/ tense': 'A:(2) Anxious',
'A:(12) Ashamed, guilty': 'A:(12) Ashamed/Guilty',
'B-O:(4) Over controlled or controlling behavior': 'B-O:(4) Controlling',
'A:(1) Calm/ laid back': 'A:(1) Calm',
'D:(4) Expectation that autonomy needs will not be met': 'D:(4) Autonomy (-)',
'D:(3) Autonomy and adaptive control': 'D:(3) Autonomy',
'A:(5) Content, happy, joy, hopeful': 'A:(5) Happy',
'B-O:(3) Autonomous or adaptive control behavior': 'B-O:(3) Adaptive control',
'A:(9) Justifiable anger/ assertive anger, justifiable outrage': 'A:(9) Justified anger',
'A:(13) Feel loved, belong': 'A:(13) Loved/Belonging',
'A:(7) Vigor / energetic': 'A:(7) Vigor'
}
|