텍스트 감성분석 자료조사 - 1일차
결과 3줄 요약
- textblob 패키지는 "영문 텍스트" 감성 분석이 가능하고 "한글 텍스트" 감성 분석은 지원하지 않는다.
- 이를 위해 영문->한글 번역 후 감성 분석을 진행하기 위해 Google Translate API를 사용해보려 했으나 "유료 서비스"라 적용을 보류하였다.
- 한국어 자연어 처리를 지원하는 konlpy 패키지를 사용해 보았고 형태소 분리는 되었으나 긍정적, 부정적 평가를 비교할 "감성 사전" 을 제공하는 API, 사이트를 찾지 못해 보류 중이다.
참고 블로그 링크
https://anpigon.tistory.com/92
스파르타 강의평가 웹 크롤링 서비스를 구현하기 위해서 사용자의 블로그의 포스팅한 텍스트 데이터를 크롤링한 후 긍정적, 부정적 평가를 분류하는 기능을 구현하려고 한다.
이를 '감성 분석'이라고 하는데 textblob 모듈은 관련 기능을 제공한다.
설치 및 예제 실행
다음 명령어를 통해 textblob 패키지를 설치한다.
pip install textblob
다음과 같은 예제를 실행하여 어떤 결과가 출력되는지 확인한다.
from textblob import TextBlob
text = '좋다 유익하다 도움이된다 별로다'
blob = TextBlob(text)
# 긍정적, 부정적 평가를 분석
sentiment = blob.sentiment
print('긍정적 평가:', sentiment.polarity)
print('부정적 평가:', sentiment.subjectivity)
다음과 같이 0.0으로 각각 출력된다.
긍정적 평가: 0.0
부정적 평가: 0.0
영어로 text를 바꿔서 출력해본다.
# text = '좋다 유익하다 도움이된다 별로다'
text = 'Good. Beneficial. Helpful. Not good'
영문은 결과가 출력된다. 단순히 textblob을 설치하는 것만으로는 한글이 지원되지 않는 것으로 보인다.
긍정적 평가: 5.551115123125783e-17
부정적 평가: 0.6333333333333333
한글 버전 설치
위의 참고 블로그 링크 및 ChatGPT에서는 TextBlob.translate, TextBlob.detect_language가 함수를 예제로 사용하는데 버전별 변경 로그를 보면 deprecated되었다고 확인할 수 있다.
https://textblob.readthedocs.io/en/dev/changelog.html
이에 Google Translate API의 사용법을 선행하였다.
Google Translate API 설정
이를 위해 ChatGPT를 통해 Google Translate API를 통해 텍스트의 국가를 확인하는 예제코드를 요청하였다.
from google.cloud import translate_v2 as translate
# Google Cloud Platform에서 생성한 프로젝트 ID
project_id = 'your-project-id'
# 서비스 계정 키 파일의 경로
key_file_path = 'path/to/your/service-account-key.json'
# Google Translate API 클라이언트 생성
client = translate.Client.from_service_account_json(key_file_path)
# 텍스트
text = 'Good. Beneficial. Helpful. Bad'
# 텍스트의 언어 감지
result = client.detect_language(text)
# 언어 코드
language_code = result['language']
# 언어 이름
language_name = result['language_name']
print('언어 코드:', language_code)
print('언어 이름:', language_name)
먼저 Google Cloud Platform에서 프로젝트 ID를 생성해야한다. Google Cloud에서 새 프로젝트를 생성하였다.
프로젝트 생성 시 프로젝트 ID가 있는데 해당 아이디를 사용한다.
이제 서비스 계정 키 파일의 경로가 필요하다. IAM 및 관리-> 서비스 계정으로 이동한 후 "서비스 계정 만들기"를 클릭한다.
서비스 계정을 생성하면 해당 계정을 선택한다.
키 항목에서 "새 키 만들기"를 선택한다.
새 키가 생성되고 포맷 선택 시 다음과 같이 json 파일로 다운로드 된다. 프로젝트의 폴더로 복사한다.
해당 서비스 계정에 라이버러리를 등록하도록 한다. API 및 서비스->라이브러리 로 이동한다.
"Cload Translation API"를 선택한다.
문제는 해당 API가 유료 라는점이다. 간단하게 보여줄 프로젝트에 유료 API를 넣는 것은 시기 상조이기에 Google Translation API 적용은 우선 보류하였다.
TextBlob 구버전 설치
0.16.0 버전부터 TextBlob.detect_language가 없어졌다고하니 0.15.3 버전을 설치해본다. 우선 textblob 패키지를 제거한다.
pip uninstall textblob
0.15.3 버전을 설치한다.
pip install textblob==0.15.3
다음 코드를 실행한다.
en_text = 'Good. Beneficial. Helpful. Bad'
blob = TextBlob(en_text)
lang_code = blob.detect_language()
print('code:', lang_code)
안타깝게도 역시 실패한다. 함수 설명을 보니 내부적으로 Google Translate API를 사용하는 것 같다. 그 사이 Google 정책이 바뀌어 더 이상 사용할 수 없는 것으로 보인다.
KoNLPy 조사
Google Translate API에 대한 의존 이슈로 "한국어" 감정 분석을 사용하는 것이 어려운 상황이다. 한국어 자연어 처리 패키지인 KoNLPy 를 사용하여 감정 분석이 가능한지 여부를 파악한다.
먼저 konlpy 패키지를 설치한다.
pip install konlpy
Kkma 형태소 분석기를 사용하여 형태소 단위로 분리한 후 출력한다.
from konlpy.tag import Kkma
kkma = Kkma()
text = '안녕하세요. 반가워요.'
morphs = kkma.morphs(text)
print(morphs)
해당 코드는 다음과 같은 에러 메시지를 출력하며 실패한다.
Error
Traceback (most recent call last):
File "/Users/sang-il/Desktop/workspace/03_bootcamp/06_teamproject/SpartaCralwer/test/test_textblob.py", line 25, in test_konlpy
kkma = Kkma()
^^^^^^
File "/Users/sang-il/Desktop/workspace/03_bootcamp/06_teamproject/SpartaCralwer/venv/lib/python3.11/site-packages/konlpy/tag/_kkma.py", line 44, in __init__
jvm.init_jvm(jvmpath, max_heap_size)
...
File "/Users/sang-il/Desktop/workspace/03_bootcamp/06_teamproject/SpartaCralwer/venv/lib/python3.11/site-packages/jpype/_jvmfinder.py", line 212, in get_jvm_path
raise JVMNotFoundException("No JVM shared library file ({0}) "
jpype._jvmfinder.JVMNotFoundException: No JVM shared library file (libjli.dylib) found. Try setting up the JAVA_HOME environment variable properly.
macOS JVM 설치 및 경로 설정
jvm을 초기화하는 과정에서 실패하는 것으로 보인다. jvm을 설치하고 JAVA_HOME 경로를 설정해주어야 한다. 뭔가 의존하는 부분이 많아지는 것 같은데 추후에 Docker를 사용하여 컨테이너로 관리할 필요가 있어보인다.
우선은 mac에 jvm을 설치하고 환경변수를 설정한다. 다음 링크에서 21.0.1 버전을 다운로드 받는다.
Archived OpenJDK GA Releases
Archived OpenJDK General-Availability Releases This page is an archive of previously released builds of the JDK licensed under the GNU General Public License, version 2, with Classpath Exception. WARNING: These older versions of the JDK are provided to he
jdk.java.net
"/Users/sang-il/Desktop/config/jvm" 위치에 해당 압축파일을 다운 및 해제한다.
tar -xvf openjdk-21.0.1_macos-x64_bin.tar.gz
압축 해제한 디렉토리로 이동한다.
cd jdk-21.0.1.jdk
"~/.zshrc"를 다음과 같이 편집한다.
export JAVA_HOME=/Users/sang-il/Desktop/config/jvm/jdk-21.0.1.jdk
이후 변경사항을 적용한다.
source ~/.zshrc
다시 Kkma 패키지 코드를 실행해보니 다음과 같은 에러메시지를 출력한다.
File "/Users/sang-il/Desktop/workspace/03_bootcamp/06_teamproject/SpartaCralwer/test/test_textblob.py", line 25, in test_konlpy
kkma = Kkma()
^^^^^^
File "/Users/sang-il/Desktop/workspace/03_bootcamp/06_teamproject/SpartaCralwer/venv/lib/python3.11/site-packages/konlpy/tag/_kkma.py", line 44, in __init__
jvm.init_jvm(jvmpath, max_heap_size)
File "/Users/sang-il/Desktop/workspace/03_bootcamp/06_teamproject/SpartaCralwer/venv/lib/python3.11/site-packages/konlpy/jvm.py", line 64, in init_jvm
jpype.startJVM(jvmpath, '-Dfile.encoding=UTF8',
File "/Users/sang-il/Desktop/workspace/03_bootcamp/06_teamproject/SpartaCralwer/venv/lib/python3.11/site-packages/jpype/_core.py", line 247, in startJVM
_jpype.startup(jvmpath, jvmargs + extra_jvm_args,
FileNotFoundError: [Errno 2] JVM DLL not found: /Users/sang-il/Desktop/config/jvm/jdk-21.0.1.jdk/Contents/Home/lib/libjli.dyli
JVM DLL이 없다고 나온다. 분명 JVM 경로를 설정했는데 이상한 부분이다.
다음 블로그를 참조하여 jdk를 다시 설치한다.
https://jongsky.tistory.com/22
M1 OSError: [Errno 0] JVM DLL not found 에러 해결방법
1. 글을 작성하게 된 계기 m1 mac을 사용하면서 해당 에러를 만났을 때 다시 한번 볼 수 있고 나와 같은 오류를 가진 사람들에게 도움이 되었으면 한다. (m1을 사용하면서 apple에게 조금은 화가 나고
jongsky.tistory.com
공식 홈페이지에서 JDK 17을 다운로드한다. 현재 macOS의 아키텍처는 ARM64이므로 해당 파일을 다운 받는다.
https://www.oracle.com/kr/java/technologies/downloads/#jdk17-mac
Download the Latest Java LTS Free
Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.
www.oracle.com
다운 받은 후 해당 파일을 같은 경로에 압축을 푼 후 "~/.zshrc" 파일을 수정 후 반영한다.
export JAVA_HOME=/Users/sang-il/Desktop/config/jvm/jdk-17.0.10.jdk
source ~/.zshrc
이제 다시 python 코드를 실행하니 정상적으로 동작하며 다음과 같이 출력된다.
from konlpy.tag import Kkma
kkma = Kkma()
text = '안녕하세요. 반가워요.'
morphs = kkma.morphs(text)
print(morphs)
['안녕', '하', '세요', '.', '반갑', '어요', '.']
드디어 Kkma 패키지를 사용할 수 있게 되었다.
다시 KoNLPy 라이브러리 탐방 - TODO...
초기 설정이 어느정도 되었으니 이제 감성 사전을 사용하여 분리된 형태소의 감정을 분석해야한다. 문제는 감성사전을 찾아야하는데 한국어 감성사전을 쉽게 찾을 수 없었다. 영문은 nltk 패키지의 nltk.corpus.opinion_lexicon을 사용하여 감성 사전에 접근할 수 있었다. 그러나 한국어는 https://github.com/mrlee23/KoreanSentimentAnalyzer 프로젝트에서 참고한 http://word.snu.ac.kr/kosac 사이트를 접근했으나 연결이 되지 않았다.
여러군데를 조사해봤지만 공식적이거나 많은 사람들이 사용하는 데이터 센터는 찾지 못한 상태이다. 프로젝트를 진지하게 진행해보기 위해서는 비용을 지불하여 Google Translate API를 사용해야할 듯 하다.