Spaces:
Runtime error
Runtime error
update
Browse files
app.py
CHANGED
|
@@ -13,6 +13,7 @@ import datasets
|
|
| 13 |
import requests
|
| 14 |
|
| 15 |
from datetime import timezone # Ensure timezone is imported
|
|
|
|
| 16 |
|
| 17 |
# --- Data Loading and Processing ---
|
| 18 |
|
|
@@ -37,6 +38,10 @@ def get_df() -> pd.DataFrame:
|
|
| 37 |
df["date"] = pd.to_datetime(df["date"], errors='coerce')
|
| 38 |
df["date"] = df["date"].dt.strftime("%Y-%m-%d").fillna(datetime.datetime.now(timezone.utc).strftime("%Y-%m-%d"))
|
| 39 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
# Prepare the DataFrame by removing 'abstract'
|
| 41 |
paper_info = []
|
| 42 |
for _, row in tqdm.auto.tqdm(df.iterrows(), total=len(df)):
|
|
@@ -56,6 +61,18 @@ class Prettifier:
|
|
| 56 |
"""
|
| 57 |
Converts raw DataFrame rows into a prettified format suitable for display.
|
| 58 |
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
@staticmethod
|
| 60 |
def get_github_link(link: str) -> str:
|
| 61 |
if not link:
|
|
@@ -70,20 +87,23 @@ class Prettifier:
|
|
| 70 |
new_rows = []
|
| 71 |
for _, row in df.iterrows():
|
| 72 |
# Handle date_display as a clickable link
|
| 73 |
-
date_display =
|
| 74 |
|
| 75 |
new_row = {
|
| 76 |
"arxiv_id": row.get("arxiv_id", ""), # Include arxiv_id
|
| 77 |
"date_display": date_display, # For display
|
| 78 |
"date": row.get("date", datetime.datetime.now(timezone.utc).strftime("%Y-%m-%d")), # For internal calculations
|
| 79 |
-
"paper_page":
|
| 80 |
"title": row.get("title", "No title"),
|
| 81 |
-
"github":
|
| 82 |
"π": row.get("upvotes", 0),
|
| 83 |
"π¬": row.get("num_comments", 0),
|
| 84 |
}
|
| 85 |
new_rows.append(new_row)
|
| 86 |
-
|
|
|
|
|
|
|
|
|
|
| 87 |
|
| 88 |
|
| 89 |
class PaperList:
|
|
@@ -205,9 +225,11 @@ class PaperManager:
|
|
| 205 |
|
| 206 |
# Convert 'date' column to datetime
|
| 207 |
df_sorted = df.copy()
|
| 208 |
-
df_sorted['date_parsed'] = pd.to_datetime(df_sorted['date'], errors='coerce').dt.tz_localize(timezone.utc)
|
|
|
|
|
|
|
| 209 |
df_sorted = df_sorted[df_sorted['date_parsed'] >= time_threshold]
|
| 210 |
-
df_sorted = df_sorted.sort_values(by='
|
| 211 |
else:
|
| 212 |
df_sorted = df
|
| 213 |
|
|
@@ -235,8 +257,9 @@ class PaperManager:
|
|
| 235 |
"""
|
| 236 |
Sets the current search query and re-sorts the papers.
|
| 237 |
"""
|
| 238 |
-
|
| 239 |
-
|
|
|
|
| 240 |
self.sort_papers()
|
| 241 |
return True # Assume success
|
| 242 |
|
|
@@ -374,10 +397,7 @@ def change_sort_method_ui(method: str, time_frame: str = "all time") -> str:
|
|
| 374 |
"""
|
| 375 |
Changes the sort method and, if 'top' is selected, sets the time frame.
|
| 376 |
"""
|
| 377 |
-
if method.lower() == "top"
|
| 378 |
-
paper_manager.set_sort_method(method.lower(), time_frame)
|
| 379 |
-
else:
|
| 380 |
-
paper_manager.set_sort_method(method.lower())
|
| 381 |
return paper_manager.get_current_page_papers()
|
| 382 |
|
| 383 |
|
|
@@ -670,6 +690,13 @@ with demo:
|
|
| 670 |
outputs=[paper_list]
|
| 671 |
)
|
| 672 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 673 |
|
| 674 |
|
| 675 |
# --- Launch the App ---
|
|
|
|
| 13 |
import requests
|
| 14 |
|
| 15 |
from datetime import timezone # Ensure timezone is imported
|
| 16 |
+
import html # For sanitizing user inputs
|
| 17 |
|
| 18 |
# --- Data Loading and Processing ---
|
| 19 |
|
|
|
|
| 38 |
df["date"] = pd.to_datetime(df["date"], errors='coerce')
|
| 39 |
df["date"] = df["date"].dt.strftime("%Y-%m-%d").fillna(datetime.datetime.now(timezone.utc).strftime("%Y-%m-%d"))
|
| 40 |
|
| 41 |
+
# Ensure 'upvotes' and 'num_comments' are present and fill NaNs with 0
|
| 42 |
+
df['upvotes'] = df.get('upvotes', 0).fillna(0)
|
| 43 |
+
df['num_comments'] = df.get('num_comments', 0).fillna(0)
|
| 44 |
+
|
| 45 |
# Prepare the DataFrame by removing 'abstract'
|
| 46 |
paper_info = []
|
| 47 |
for _, row in tqdm.auto.tqdm(df.iterrows(), total=len(df)):
|
|
|
|
| 61 |
"""
|
| 62 |
Converts raw DataFrame rows into a prettified format suitable for display.
|
| 63 |
"""
|
| 64 |
+
def __init__(self):
|
| 65 |
+
self.expected_columns = [
|
| 66 |
+
"arxiv_id",
|
| 67 |
+
"date_display",
|
| 68 |
+
"date",
|
| 69 |
+
"paper_page",
|
| 70 |
+
"title",
|
| 71 |
+
"github",
|
| 72 |
+
"π",
|
| 73 |
+
"π¬",
|
| 74 |
+
]
|
| 75 |
+
|
| 76 |
@staticmethod
|
| 77 |
def get_github_link(link: str) -> str:
|
| 78 |
if not link:
|
|
|
|
| 87 |
new_rows = []
|
| 88 |
for _, row in df.iterrows():
|
| 89 |
# Handle date_display as a clickable link
|
| 90 |
+
date_display = self.create_link(row.date, f"https://huggingface.co/papers?date={row.date}")
|
| 91 |
|
| 92 |
new_row = {
|
| 93 |
"arxiv_id": row.get("arxiv_id", ""), # Include arxiv_id
|
| 94 |
"date_display": date_display, # For display
|
| 95 |
"date": row.get("date", datetime.datetime.now(timezone.utc).strftime("%Y-%m-%d")), # For internal calculations
|
| 96 |
+
"paper_page": self.create_link(row.get("arxiv_id", ""), row.get("paper_page", "#")),
|
| 97 |
"title": row.get("title", "No title"),
|
| 98 |
+
"github": self.get_github_link(row.get("github", "")),
|
| 99 |
"π": row.get("upvotes", 0),
|
| 100 |
"π¬": row.get("num_comments", 0),
|
| 101 |
}
|
| 102 |
new_rows.append(new_row)
|
| 103 |
+
if not new_rows:
|
| 104 |
+
return pd.DataFrame(columns=self.expected_columns)
|
| 105 |
+
else:
|
| 106 |
+
return pd.DataFrame(new_rows)
|
| 107 |
|
| 108 |
|
| 109 |
class PaperList:
|
|
|
|
| 225 |
|
| 226 |
# Convert 'date' column to datetime
|
| 227 |
df_sorted = df.copy()
|
| 228 |
+
df_sorted['date_parsed'] = pd.to_datetime(df_sorted['date'], errors='coerce').dt.tz_localize(timezone.utc, ambiguous='NaT', nonexistent='NaT')
|
| 229 |
+
# Handle NaT values by setting them to a very old date
|
| 230 |
+
df_sorted['date_parsed'] = df_sorted['date_parsed'].fillna(datetime.datetime.min.replace(tzinfo=timezone.utc))
|
| 231 |
df_sorted = df_sorted[df_sorted['date_parsed'] >= time_threshold]
|
| 232 |
+
df_sorted = df_sorted.sort_values(by='π', ascending=False).drop(columns=['date_parsed'])
|
| 233 |
else:
|
| 234 |
df_sorted = df
|
| 235 |
|
|
|
|
| 257 |
"""
|
| 258 |
Sets the current search query and re-sorts the papers.
|
| 259 |
"""
|
| 260 |
+
sanitized_query = html.escape(query) # Sanitize user input
|
| 261 |
+
print(f"Setting search query to: {sanitized_query}")
|
| 262 |
+
self.current_search_query = sanitized_query
|
| 263 |
self.sort_papers()
|
| 264 |
return True # Assume success
|
| 265 |
|
|
|
|
| 397 |
"""
|
| 398 |
Changes the sort method and, if 'top' is selected, sets the time frame.
|
| 399 |
"""
|
| 400 |
+
paper_manager.set_sort_method(method.lower(), time_frame if method.lower() == "top" else None)
|
|
|
|
|
|
|
|
|
|
| 401 |
return paper_manager.get_current_page_papers()
|
| 402 |
|
| 403 |
|
|
|
|
| 690 |
outputs=[paper_list]
|
| 691 |
)
|
| 692 |
|
| 693 |
+
# Footer
|
| 694 |
+
gr.Markdown("""
|
| 695 |
+
Related useful Spaces:
|
| 696 |
+
- [Semantic Scholar Paper Recommender](https://huggingface.co/spaces/librarian-bots/recommend_similar_papers) by [davanstrien](https://huggingface.co/davanstrien)
|
| 697 |
+
- [ArXiv CS RAG](https://huggingface.co/spaces/bishmoy/Arxiv-CS-RAG) by [bishmoy](https://huggingface.co/bishmoy)
|
| 698 |
+
- [Paper Q&A](https://huggingface.co/spaces/chansung/paper_qa) by [chansung](https://huggingface.co/chansung)
|
| 699 |
+
""")
|
| 700 |
|
| 701 |
|
| 702 |
# --- Launch the App ---
|