import streamlit as st from gnews import GNews from transformers import GPT2Tokenizer, GPT2LMHeadModel from transformers import pipeline from gnews import GNews from newspaper import Article def fetch_news(topic): google_news = GNews(language='german', country='Germany') # You can customize this news_list = google_news.get_news(topic) articles = [] for news in news_list[:5]: # Get top 5 news articles articles.append({ 'title': news['title'], 'published_date': news['published date'], 'description': news['description'], 'url': news['url'], 'publisher': news['publisher'] }) return articles def page_trending_niche(): st.title("What is trending in my niche?") niche = st.text_input('Enter your niche', 'Technology') # page_trending_niche function if niche: news_items = fetch_news(niche) article_titles = [item['title'] for item in news_items] selected_article = st.selectbox("Select an article to generate a social media post about:", article_titles) selected_article_description = next((item['description'] for item in news_items if item['title'] == selected_article), None) # Save the selected article's description in the session state to use in another page st.session_state['selected_article_description'] = selected_article_description for item in news_items: st.write(f"**Title:** {item['title']}") st.write(f"**Published Date:** {item['published_date']}") st.write(f"**Description:** {item['description']}") st.write(f"**Publisher:** {item['publisher']}") st.write(f"**URL:** [Read more]({item['url']})") st.write("---") def fetch_full_article(url): """Fetches the full text of an article given its URL.""" article = Article(url) article.download() article.parse() return article.text # Initialize the summarization pipeline with BART summarizer = pipeline("summarization", model="facebook/bart-large-cnn") def split_text_into_chunks(text, chunk_size, overlap_size): chunks = [] index = 0 while index < len(text): # End index for the current chunk end_index = index + chunk_size # Extend the end index to include the overlap, if possible end_index_with_overlap = min(end_index + overlap_size, len(text)) # Extract the chunk with the overlap chunk = text[index:end_index_with_overlap] chunks.append(chunk) # Move the index to the start of the next chunk, which is end_index index = end_index return chunks def generate_social_media_post(article_text): chunk_size = 900 # This is close to the model's maximum length for BART overlap_size = 50 # Overlap size to ensure continuity in the text chunks = split_text_into_chunks(article_text, chunk_size, overlap_size) summarized_text = '' for chunk in chunks: # Call the summarizer for each chunk summary = summarizer(chunk, max_length=130, min_length=30, do_sample=False)[0]['summary_text'] summarized_text += summary + ' ' return summarized_text.strip() def page_article_to_social_post(): st.title("Article to Social Media Post") # User input for niche niche = st.text_input('Enter your niche', 'Technology') if niche: # Fetch news articles google_news = GNews(language='german', country='Germany') # You can customize this news_list = google_news.get_news(niche) if not news_list: st.write("No news found for the given niche.") return # Display article titles in a selectbox article_titles = [news['title'] for news in news_list[:5]] selected_title = st.selectbox("Select an article:", article_titles) selected_article = next((item for item in news_list if item['title'] == selected_title), None) if selected_article: selected_url = selected_article['url'] if st.button('Fetch Full Article'): # Fetch the full article text article_text = fetch_full_article(selected_url) # Use an expander to display the article text in a scrollable view with st.expander("See full article"): st.text_area("Article Text", article_text, height=500) # Height is in pixels # Store the full article text in session state for later use st.session_state.full_article_text = article_text if st.button('Generate Social Media Post') and 'full_article_text' in st.session_state: with st.spinner('Generating...'): # Generate a summary based on the full article text post_content = generate_social_media_post(st.session_state.full_article_text) st.success('Generated Content:') st.write(post_content) def page_vaccation(): import streamlit as st import pandas as pd import pydeck as pdk # Input for start and end points start_point = st.text_input("Enter start point", "Location A") end_point = st.text_input("Enter end point", "Location B") # Assume function to calculate route and places of interest (mock data for demonstration) # You would replace this with real data obtained from mapping APIs route_data = pd.DataFrame({ 'lat': [start_lat, end_lat], 'lon': [start_lon, end_lon] }) places_of_interest = pd.DataFrame({ 'lat': [poi1_lat, poi2_lat], # Latitudes of places of interest 'lon': [poi1_lon, poi2_lon], # Longitudes of places of interest 'name': ['Place 1', 'Place 2'] # Names of places of interest }) # Display the map st.pydeck_chart(pdk.Deck( map_style='mapbox://styles/mapbox/light-v9', initial_view_state=pdk.ViewState( latitude=route_data['lat'].mean(), longitude=route_data['lon'].mean(), zoom=11, pitch=50, ), layers=[ pdk.Layer( 'ScatterplotLayer', data=places_of_interest, get_position='[lon, lat]', get_color='[200, 30, 0, 160]', get_radius=200, ), ], )) # Setup the sidebar with page selection st.sidebar.title("Anne's Current Projects :star2:") page = st.sidebar.selectbox( 'What project do you like to see first?', ('trending_niche', 'page_article_to_social_post', 'Vaccation Page')) # Display the selected page if page == 'trending_niche': page_trending_niche() elif page == 'page_article_to_social_post': page_article_to_social_post() elif page == 'Vaccation Page': page_test()