news_summarizer / app.py
Kota Takahashi
コメント文を変更
a7b12c0
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]}")