웹개발/웹 크롤링

텍스트 감성분석 자료조사 - 1일차

스마트코더91 2024. 2. 18. 20:49

결과 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 적용은 우선 보류하였다.

찾아보고 나니 유료일 중이야... OTL

 

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 버전을 다운로드 받는다.

https://jdk.java.net/archive/

 

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를 사용해야할 듯 하다.