File size: 3,436 Bytes
df321c6
6af31c0
df321c6
 
 
 
6af31c0
ffcb713
366eb95
df321c6
445b175
4ee53fe
 
 
 
 
 
 
 
 
df321c6
 
 
 
4ee53fe
 
 
 
 
 
 
df321c6
 
 
 
 
 
 
 
e4c8a16
e18eaf4
 
df321c6
6af31c0
e18eaf4
445b175
 
df321c6
e18eaf4
 
 
 
 
 
 
6af31c0
445b175
 
 
6af31c0
 
e18eaf4
366eb95
 
e18eaf4
 
445b175
6af31c0
e18eaf4
445b175
6af31c0
 
e18eaf4
 
6af31c0
445b175
6af31c0
 
445b175
df321c6
366eb95
445b175
366eb95
445b175
 
df321c6
366eb95
 
df321c6
 
445b175
df321c6
 
445b175
366eb95
6af31c0
 
4ee53fe
366eb95
df321c6
4ee53fe
 
 
df321c6
2f6de14
df321c6
 
 
 
 
4ee53fe
 
 
 
 
 
df321c6
 
 
 
4ee53fe
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
import os
import re
import pandas as pd
import plotly.express as px
import streamlit as st

st.set_page_config(layout="wide")
DATA_FILE = "data/aclanthology2016-23_specter2_base.json"
THEMES = {"cluster": "fall", "year": "mint", "source": "phase"}


def to_string_authors(list_of_authors):
    if len(list_of_authors) > 5:
        return ", ".join(list_of_authors[:5]) + ", et al."
    elif len(list_of_authors) > 2:
        return ", ".join(list_of_authors[:-1]) + ", and " + list_of_authors[-1]
    else:
        return " and ".join(list_of_authors)


def load_df(data_file: os.PathLike):
    df = pd.read_json(data_file, orient="records")
    df["x"] = df["point2d"].apply(lambda x: x[0])
    df["y"] = df["point2d"].apply(lambda x: x[1])

    df["authors_trimmed"] = df.authors.apply(
        lambda row: to_string_authors(
            [(x[x.index(",") + 1 :].strip() + " " + x.split(",")[0].strip()) if "," in x else x for x in row]
        )
    )

    if "publication_type" in df.columns:
        df["type"] = df["publication_type"]
        df = df.drop(columns=["point2d", "publication_type"])
    else:
        df = df.drop(columns=["point2d"])
    return df


@st.cache_data
def load_dataframe():
    return load_df(DATA_FILE)


DF = load_dataframe()
DF["opacity"] = 0.04
min_year, max_year = DF["year"].min(), DF["year"].max()

with st.sidebar:
    venues = st.multiselect(
        "Venues",
        ["ACL", "EMNLP", "NAACL", "TACL"],
        ["ACL", "EMNLP", "NAACL", "TACL"],
    )

    start_year, end_year = st.select_slider(
        "Publication year",
        options=[str(y) for y in range(min_year, max_year + 1)],
        value=(str(min_year), str(max_year)),
    )
    author_names = st.text_input("Author names (separated by comma)")

    title = st.text_input("Title")

    start_year = int(start_year)
    end_year = int(end_year)
    df_mask = (DF["year"] >= start_year) & (DF["year"] <= end_year)
    if 0 < len(venues) < 4:
        selected_venues = [v.lower() for v in venues]
        df_mask = df_mask & DF["source"].isin(selected_venues)
    elif not venues:
        st.write(":red[Please select a venue]")

    if author_names:
        authors = [a.strip() for a in author_names.split(",")]
        author_mask = DF.authors.apply(
            lambda row: all(any(re.match(rf".*{a}.*", x, re.IGNORECASE) for x in row) for a in authors)
        )
        df_mask = df_mask & author_mask

    if title:
        df_mask = df_mask & DF.title.apply(lambda x: title.lower() in x.lower())

    DF.loc[df_mask, "opacity"] = 1.0
    st.write(f"Number of points: {DF[df_mask].shape[0]}")

    color = st.selectbox("Color", ("cluster", "year", "source"))


fig = px.scatter(
    DF,
    x="x",
    y="y",
    opacity=DF["opacity"],
    color=color,
    width=1000,
    height=800,
    custom_data=("title", "authors_trimmed", "year", "source", "type"),
    color_continuous_scale=THEMES[color],
)
fig.update_traces(
    hovertemplate="<b>%{customdata[0]}</b><br>%{customdata[1]}<br>%{customdata[2]}<br><i>%{customdata[3]}</i>"
)
fig.update_layout(
    # margin=dict(l=10, r=10, t=10, b=10),
    showlegend=False,
    font=dict(
        family="Times New Roman",
        size=30,
    ),
    hoverlabel=dict(
        align="left",
        font_size=14,
        font_family="Rockwell",
        namelength=-1,
    ),
)
fig.update_xaxes(title="")
fig.update_yaxes(title="")

st.plotly_chart(fig, use_container_width=True)