Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| from news_scraper import YahooNewsScraper | |
| from tfidf_calculator import JapaneseTextVectorizer | |
| from cosine_similarity_calculator import CosineSimilarityCalculator | |
| from summerizer import TextSummarizer | |
| st.title("最新ニュース要約アプリ") | |
| # 初期化 | |
| best_article_text = None | |
| best_article_url = None | |
| best_max_word = None | |
| max_word = None | |
| best_max_value = -1 # cos類似度は0以上なので、初期値を-1に設定 | |
| num_news = 5 | |
| # セッションステートの初期化 | |
| if 'news_fetched' not in st.session_state: | |
| st.session_state['news_fetched'] = False | |
| st.session_state['article_text_list'] = [] | |
| st.session_state['article_url_list'] = [] | |
| if st.button('最新ニュース取得'): | |
| with st.spinner('ニュースを取得中...'): | |
| # yahooニュースをスクレイピング | |
| scraper = YahooNewsScraper() | |
| article_text_list = [] | |
| article_url_list = [] | |
| for i in range(num_news): | |
| article_text, detail_url = scraper.scrape_article(i) | |
| article_text_list.append(article_text) | |
| article_url_list.append(detail_url) | |
| st.session_state['news_fetched'] = True # 処理完了フラグを設定 | |
| st.session_state['article_text_list'] = article_text_list # セッションステートに保存 | |
| st.session_state['article_url_list'] = article_url_list | |
| st.write("取得完了しました") | |
| if st.session_state['news_fetched']: | |
| search_word = st.text_input('名詞', placeholder='名詞を入力してください', max_chars=10, help='10文字以内の名詞') | |
| if st.button('要約作成'): | |
| if search_word.strip() == '': | |
| st.error('名詞を入力してください。') | |
| elif len(search_word) > 10: | |
| st.error('名詞は10文字以内で入力してください。') | |
| else: | |
| with st.spinner('ニュースの要約を作成中...'): | |
| article_text_list = st.session_state['article_text_list'] | |
| article_url_list = st.session_state['article_url_list'] | |
| try: | |
| for temp_article_text, temp_article_url in zip(article_text_list, article_url_list): | |
| # TF-IDF値を計算 | |
| vectorizer = JapaneseTextVectorizer() | |
| tfidf_dict = vectorizer.fit_transform(temp_article_text) | |
| # cos類似度を計算 | |
| word_similarity = CosineSimilarityCalculator() | |
| article_keyword_list = list(tfidf_dict.keys()) | |
| result_word_similarity = word_similarity.calculate_similarity(search_word, article_keyword_list) | |
| if result_word_similarity is None: | |
| raise ValueError("単語の類似度を計算できませんでした。名詞を変更して再度試してください。") | |
| # cos類似度の計算結果 | |
| filtered_data = {k: v for k, v in result_word_similarity.items() if v is not None} | |
| # 最大値を持つキーとその値を取得 | |
| if filtered_data: # filtered_dataが空でないことを確認 | |
| max_word = max(filtered_data, key=filtered_data.get) | |
| max_value = filtered_data[max_word] | |
| # 最大値がこれまでの最大値より大きければ更新 | |
| if max_value > best_max_value: | |
| best_max_value = max_value | |
| best_max_word = max_word | |
| best_article_text = temp_article_text | |
| best_article_url = temp_article_url | |
| is_similarity_computed = True # 類似度が計算されていれば、フラグをTrueにする | |
| # テキストを要約 | |
| summarizer = TextSummarizer() | |
| summary_text = summarizer.summarize(best_article_text, max_length=40, min_length=20) | |
| st.write(f'最も類似度が高いワードは「{best_max_word}」でした') | |
| st.write(f'url:{best_article_url}') | |
| st.text_area("要約:", summary_text, height=20) | |
| except ValueError as ve: | |
| st.error(f"エラー: {ve.args[0]}") | |