본문 바로가기
Development/AI

자연어 처리 개념 / 개발 환경 구축 / KoBERT 및 SentenceBERT 실행

by yoonsoodev 2022. 10. 2.

<개념>

1. 자연어란?

자연어(natural language)란 우리가 일상에서 사용하는 언어를 말한다. 즉, 인간이 소통하고자 할 때 사용하는 일상적인 언어를 의미한다.

 

2. 자연어처리(Natural Language Process)란?

컴퓨터가 인간의 언어를 이해, 생성, 조작할 수 있도록 해주는 인공 지능(AI)의 한 분야이다. 자연어 텍스트 또는 음성으로 데이터를 상호 연결하는 것으로 '언어 입력(language in)'이라고도 한다. 

 

3. 자연어 처리의 효용

반복 업무 자동화

챗봇과 같이 사람이 하는 수많은 반복작업들을 처리한다

 

검색 효율 향상하나의 단어에 대해 여러 의미가 존재하는 경우 문맥에 기반하여 단어의 의미를 명확히 하며, 동의어를 찾고, 형태학적 변형을 고려하여 키워드 일치 검색등의 효율을 높일 수 있다.

 

검색 엔진 최적화검색을 분석해 콘텐츠를 최적화 하여 온라인 검색 순위를 높일 수 있다.

 

대규모 문서 컬렉션 분석 및 정리문서 클러스터링 및 주제 모델링과 같은 NLP 기술을 사용하여 대량의 문서에 대해 콘텐츠 파악을 단순화 할 수 있다.

 

소셜 미디어 분석소셜 미디어의 댓글을 분석하여 방대한 양의 정보를 파악할 수 이도록 도와준다.

 

<개발환경 구축>

참조 페이지: https://wikidocs.net/50698

 

1) 아나콘다(Anaconda)와 코랩(Colab)

머신 러닝 실습을 하기 위해서는 많은 패키지가 필요합니다. 이를 일일히 설치하는 것보다는 필요한 패키지들을 모아놓은 파이썬 배포판 '아나콘다'를 설치하는 것을 권장합니다. ...

wikidocs.net

 

1. 아나콘다(Anaconda) 설치

(1) 아나콘다란? 

아나콘다는 아나콘다는 과학 연구 및 머신러닝 분야에 적합한 Python및R언어의 패키지 / 의존성 관리 및 배포를 편리하게 해주는 조건부 무료 오픈 소스패키지 관리자이름이다. Anaconda(이전: Continuum Analytics)라는 곳에서 만든 파이썬 배포판으로, 수백 개의 파이썬 패키지를 포함하고 있다.

 

(2) 사용 이유?

파이썬은 다수의 개발자들이 공동으로 개발하는 오픈소스프로젝트많고 라이브러리들이 매우 빈번하게 업데이트되기 때문에 라이브러리들간의 의존성이 매우 복잡하여 기존에 완성되어 돌아가는 코드가 오류를 발생시킬있다. 따라서 아나콘다를이용하여 라이브러리 버전들을 유지 개발 가능하도록 가상환경을 구성하는 것이 좋다.

 

(3) 설치 방법

1. 실행파일 다운로드 받기

https://www.anaconda.com/distribution/

 

Anaconda | Anaconda Distribution

Anaconda's open-source Distribution is the easiest way to perform Python/R data science and machine learning on a single machine.

www.anaconda.com

해당 사이트에서 설치를 완료하면 (그냥 단순히 Next> 누르기), 기본적인 파이썬 패키지들이 자동으로 설치된다. 

다만 텐서플로우(Tensorflow), 케라스(Keras), 젠심(Gensim), 코엔엘파이(KoNLpy)와 같은 패키지들은 별도 설치가 필요하나 이후에 설명한다.

 

2. 아나콘다 프롬프트로 패키지 업데이트 하기

아나콘다 프롬프트 열기

> conda update -n base conda
> conda update --all

해당 쉘에서 위 명령을 입력해준 후 y를 입력하여 계속 업데이트 진행해주면 된다

 

▲ 주의사항

이때, 파이썬 버전이 3.9 이상이 경우에는 텐서플로우에서 지원하지 않는다. 이럴땐 기존 파이썬 삭제 후 하단 링크로 접속하여 3.6~3.9 버전 중 아무거나 골라 다운로드 하면 된다. (윈도우 기준)

이때 PATH 길이 제한 해제(Disable path length limit) 잊지말자!

Disable path length limit 눌러주기!

 https://www.python.org/downloads/windows/

 

Python Releases for Windows

The official home of the Python Programming Language

www.python.org

 

2. 구글의 Colab

(1) 코랩(Colab)이란? 

Colaboratory(줄여서 'Colab'이라고 함)을 통해 브라우저 내에서 Python 스크립트를 작성하고 실행할 수 있다. 무료로, 브라우저 기반으로 제공되는 무료 주피터 노트북(독립실행형 웹기반 코드작성/실행지원 CMS 프로그램) 사용환경이다. Google Drive 내에서 코드를 공유하고 실행 가능하도록 한다.

 

(2) 사용 이유?

별도로 구성이 필요하지 않고, 무료로 GPU가 사용 가능하며, 간편하게 공유가 가능하다

 

(3) 이용 방법

1) 사이트 접속하기

https://colab.research.google.com/

 

Google Colaboratory

 

colab.research.google.com

2) 새노트 만들기

3) 무료로 GPU 사용하기

  i) GPU 사용 이유

  딥러닝에서는 CPU 보다는 GPU용한다. 왜냐하면, GPU 는 이러한 단순 사칙연산(행렬 곱셈 등)에 특화되어 있기 때문이다. 단순 사칙연산은 병렬화가 아주 쉽기 때문GPU 를 통해 한꺼번에 여러 코어에서 계산이 가능하다.

 ii) Colab 에서 GPU 사용하기

  a. 런타임 메뉴에서 런타임 유형 변경 클릭

  b. 하드웨어 가속기에서 GPU 클릭

 

4) 코드 작성하기

체크 부분에 해당 코드를 작성하고 동그라미 친 부분을 눌러 코드 실행이 가능하다

 

5) 실행 결과 확인

코드 실행 버튼을 누르면 하단에 위와 같이 결과가 출력된다!

 

6) 사용법 참조 링크

김태영님 블로그 : https://tykimos.github.io/2019/01/22/colab_getting_started/

동영상 링크 : https://youtu.be/inN8seMm7UI

 

<개발환경 구축 - 아나콘다 패키지 종류>

1. 아나콘다 설치 시 패키지 설치 상태

(1) 설치되는 패키지

Numpy, Pandas, Jupyter notebook, scikit-learn, matplotlib, seaborn, nltk 등은 이미 설치가 되어있다.

i) 넘파이(Numpy)란?

넘파이는 수치해석용 파이썬 패키지이다. 다차원의 배열 자료구조 클래스인 ndarray 클래스를 지원하며 벡터와 행렬을 사용하는 선형대수 계산에 주로 사용된다. C로 구현된 CPython에서만 사용할 수 있다.

 

ii) 판다스(Pandas)란?

판다스(Pandas)는 파이썬 데이터 처리를 위한 라이브러리다. 파이썬을 이용한 데이터 분석과 같은 작업에서 필수 라이브러리로 알려져있다

 

iii) 주피터 노트북(Jupyter notebook)이란?

주피터 노트북이란 오픈소스 기반의 웹 플랫폼으로, 파이썬을 비롯한 다양한 프로그래밍 언어로 코드 작성 및 실행을 지원하는 개발환경을 의미한다. 단계적 코드실행이 가능하여 문서화/시각화/분석에 용이하다.

 

iv) 사이킷런(scikit-learn)이란?

파이썬 머신러닝 라이브러리이다. 사이킷런을 통해 나이브 베이즈 분류, 서포트 벡터 머신 등 다양한 머신 러닝 모듈을 불러올 수 있다. 또한, 사이킷런에는 머신러닝을 연습하기 위한 아이리스 데이터, 당뇨병 데이터 등 자체 데이터 또한 제공하고 있다.

 

v) 매트플롯라이브러리(matplotlib)

Python 프로그래밍 언어 및 수학적 확장 NumPy 라이브러리를 활용한 플로팅 라이브러리로써 데이터를 시각화할 수 있다.

 

vi) 씨본(seaborn)이란?

파이썬의 대표적인 시각화 도구로써 matplotlib과 대비하여 손쉽게 그래프를 그리고 그래프 스타일을 설정할 수 있다.

 

vii) nltk란?

자연어 처리를 위한 파이썬 패키지로써, 말뭉치, 토큰생성, 형태소 분석, 품사 태깅을 제공한다.

 

 

(2) 설치되지 않는 패키지

텐서플로우(Tensorflow), 케라스(Keras), 젠심(Gensim), 코엔엘파이(KoNLpy)와 같은 패키지들은 설치되어 있지 않다. 따라서 이들 패키지에 대한 간단한 설명과 설치 방법을 이하 설명하겠다. 

 

 

2. 텐서플로우(Tensorflow)

(1) 텐서플로우란?

구글이 2015년에 공개한 머신 러닝 오픈소스 라이브러리이다. 딥러닝 프로그램을 쉽게 구현할 수 있도록 다양한 기능을 제공해주는 라이브러리다. 브라우저에서 실행 가능한 시각화 도구인 텐서보드(TensorBoard)를 제공하여, 딥러닝 학습과정을 추적하는데 유용하게 사용된다.

 

(2) 설치 방법

1) 아나콘다 프롬프트(Anaconda Prompt) 또는 명령프롬프트(cmd)를 통해 설치

> pip install tensorflow

2) ipython shell을 실행하여 정상 설치 확인

i) ipython 설치 

cmd에 하단의 명령어를 입력한다.

pip install ipython

ii) 텐서플로우 임포트 및 버전 확인

a. cmd에 하단의 명령어를 입력한다.

> ipython
In [1]: import tensorflow as tf
In [2]: tf.__version__

b. 출력 화면

텐서플로우는 주로 tf라는 명칭으로 import함

▲ 이때 텐서플로우의 버전이 동일하지 않아도 상관 없음

 

iii) 쉘을 나올때는 'exit'을 입력하면 된다. 

 

▲ 이하 다른 패키지들도 동일한 방식으로 정상 설치 여부를 확인하면 됨

 

 

3. 케라스(Keras)

(1) Intro

1) 케라스란?

케라스(Keras)는 딥 러닝 프레임워크인 텐서플로우에 대한 추상화 된 API를 제공한다. 케라스는 백엔드로 텐서플로우를 사용하며, 좀 더 쉽게 딥 러닝을 사용할 수 있게 해준다. 쉽게 말해, 텐서플로우 코드를 훨씬 간단하게 작성할 수 있다.

2) 텐서플로우에서의 사용

설치 후 직접 사용할 수도 있지만 텐서플로우에서 사용할 수 있다. 영어 커뮤니티에서는 순수 케라스를 keras로 표기한다면 텐서플로우에서 API로 사용하는 경우에는 tf.keras라고 한다. 두가지는 실제로 문법도 많은 면에서 동일하여 keras 코드를 tf.keras로 변경하는 것은 쉽다. 

 

(2) 설치 방법

1) 아나콘다 프롬프트(Anaconda Prompt) 또는 명령프롬프트(cmd)를 통해 설치

pip install keras

2) 케라스 임포트 및 버전 확인

>ipython
In [1]: import keras
In [2]: keras.__version__
Out[2]: '2.3.1'

4. 젠심(Gensim)

(1) 젠심이란?

머신 러닝을 사용하여 토픽 모델링과 자연어 처리 등을 수행할 수 있게 해주는 오픈 소스 라이브러리이다

 

(2) 설치 방법

1) 아나콘다 프롬프트(Anaconda Prompt) 또는 명령프롬프트(cmd)를 통해 설치

pip install gensim

2) 젠심 임포트 및 버전 확인

> ipython
In [1]: import gensim
In [2]: gensim.__version__
Out[2]: '3.8.1'

5. 코엘엔파이(KoLNpy)

(1) 코엘엔파이란?

한국어 자연어 처리를 위한 형태소 분석기 패키지이다. 

 

(2) 설치 방법

1) 아나콘다 프롬프트(Anaconda Prompt) 또는 명령프롬프트(cmd)를 통해 설치

pip install konlpy

2) 전제 환경

KoNLPy는 JAVA로 구성되어 있는데, JDK관련 오류나 JPype 오류가 발생하는 경우 해결을 위해서 JDK 1.7 이상의 버전과 JPype가 설치되어 있어야 한다.

i) JDK 설치

 a. https://www.oracle.com/technetwork/java/javase/downloads/index.html

 

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

 b. 환경변수 설정

JDK가 설치된 경로(ex: C:\Program Files\Java\jdk-11.0.16.1) 를 환경변수 중 USER사용자 변수에  JAVA_HOME이라는 이름으로 추가해준다

 

ii)JPype 설치 

a. JPype이란?

JAVA와 Python을 역할해주는 역할을 하는 것으로서,  Python 에서 JVM 을 띄운 뒤, 서로 통신을 하는 라이브러리이다.

 

b. 설치 방법

- 설치 주소 : https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype

▲ cp27은 파이썬 2.7, cp36은 파이썬 3.6을 의미한다. 따라서 각자의 파이썬 버전 및 운영체제에 맞게 설치하면 된다.

 

- 커맨드 입력

cd (하단 파일 경로)
pip install JPype1‑0.6.3‑cp36‑cp36m‑win_amd64.whl

 

<KoBERT 및 KoSentenceBERT이용>

1. 아나콘다 프롬프트에 해당 코드 입력

git clone https://github.com/SKTBrain/KoBERT.git
cd KoBERT
pip install -r requirements.txt
pip install .
cd ..
git clone https://github.com/BM-K/KoSentenceBERT_SKTBERT.git
cd KoSentenceBERT
pip install -r requirements.txt

 

2. 학습된 pt 파일을 각 폴더에 있는 result파일을 output 디렉토리에 넣기

- sts/result.pt 파일을 output/training_sts/0_Transformer에 넣어준다

https://drive.google.com/drive/folders/1fLYRi7W6J3rxt-KdGALBXMUS2W4Re7II?usp=sharing 

 

KoSBERT(SKT)_trainedFile - Google Drive

이 폴더에 파일이 없습니다.이 폴더에 파일을 추가하려면 로그인하세요.

drive.google.com

3. SemanticSearch.py파일을 실행한다

from sentence_transformers import SentenceTransformer, util
import numpy as np

model_path = './output/training_sts'

embedder = SentenceTransformer(model_path)

# Corpus with example sentences
corpus = ['한 남자가 음식을 먹는다.',
          '한 남자가 빵 한 조각을 먹는다.',
          '그 여자가 아이를 돌본다.',
          '한 남자가 말을 탄다.',
          '한 여자가 바이올린을 연주한다.',
          '두 남자가 수레를 숲 속으로 밀었다.',
          '한 남자가 담으로 싸인 땅에서 백마를 타고 있다.',
          '원숭이 한 마리가 드럼을 연주한다.',
          '치타 한 마리가 먹이 뒤에서 달리고 있다.']

corpus_embeddings = embedder.encode(corpus, convert_to_tensor=True)

# Query sentences:
queries = ['한 남자가 파스타를 먹는다.',
           '고릴라 의상을 입은 누군가가 드럼을 연주하고 있다.',
           '치타가 들판을 가로 질러 먹이를 쫓는다.']

# Find the closest 5 sentences of the corpus for each query sentence based on cosine similarity
top_k = 5
for query in queries:
    query_embedding = embedder.encode(query, convert_to_tensor=True)
    cos_scores = util.pytorch_cos_sim(query_embedding, corpus_embeddings)[0]
    cos_scores = cos_scores.cpu()

    #We use np.argpartition, to only partially sort the top_k results
    top_results = np.argpartition(-cos_scores, range(top_k))[0:top_k]

    print("\n\n======================\n\n")
    print("Query:", query)
    print("\nTop 5 most similar sentences in corpus:")

    for idx in top_results[0:top_k]:
        print(corpus[idx].strip(), "(Score: %.4f)" % (cos_scores[idx]))

[코드 설명]

- corpus: 정답이 되는 문장들을 집어 넣는다

- queries: 입력 값이 되는 문장들을 집어 넣는다

- 유사도를 Score값으로 출력한다

 

4. 결과

참조 링크: https://github.com/CapstoneMemento/KoSentenceBERT