
이번엔 대충 라이브러리는 깔려 있으니 바로 진행해 보는것으로 하겠다.
1. 요구사항 분석 및 설계 수정
- 추가기능을 조금 수정. 그날 날짜, 기분 생각을 입력하면, 그 감정까지 함께 저장하는 형태로 진행
- matplotlib로 주간 감정 변화 시각화부분이 있으므로 UI 추가
- PyQt를 쓰기 귀찮으므로 tikinter사용
- 현재까지 저장된 기록들을 리스트로 좌측에 표시
- 별도 날짜 입력 추가 (Defaut : 오늘 날짜)
- 기준시 : KST
- 추가로 디렉토리txt파일을 기반으로 좌측에 리스트를 추가. 우측에 해당 내용이 나오도록 수정.
2. 기본 기능 작성
from textblob import TextBlob
text = "비가와서 허리가 아프다. 기분이 별로 좋지않다."
blob = TextBlob(text)
sentiment = blob.sentiment
print(sentiment)

과거에는 textblob에서 다국어 지원을 해줫던 것 같지만, 더이상 지원되지 않는다고한다. 대신 구글 번역 API를 사용하라고 공식 문서에 기재되어 있다.
https://textblob.readthedocs.io/en/dev/changelog.html
근데 이 API는 유료이다. 나는 쌀먹개발자이니 마지막 버전인 0.15.3버전으로 내려서 사용하려 했으나, 이것도 내부적으로 해당 api를 사용하는지 막혔다. 그래서 라이브러리를 KoNLPy로 변경하려고 알아보니, 내환경(실리콘 맥)에서는 호환문제가 좀 있는것 같아서, kiwipiepy를 사용하기로 결정
from kiwipiepy import Kiwi
kiwi = Kiwi()
text = "비가와서 허리가 아프다. 기분이 별로 좋지않다."
kiwikiwi = kiwi.tokenize(text);
print(kiwikiwi)

아무튼 잘 나오는것 같다.
좀 쓸만한듯? 하다.
https://bab2min.github.io/kiwipiepy/v0.21.0/kr/
kiwipiepy API documentation (v0.21.0)
Package kiwipiepy Kiwipiepy란? Kiwipiepy는 한국어 형태소 분석기인 Kiwi(Korean Intelligent Word Identifier)의 Python 모듈입니다. C++로 작성되었고 다른 패키지에 의존성이 없으므로 C++ 컴파일이 가능한 환경이라
bab2min.github.io
from kiwipiepy import Kiwi
kiwi = Kiwi()
positive_words = {"좋다", "좋아", "좋은",
"행복", "성공",
"기쁘", "기쁜",
"즐거", "즐겁", "즐기", "즐길"}
negative_words = {"싫다", "싫어", "싫은",
"슬프", "슬퍼", "슬픈",
"화가난", "화나", "화난"
"아픈", "아프", "아파", "아프",
"좋지"}
text = "비가와서 허리가 아프다. 기분이 별로 좋지않다."
def analyze_sentiment(input):
tokens = [token.form for token in kiwi.tokenize(input)]
score = 0
for token in tokens:
if token in positive_words:
score += 1
elif token in negative_words:
score -= 1
if(score > 0):
return ["😀", score]
elif(score < 0):
return ["😠", score]
else:
return ["😑", score]
print(analyze_sentiment(text))
코드를 수정해서 다시 실행해 보았다.

예상 점수는 -2였는데 -1로 나오는걸 보니 아무래도 끊을수 있는건 다 토큰화 해서 그런지 '좋지않다' 같은걸 제대로 인식하지 못하는것 같다.
아무튼 이대로 진행. 일단 작동은 하니 점수 산정부분은 나중에 따로 수정해보는것으로 한다.
3. 입력 및 텍스트 저장
앞서 했던 말햇던 것 처럼 날짜, 일기, 기분까지 텍스트로 저장할 것이다. 이왕 스코어가 있는김에 오늘의 감정 점수도 추가해 보기로 한다.
일단 입력받기.
두번 받는데 날짜, 내용을 받을것이다. 날짜가 제대로 양식맞춰 들어오지 않는다면 다시받는거로 한다. 이쯤부터 UI작성으로 변경하면 될 것 같다. 일단은 디폴트 날짜 설정 및 파일저장부분부터 만든다.
from datetime import datetime, timezone, timedelta
import json
# datetime
KST = timezone(timedelta(hours=9))
diaryDate = datetime.now(KST).strftime("%Y-%m-%d")
#file save
def save_sentiment(time, diary, sentiment, score):
diaryObj={
'date' : time,
'diary' : diary,
'sentiment' : sentiment,
'score' : score }
filePath = f'Diary_{time}.json'
with open(filePath, 'w', encoding='UTF-8-sig') as f:
json.dump(diaryObj, f, ensure_ascii=False)
analyze = analyze_sentiment(text)
save_sentiment(diaryDate, text, analyze[0], analyze[1])
datetime 은 미리 kst로 두고, 파일 저장할 때 같이 저장한다.
파일명은 Diary_해당 날짜.json으로 했다. text보다 ui환경에 띄울때 용이하기 때문에txt에서 json으로 저장하는거로 수정. 그리고 인코딩이 깨질 수 있기 때문에 인코딩을 설정하고, ascii옵션을 비활성화 해 둔다.

제대로 저장되는것을 확인할 수 있다.
⚠️긴급 중단
현재 mac OS 26.0 베타를 사용중인데, 커널어 뭔가 문제가 있는것 같다. 커널버전과 mac os버전이 맞지 않아서, 패키지에서 충돌이 나고 있는 상황. 몇가지 방법을 시도 하였으나. 일단 ui를 제외한 기능들은 완성되었으니, 여기서 중단키로 한다.
5. 총평
사실 베타 os에서 커널 버전때문에 문제가 생기리라고는 상상하지 못했다. 생각보다 한국어 관련 라이브러리가 꽤 된다는게 신기... 앞으로 계속 발전되어서 더 많고, 호환성 높은 라이브러리들이 생기면 좋겠다.
'1일 1앱 챌린지' 카테고리의 다른 글
| [1일 1앱 챌린지] 1일차 Rust 텍스트 단어 빈도 분석기 (0) | 2025.09.02 |
|---|