820nam commited on
Commit
bfd4ab7
ยท
verified ยท
1 Parent(s): b726836

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +102 -0
app.py ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import requests
4
+ from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
5
+
6
+ # ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ ๋กœ๋“œ
7
+ @st.cache_resource
8
+ def load_model():
9
+ model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
10
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
11
+ model = AutoModelForSequenceClassification.from_pretrained(model_name)
12
+ return pipeline("text-classification", model=model, tokenizer=tokenizer)
13
+
14
+ # ๋„ค์ด๋ฒ„ ๋‰ด์Šค API ํ˜ธ์ถœ
15
+ def fetch_naver_news(query, display=5):
16
+ url = "https://openapi.naver.com/v1/search/news.json"
17
+ headers = {
18
+ "X-Naver-Client-Id": "YOUR_CLIENT_ID",
19
+ "X-Naver-Client-Secret": "YOUR_CLIENT_SECRET",
20
+ }
21
+ params = {"query": query, "display": display, "sort": "sim"}
22
+ response = requests.get(url, headers=headers, params=params)
23
+ response.raise_for_status()
24
+ return response.json()
25
+
26
+ # ์ •์น˜ ์„ฑํ–ฅ ๋ถ„๋ฅ˜
27
+ def classify_sentiment(text, classifier):
28
+ result = classifier(text, truncation=True, max_length=512)
29
+ label = result[0]['label']
30
+ score = result[0]['score']
31
+ if label in ['LABEL_0', 'LABEL_1']:
32
+ return "๋ณด์ˆ˜", score
33
+ elif label in ['LABEL_4']:
34
+ return "์ง„๋ณด", score
35
+ else:
36
+ return "์ค‘๋ฆฝ", score
37
+
38
+ # ๋‰ด์Šค ๋ฐ์ดํ„ฐ ๋ถ„์„
39
+ def analyze_news(news_items, classifier):
40
+ results = {"์ง„๋ณด": 0, "๋ณด์ˆ˜": 0, "์ค‘๋ฆฝ": 0}
41
+ detailed_results = []
42
+
43
+ for item in news_items:
44
+ title = item["title"]
45
+ description = item["description"]
46
+ link = item["link"]
47
+ combined_text = f"{title}. {description}"
48
+
49
+ # ์ •์น˜ ์„ฑํ–ฅ ๋ถ„๋ฅ˜
50
+ orientation, score = classify_sentiment(combined_text, classifier)
51
+ results[orientation] += 1
52
+ detailed_results.append({
53
+ "์ œ๋ชฉ": title,
54
+ "์š”์•ฝ": description,
55
+ "๋งํฌ": link,
56
+ "์„ฑํ–ฅ": orientation,
57
+ "์ ์ˆ˜": score,
58
+ })
59
+
60
+ return results, detailed_results
61
+
62
+ # Streamlit ์•ฑ ์‹œ์ž‘
63
+ st.title("์ •์น˜ ์„ฑํ–ฅ ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ")
64
+ st.markdown("### ๋„ค์ด๋ฒ„ ๋‰ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ˆ˜์ง‘ํ•˜๊ณ  ์ •์น˜ ์„ฑํ–ฅ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.")
65
+
66
+ # ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ ์ž…๋ ฅ
67
+ query = st.text_input("๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”", value="์ •์น˜")
68
+
69
+ if st.button("๋ถ„์„ ์‹œ์ž‘"):
70
+ with st.spinner("๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ ์ค‘์ž…๋‹ˆ๋‹ค..."):
71
+ try:
72
+ # ๋„ค์ด๋ฒ„ ๋‰ด์Šค ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
73
+ news_data = fetch_naver_news(query, display=10)
74
+ news_items = news_data["items"]
75
+
76
+ # ๋ชจ๋ธ ๋กœ๋“œ
77
+ classifier = load_model()
78
+
79
+ # ๋‰ด์Šค ๋ฐ์ดํ„ฐ ๋ถ„์„
80
+ results, detailed_results = analyze_news(news_items, classifier)
81
+
82
+ # ๋ถ„์„ ๊ฒฐ๊ณผ ์‹œ๊ฐํ™”
83
+ st.subheader("๋ถ„์„ ๊ฒฐ๊ณผ ์š”์•ฝ")
84
+ st.write(f"์ง„๋ณด: {results['์ง„๋ณด']}๊ฑด")
85
+ st.write(f"๋ณด์ˆ˜: {results['๋ณด์ˆ˜']}๊ฑด")
86
+ st.write(f"์ค‘๋ฆฝ: {results['์ค‘๋ฆฝ']}๊ฑด")
87
+
88
+ # ํŒŒ์ด ์ฐจํŠธ
89
+ st.subheader("์„ฑํ–ฅ ๋ถ„ํฌ ์ฐจํŠธ")
90
+ st.bar_chart(pd.DataFrame.from_dict(results, orient='index', columns=["๊ฑด์ˆ˜"]))
91
+
92
+ # ์„ธ๋ถ€ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
93
+ st.subheader("์„ธ๋ถ€ ๊ฒฐ๊ณผ")
94
+ df = pd.DataFrame(detailed_results)
95
+ st.dataframe(df)
96
+
97
+ # ๋งํฌ ํฌํ•จํ•œ ๋‰ด์Šค ์ถœ๋ ฅ
98
+ st.subheader("๋‰ด์Šค ๋งํฌ")
99
+ for index, row in df.iterrows():
100
+ st.write(f"- [{row['์ œ๋ชฉ']}]({row['๋งํฌ']}) (์„ฑํ–ฅ: {row['์„ฑํ–ฅ']}, ์ ์ˆ˜: {row['์ ์ˆ˜']:.2f})")
101
+ except Exception as e:
102
+ st.error(f"์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}")