Update app.py
Browse files
app.py
CHANGED
@@ -1,53 +1,78 @@
|
|
1 |
import streamlit as st
|
2 |
from transformers import pipeline
|
3 |
|
4 |
-
#
|
|
|
|
|
5 |
topic_classifier = pipeline(
|
6 |
"zero-shot-classification",
|
7 |
-
model="joeddav/xlm-roberta-large-xnli" # 다국어 지원
|
8 |
)
|
9 |
|
10 |
-
#
|
|
|
|
|
11 |
sentiment_analyzer = pipeline(
|
12 |
"sentiment-analysis",
|
13 |
model="monologg/koelectra-base-finetuned-nsmc"
|
14 |
)
|
15 |
|
16 |
-
#
|
17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
-
|
|
|
|
|
|
|
20 |
|
21 |
st.write("""
|
22 |
-
|
23 |
-
|
24 |
-
-
|
|
|
|
|
25 |
""")
|
26 |
|
27 |
-
|
28 |
-
input_text = st.text_area("텍스트 입력", max_chars=5000, height=300)
|
29 |
|
30 |
if st.button("분석하기"):
|
31 |
-
|
32 |
-
|
|
|
33 |
else:
|
34 |
# 1) Zero-Shot 분류
|
35 |
topic_result = topic_classifier(
|
36 |
-
|
37 |
topic_labels,
|
38 |
-
truncation=True #
|
39 |
)
|
|
|
40 |
pred_topic = topic_result["labels"][0]
|
41 |
topic_score = topic_result["scores"][0]
|
42 |
|
43 |
# 2) 감성분석
|
44 |
-
sent_result = sentiment_analyzer(
|
45 |
-
sent_label = sent_result[0]["label"]
|
46 |
sent_score = sent_result[0]["score"]
|
47 |
|
48 |
st.subheader("분석 결과")
|
49 |
-
st.write(f"
|
50 |
-
st.write(f"
|
51 |
-
|
52 |
-
st.success("분석 완료!")
|
53 |
-
|
|
|
1 |
import streamlit as st
|
2 |
from transformers import pipeline
|
3 |
|
4 |
+
# -----------------------------
|
5 |
+
# 1) Zero-Shot 분류 모델 준비
|
6 |
+
# -----------------------------
|
7 |
topic_classifier = pipeline(
|
8 |
"zero-shot-classification",
|
9 |
+
model="joeddav/xlm-roberta-large-xnli" # 다국어 지원 모델
|
10 |
)
|
11 |
|
12 |
+
# -----------------------------
|
13 |
+
# 2) 감성분석 모델 준비
|
14 |
+
# -----------------------------
|
15 |
sentiment_analyzer = pipeline(
|
16 |
"sentiment-analysis",
|
17 |
model="monologg/koelectra-base-finetuned-nsmc"
|
18 |
)
|
19 |
|
20 |
+
# -----------------------------
|
21 |
+
# 3) 세분화 라벨 정의
|
22 |
+
# -----------------------------
|
23 |
+
topic_labels = [
|
24 |
+
"근무환경-설비장비",
|
25 |
+
"근무환경-휴게소음",
|
26 |
+
"근무환경-안전",
|
27 |
+
"복리후생-수당보상",
|
28 |
+
"복리후생-교통셔틀",
|
29 |
+
"복리후생-기숙사숙소",
|
30 |
+
"조직문화-대인관계갈등",
|
31 |
+
"조직문화-언어매너",
|
32 |
+
"조직문화-사기스트레스",
|
33 |
+
"인원충원",
|
34 |
+
"근태관리",
|
35 |
+
"장비물자-작업복",
|
36 |
+
"장비물자-언더웨어",
|
37 |
+
"기타"
|
38 |
+
]
|
39 |
|
40 |
+
# -----------------------------
|
41 |
+
# 4) 스트림릿 UI
|
42 |
+
# -----------------------------
|
43 |
+
st.title("익명게시판 이슈분석 (세분화 주제 + 감성)")
|
44 |
|
45 |
st.write("""
|
46 |
+
**한 번에 글 하나씩** 아래 칸에 붙여넣고, "분석하기" 버튼을 누르세요.
|
47 |
+
|
48 |
+
- **Zero-Shot 분류**: 근무환경, 복리후생, 조직문화, 인원충원... 등 세분화
|
49 |
+
- **감성분석**: 긍정(positive) vs 부정(negative)
|
50 |
+
- 최대 약 5,000자까지 입력 가능합니다.
|
51 |
""")
|
52 |
|
53 |
+
user_input = st.text_area("본문을 입력하세요 (복사/붙여넣기)", max_chars=5000, height=250)
|
|
|
54 |
|
55 |
if st.button("분석하기"):
|
56 |
+
text = user_input.strip()
|
57 |
+
if not text:
|
58 |
+
st.warning("텍스트를 입력해주세요!")
|
59 |
else:
|
60 |
# 1) Zero-Shot 분류
|
61 |
topic_result = topic_classifier(
|
62 |
+
text,
|
63 |
topic_labels,
|
64 |
+
truncation=True # 512토큰 초과시 잘라내기
|
65 |
)
|
66 |
+
# 가장 확률 높은 라벨
|
67 |
pred_topic = topic_result["labels"][0]
|
68 |
topic_score = topic_result["scores"][0]
|
69 |
|
70 |
# 2) 감성분석
|
71 |
+
sent_result = sentiment_analyzer(text, truncation=True)
|
72 |
+
sent_label = sent_result[0]["label"] # positive/negative
|
73 |
sent_score = sent_result[0]["score"]
|
74 |
|
75 |
st.subheader("분석 결과")
|
76 |
+
st.write(f"**주제**: {pred_topic} (score={topic_score:.4f})")
|
77 |
+
st.write(f"**감성**: {sent_label} (score={sent_score:.4f})")
|
78 |
+
st.success("분석이 완료되었습니다!")
|
|
|
|