โข ์ฃผ๋ฅ ์ ์ฑ ๋ด์ค ๊ฐ์ฑ์ง์ + ์ฝํผ์ค ํ๋น์ฑ ๊ฒ์ฆยถ
๋ค์ด๋ฒ ๋ด์ค ํฌ๋กค๋ง(์์ฒด). ์ฃผ์: ์ข ๊ฐ์ธยท์ข ๋์ธ๋ ์ฃผ๋ฅ ์ ์ฉ ์ฉ์ด๊ฐ ์๋๋ค(๋ด๋ฐฐยท์ ๋ฅ์๋ ์ฌ์ฉ). ๋ฐ๋ผ์ ์ฝํผ์ค๊ฐ ์ค์ ์ฃผ๋ฅ๋ฅผ ๋ค๋ฃจ๋์ง ๋จผ์ ๊ฒ์ฆํ๋ค.
Inย [1]:
import csv, os, re
from collections import defaultdict, Counter
P=r"D:\Project\2026_2\์ฃผ๋ฅ์ธ"; OUT=os.path.join(P,"data")
ALC=re.compile("์ฃผ๋ฅ|์ฃผ์ธ|์ ๊ฐ|์ ์ง|์์ฃผ|๋งฅ์ฃผ|์์คํค|๋ง๊ฑธ๋ฆฌ|์์ฃผ|์์ธ|์ ํต์ฃผ|์ฃผ์ |ํ์ด๋ณผ|์ฆ๋ฅ์ฃผ|ํ์ฃผ|์ฒญ์ฃผ|์ฌ์ผ|๊ณ ๋์ฃผ|๋ณด๋์นด|๋ฆฌํ๋ฅด|์๋งฅ์ฃผ|์์ ๋งฅ์ฃผ|์ฃผ๋ฅ์
|์์กฐ|์ฃผ์กฐ|์์ฃผ|K-์ฃผ๋ฅ|K์ฃผ๋ฅ|์ฃผ์ ")
NONALC=re.compile("์ฐ๋ ๊ธฐ|๋ดํฌ|์ข
๋์ |๋ด๋ฐฐ|์ ๋ฅ|ํ๋ฐ์ |๊ฒฝ์ |ํ์|๋ฐฐ์ถ|์ ๊ธฐ์๊ธ|์๋|ํ๋ฐฐ|์ฐํธ")
๊ฒ์ฆ โ "์ข ๋์ธ" 5,563๊ฑด ์ค ์ค์ ์ฃผ๋ฅ ๋น์จยถ
Inย [2]:
fp=os.path.join(P,"newswork","out","articles_์ข
๋์ธ.csv")
tot=alc=non=amb=0
with open(fp,encoding="utf-8-sig") as f:
for row in csv.DictReader(f):
t=row["title"]; tot+=1
if ALC.search(t): alc+=1
elif NONALC.search(t): non+=1
else: amb+=1
print(f"์ด {tot} | ์ฃผ๋ฅ {alc}({alc/tot*100:.1f}%) | ๋น์ฃผ๋ฅ {non}({non/tot*100:.1f}%) | ๋ชจํธ {amb}({amb/tot*100:.1f}%)")
print("โ 76.8%๋ง ์ฃผ๋ฅ. ๋ด๋ฐฐ ์ข
๋์ธยท๊ฒฝ์ ์ธ ๋ฑ ํผ์
โ ์ฃผ๋ฅ ํค์๋ ๊ธฐ์ฌ๋ง์ผ๋ก ๊ฐ์ฑ์ง์ ์ฐ์ถ.")
๊ฐ์ฑ ๋ถ๋ฅ (์ฃผ๋ฅ ๊ธฐ์ฌ ํ์ , ์ฐ์ ์งํฅ๊ด์ ์ฌ์ )ยถ
Inย [3]:
POS=["ํ์ฑํ","์ก์ฑ","์ง์","์ํ","์์ถ","๊ฒฝ์๋ ฅ","๋ฐ๊ฐ","์ฑ์ฅ","ํ๋","์งํฅ","ํ๋ฆฌ๋ฏธ์","์์ ","์ธ๊ณํ","ํธํฉ","ํฅํ","์ธ๊ธฐ","๋ํ","์ดํ","๋์ฝ","๊ฒฝ๊ฐ","ํํ","๊ธฐ๋","ํํ","์ํ","K-์ฃผ๋ฅ","K์ฃผ๋ฅ","ํ๋ฅ","์ ์ ","์ฐ์","๊ฐ๋ฐ","ํฌ์","์ ์ ํ","์ถ์","์ด๋ฆฐ๋ค","์จํต","๋ฎ์ถ๋ค","์ธํ"]
NEG=["๊ท์ ","์ฐ๋ ค","๋
ผ๋","์ธ์","์ฒญ์๋
","ํํด","ํ๊ฒฉ","์์ถ","๋ฐ๋","๊ธ์ง","๊ฒฝ๊ณ ","์ค๋
","์ฌ๋ง","๊ฐ์ง","๊ผผ์","๋นํ","์ญํ","์นจ์ฒด","๋ถ์ง","๋ฐ๋ฐ","๋ถ๋ด","๋
ผ์","์ ๋","๋ฐ๋ชฉ","์ญ์ฐจ๋ณ","ํํ์ฑ","ํ์ธ","์ ๊ฐ ์ธ์","์์ฃผ๊ฐ ์ธ์","๊ฐ๊ฒฉ ์ธ์","๊ฐ ์ค๋ฅด","๊ฐ ์ธ์","์ค๋ฅด๋","์ค๋ฅธ๋ค","ํ์ง","๋ฌด์ฐ","์คํจ"]
rP=re.compile("|".join(map(re.escape,POS))); rN=re.compile("|".join(map(re.escape,NEG)))
yr=defaultdict(lambda:[0,0,0])
with open(fp,encoding="utf-8-sig") as f:
for row in csv.DictReader(f):
t=row["title"]; d=row["date"]
if len(d)<6 or not ALC.search(t): continue
p=len(rP.findall(t)); n=len(rN.findall(t)); lab=1 if p>n else -1 if n>p else 0
yr[d[:4]][{1:0,-1:1,0:2}[lab]]+=1
import pandas as pd
rows=[{"year":y,"net_pct":round((v[0]-v[1])/sum(v)*100,1),"n":sum(v)} for y,v in sorted(yr.items())]
sent=pd.DataFrame(rows); sent
Out[3]:
์๊ณ์ด ์๊ฐํยถ
Inย [4]:
import matplotlib, matplotlib.pyplot as plt
from matplotlib import font_manager as fm
fm.fontManager.addfont(r"C:\Windows\Fonts\malgun.ttf"); plt.rcParams["font.family"]=fm.FontProperties(fname=r"C:\Windows\Fonts\malgun.ttf").get_name()
plt.rcParams["axes.unicode_minus"]=False
fig,ax=plt.subplots(figsize=(10,4))
ax.bar(sent.year.astype(str),sent.net_pct,color=["#2f7d32" if v>=0 else "#c0392b" for v in sent.net_pct],alpha=.85)
ax.axhline(0,color="#888",lw=.8); ax.set_title("์ฃผ๋ฅ ์ ์ฑ
๋ด์ค ์๊ฐ์ฑ์ง์(์ฃผ๋ฅ๊ธฐ์ฌ๋ง, n=4,172)"); ax.set_ylabel("(๊ธ์ -๋ถ์ )/์ ์ฒด %")
plt.tight_layout(); plt.show()
์ ์ฑ ์ ์ฐฝ: 2020 ์ข ๋์ธ ์ํ +45% ์ ์ โ 2022~23 ์์ฃผ๊ฐยท๊ฐ์ ์ ํ๊ธฐ โ13~โ19% โ 2024~25 ํ๋ณต(+5%ยท+22%). ์ฝํผ์ค ์ค์ผ(๋ด๋ฐฐยท์ ๋ฅ)์ ์ ๊ฑฐํ๋ ์ต๊ทผ ํ๋ณต ์ ํธ๊ฐ ์ ๋ช ํด์ก๋ค.