-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinterface.py
More file actions
138 lines (112 loc) · 3.12 KB
/
interface.py
File metadata and controls
138 lines (112 loc) · 3.12 KB
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
import streamlit as st
import pandas as pd
import json
import re
st.set_page_config(layout="wide")
st.title("WildChat Dataset Visualization Interface")
#load data
@st.cache_data
def load_data():
return pd.read_parquet("data/parquet/chunk_0.parquet")
df = load_data()
# Format Conversation Column
def format_conv(conv):
try:
if hasattr(conv, "to_pylist"):
conv = conv.to_pylist()
if isinstance(conv, str):
conv = json.loads(conv)
return "\n\n".join(
f"{msg.get('role','')}: {msg.get('content','')}"
for msg in conv if isinstance(msg, dict)
)
except:
return str(conv)
#format columns
def format_json(obj):
try:
if hasattr(obj, "to_pylist"):
obj = obj.to_pylist()
if hasattr(obj, "as_py"):
obj = obj.as_py()
if isinstance(obj, list) and len(obj) > 0:
obj = obj[0]
if isinstance(obj, dict):
return ", ".join(f"{k}:{v}" for k, v in obj.items())
return str(obj)
except:
return str(obj)
# Apply formatting
df["conversation"] = df["conversation"].apply(format_conv)
df["openai_moderation"] = df["openai_moderation"].apply(format_json)
df["detoxify_moderation"] = df["detoxify_moderation"].apply(format_json)
#filter
st.sidebar.header("Filters")
language = st.sidebar.selectbox(
"Language",
options=df["language"].dropna().unique()
)
model = st.sidebar.selectbox(
"Model",
options=df["model"].dropna().unique()
)
#Keyword search input
keyword = st.sidebar.text_input("Search keyword (in conversation)")
use_regex = st.sidebar.checkbox("Use regex")
filtered_df = df[
(df["language"] == language) &
(df["model"] == model)
].copy()
if keyword:
filtered_df = filtered_df[
filtered_df["conversation"].str.contains(
keyword,
case=False,
na=False,
regex=use_regex
)
]
#Keyword
def highlight_keyword(text, keyword):
if not keyword or not isinstance(text, str):
return text
return re.sub(
f"({re.escape(keyword)})",
r"**\1**",
text,
flags=re.IGNORECASE
)
if keyword:
filtered_df["conversation"] = filtered_df["conversation"].apply(
lambda x: highlight_keyword(x, keyword)
)
#charts
col1, col2 = st.columns(2)
with col1:
st.subheader("Language Distribution")
st.bar_chart(df["language"].value_counts())
with col2:
st.subheader("Model Usage")
st.bar_chart(df["model"].value_counts())
#convo len
filtered_df.loc[:, "conversation_length"] = filtered_df["conversation"].apply(
lambda x: x.count("\n") if isinstance(x, str) else 0
)
st.subheader("Conversation Length Distribution")
st.bar_chart(filtered_df["conversation_length"].value_counts().sort_index())
#count how many results
st.write(f"Results found: {len(filtered_df)}")
#data
st.subheader("Filtered Conversations")
st.dataframe(
filtered_df[
[
"conversation",
"language",
"model",
"toxic",
"openai_moderation",
"detoxify_moderation"
]
].head(50)
)