File size: 4,440 Bytes
a08962e
 
 
c83d422
a08962e
 
 
a7b12c0
a08962e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
230209e
 
 
 
 
 
 
 
 
 
a08962e
230209e
 
 
a08962e
230209e
 
 
 
a08962e
230209e
a7b12c0
a08962e
a7b12c0
230209e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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]}")