|
|
import streamlit as st
|
|
|
import pandas as pd
|
|
|
import numpy as np
|
|
|
import torch
|
|
|
import ast
|
|
|
from sentence_transformers import SentenceTransformer
|
|
|
from sklearn.metrics.pairwise import cosine_similarity
|
|
|
import random
|
|
|
import asyncio
|
|
|
import os
|
|
|
os.environ["STREAMLIT_WATCHDOG"] = "0"
|
|
|
|
|
|
try:
|
|
|
asyncio.get_running_loop()
|
|
|
except RuntimeError:
|
|
|
asyncio.set_event_loop(asyncio.new_event_loop())
|
|
|
|
|
|
|
|
|
|
|
|
model = SentenceTransformer('all-MiniLM-L6-v2')
|
|
|
|
|
|
def get_embedding(text):
|
|
|
return model.encode(text, convert_to_numpy=True)
|
|
|
|
|
|
|
|
|
tweets_df = pd.read_csv("dataset_with_embeddings.csv")
|
|
|
original_tweets_df = pd.read_csv("dataset_with_actual_text.csv")
|
|
|
|
|
|
|
|
|
|
|
|
def parse_embedding(embedding_str):
|
|
|
try:
|
|
|
return ast.literal_eval(embedding_str)
|
|
|
except (ValueError, SyntaxError):
|
|
|
return None
|
|
|
|
|
|
|
|
|
tweets_df['sentence_embedding'] = tweets_df['sentence_embedding'].astype(str).apply(parse_embedding)
|
|
|
|
|
|
|
|
|
users = {"testuser": "password123"}
|
|
|
|
|
|
|
|
|
if "logged_in" not in st.session_state:
|
|
|
st.session_state["logged_in"] = False
|
|
|
st.session_state["username"] = ""
|
|
|
st.session_state["liked_tweets"] = []
|
|
|
st.session_state["posted_tweets"] = []
|
|
|
|
|
|
|
|
|
if not st.session_state["logged_in"]:
|
|
|
st.title("Tweet Recommendation System")
|
|
|
username = st.text_input("Username")
|
|
|
password = st.text_input("Password", type="password")
|
|
|
if st.button("Login"):
|
|
|
if username in users and users[username] == password:
|
|
|
st.session_state["logged_in"] = True
|
|
|
st.session_state["username"] = username
|
|
|
st.success("Login successful!")
|
|
|
st.experimental_rerun()
|
|
|
else:
|
|
|
st.error("Invalid credentials")
|
|
|
else:
|
|
|
st.title(f"Welcome, {st.session_state['username']}!")
|
|
|
|
|
|
|
|
|
random_tweets = original_tweets_df.sample(10)
|
|
|
|
|
|
st.subheader("Explore Tweets")
|
|
|
for _, row in random_tweets.iterrows():
|
|
|
tweet_id = row['tweet_id']
|
|
|
text = row['original_text']
|
|
|
|
|
|
with st.container():
|
|
|
st.write(f"*Tweet:* {text}")
|
|
|
if st.button(f"Like β€ {tweet_id}", key=f"like_{tweet_id}"):
|
|
|
if tweet_id not in st.session_state["liked_tweets"]:
|
|
|
st.session_state["liked_tweets"].append(tweet_id)
|
|
|
st.success("Tweet Liked!")
|
|
|
|
|
|
|
|
|
st.subheader("Post a Tweet")
|
|
|
new_tweet = st.text_area("Write your tweet here:")
|
|
|
if st.button("Post Tweet"):
|
|
|
if new_tweet:
|
|
|
new_tweet_embedding = get_embedding(new_tweet)
|
|
|
st.session_state["posted_tweets"].append(new_tweet_embedding)
|
|
|
st.success("Tweet posted successfully!")
|
|
|
|
|
|
|
|
|
if st.session_state["liked_tweets"] or st.session_state["posted_tweets"]:
|
|
|
st.subheader("Recommended Tweets for You")
|
|
|
|
|
|
|
|
|
liked_embeddings = [tweets_df[tweets_df['tweet_id'] == tid]['sentence_embedding'].values[0]
|
|
|
for tid in st.session_state["liked_tweets"]]
|
|
|
|
|
|
|
|
|
posted_embeddings = st.session_state["posted_tweets"]
|
|
|
|
|
|
|
|
|
user_profile_embedding = np.mean(liked_embeddings + posted_embeddings, axis=0)
|
|
|
|
|
|
|
|
|
all_embeddings = np.vstack(tweets_df['sentence_embedding'].values)
|
|
|
similarities = cosine_similarity([user_profile_embedding], all_embeddings)[0]
|
|
|
|
|
|
|
|
|
top_indices = np.argsort(similarities)[-10:][::-1]
|
|
|
recommended_tweets = tweets_df.iloc[top_indices]
|
|
|
|
|
|
|
|
|
for _, row in recommended_tweets.iterrows():
|
|
|
tweet_id = row['tweet_id']
|
|
|
text = original_tweets_df[original_tweets_df['tweet_id'] == tweet_id]['original_text'].values[0]
|
|
|
with st.container():
|
|
|
st.write(f"*Recommended Tweet:* {text}") |