in src/tab_grouping_streamlit.py [0:0]
def print_results(df, user_label_key: str, ai_label_key: str, topic_generator: str = None, predicted_id_topics=None,
docname="test_output", scores=None):
ai_label_for_user_grouped_topic = {}
html_buffer = ""
key_doc_finder_ai = KeyDocumentFinder(df, ai_label_key, "title")
key_doc_finder_ai.compute_all()
key_doc_finder_user = KeyDocumentFinder(df, user_label_key, "title")
key_doc_finder_user.compute_all()
def add_html(s: str):
nonlocal html_buffer
html_buffer += s
if predicted_id_topics is None:
predicted_id_topics = {}
color_table = {}
topic_generator = get_topic_generator(topic_generator)
add_html('<div class="tab-container">')
def get_color(label: str):
if label in color_table:
return color_table[label]
else:
color_table[label] = COLOR_LIST[len(color_table)]
return color_table[label]
def get_tab_group(group_key: str, group_item: str, label_key: str, is_ai_group: False):
if group_item is None:
add_html('<div class="tab-group"> </div>')
return
items = df[df[group_key] == group_item]
topic = None
picked_documents_set = set()
keywords = ""
if len(items) > 0:
key_doc_finder = key_doc_finder_ai if is_ai_group else key_doc_finder_user
topic, picked_documents, keywords = compute_topic_using_digest(topic_generator, key_doc_finder, items,
group_item)
add_html('<div class="tab-group">')
extra_topic = ""
if is_ai_group:
header_title = topic or "Unknown"
else:
if isinstance(group_item, float):
group_item = int(group_item)
header_title = predicted_id_topics.get(str(group_item), group_item)
extra_topic = topic or "Unknown"
ai_label_for_user_grouped_topic[str(group_item)] = extra_topic
add_html(f'<div class="tab-header">{header_title}</div>')
add_html(f'<div class="tab-content">')
labels = items[label_key].astype(str).to_list()
bullet_points = items["title"].to_list()
for k in range(0, len(bullet_points)):
add_html(f'''
<div class="tab-item">
<div class="tab-item-box" style="background-color:{get_color(labels[k])}"></div>
<div class="tab-item-text">{bullet_points[k]}</div>
</div> ''')
add_html('</div>') # tab-content
add_html('</div>') # tab-group
aligned_user_ai_topic_list = compute_aligned_topics(df, user_label_key, ai_label_key)
add_html('<div class="group-match-pair">')
add_html('<div class="tab-group-legend">')
add_html(docname)
add_html('<div class="tab-group-legend-subhead">Tab groups you named</div>')
add_html('</div>')
add_html('<div class="tab-group-legend">')
add_html('AI Generated')
add_html('<div class="tab-group-legend-subhead">Generated tab groups, tabs sorted by group match accuracy</div>')
add_html('</div>')
add_html('</div>')
for topic_item in aligned_user_ai_topic_list:
user_topic = topic_item[0]
ai_topic = topic_item[1]
add_html('<div class="group-match-pair">')
get_tab_group(user_label_key, user_topic, user_label_key, is_ai_group=False)
get_tab_group(ai_label_key, ai_topic, user_label_key, is_ai_group=True)
add_html('</div>')
if scores is not None:
add_html(
f'<div class="report-header">Avg. Rand Score: {scores[0]:.2f} Adjusted Rand Score: {scores[1]:.2f}</div>')
# Show label pairs for user labeled groups
add_html(
'<p /><p /><p /><div class="tab-container-title">Labels for Your Original Groupings</div><div class="report-header">')
for topic_item in aligned_user_ai_topic_list:
user_topic = topic_item[0]
if user_topic is None:
break
if isinstance(user_topic, float):
user_topic = int(user_topic)
user_label = predicted_id_topics.get(str(user_topic), user_topic)
ai_label = ai_label_for_user_grouped_topic.get(str(user_topic), "--")
add_html(f'<p><b>User Label:</b> {user_label} <b>AI Label:</b> {ai_label} </p>')
add_html('</div>')
add_html('</div>') # tab-container
label_dict = predicted_id_topics or {}
legend = f'''
<div class="tab-container-title">Tab Grouping Report</div>
<div class="legend">
{"".join([f'<div class="legend-item">{get_box(v, big=True)}<div>{label_dict.get(str(k), k)}</div></div>' for k, v in color_table.items()])}
</div>
'''
all_html = STYLE_CSS + legend + html_buffer
st.html(all_html)
if DO_OUTPUT_HTML_RESULT:
with open(f"./output/{docname}_out.html", "w") as file:
file.write(f"<html><body>{all_html}</body></html>")