본문 바로가기

BLOG/오픈소스 리뷰기

[오픈소스 리뷰기] Pororo 자연어처리 라이브러리(1)Text Classification

오픈소스 리뷰 : 슬기로운 오픈소스 사용법 리뷰해드립니다!
#15 Pororo 자연어처리 라이브러리(1)Text Classification

 

 

안녕하세요. 디노랩스입니다!

오늘 소개해 드릴 오픈소스는 카카오브레인에서 공개한 자연어처리 오픈 소스입니다! 

 

Pororo(Platform Of neuRal mOdels for natuRal language prOcessing)는 카카오브레인에서 공개한 자연어처리 오픈소스로 영어, 한국어, 중국어, 일본어 등 여러가지 언어로 30가지 이상의 자연어 처리 모델이 구현되어 있습니다.

Pororo 라이브러리를 활용하면 간단한 코드 몇줄로 이전에 설명드린 KoBART를 활용한 문서요약 뿐만 아니라 개체명 인식, 기계 독해, 기계 번역, 요약, 감정분류 등 다양한 태스크를 손쉽게 수행할 수 있습니다.

 

이번 시간에는 Pororo 라이브러리를 활용하여 자연어처리와 관련된 다양한 task에 적용하는 방법을 알아보겠습니다.

 

Github: https://github.com/kakaobrain/pororo
공식문서: https://kakaobrain.github.io/pororo/

 

Welcome to PORORO’s documentation! — PORORO: Platform Of neuRal mOdels for natuRal language prOcessing 0.3.1 documentation

© Copyright 2021, Kakao Brain Corp.

kakaobrain.github.io

 

GitHub - kakaobrain/pororo: PORORO: Platform Of neuRal mOdels for natuRal language prOcessing

PORORO: Platform Of neuRal mOdels for natuRal language prOcessing - GitHub - kakaobrain/pororo: PORORO: Platform Of neuRal mOdels for natuRal language prOcessing

github.com

 

 

 

설치

 

pororo 라이브러리는 pip 명령어를 통해 손쉽게 설치할 수 있습니다.

 

 

!pip install pororo

 

# 일본어 처리를 위한 모듈 설치
!pip install ipadic
!pip install fugashi

 

# pororo 라이브러리로 수행할 수 있는 task를 확인해보겠습니다.
from pororo import Pororo
Pororo.available_tasks()

 

 

01. Text Classification

 

Text Classification 은 텍스트 전체를 입력으로 받아 정해진 클래스로 분류하는 task를 말합니다.
예를 들어, Sentiment Analysis를 통해 리뷰에 나타난 감정을 분류하거나 Zero-shot Topic Classification을 통해 뉴스기사의 카테고리를 분류할 수 있습니다.


Pororo 에서 지원하는 Text Classification task의 대표적인 예시들을 살펴보겠습니다.

 

 

(1) 자연어추론(Natural Language Inference)

 

Pororo 에서는 하나의 문장(premise)이 주어졌을 때 해당 문장이 다른 문장(hypothesis)에 의미적으로 수반(entail)되는지 결정하는 task인 자연어추론을 지원합니다.

입력 Parameters

  • sent_a: 첫번째 문장
  • sent_b: 두번째 문장

Returns

  • predicted NLI label
    • Neutral: 두 문장이 무관한 경우
    • Entailment: 두 문장이 같은 의미를 담고 있는 경우
    • Contradiction: 두 문장이 서로 모순된 의미를 담고 있는 경우

https://kakaobrain.github.io/pororo/text_cls/nli.html

 

Natural Language Inference — PORORO: Platform Of neuRal mOdels for natuRal language prOcessing 0.3.1 documentation

© Copyright 2021, Kakao Brain Corp.

kakaobrain.github.io

 

# 자연어추론을 위한 task를 parameter로 입력하여 클래스를 불러옵니다.
from pororo import Pororo
nli = Pororo(task="nli", lang="ko")
nli

 

# 두 문장이 무관한 경우
nli("나는 처음부터 그것을 잘 이해했다", "어떤 남자들은 스포츠를 하고 있다")

 

# 두 문장이 같은 의미를 담고 있는 경우
nli("여러 명의 남성들이 하는 축구 경기", "어떤 남자들은 스포츠를 하고 있다")

 

# 두 문장이 모순된 경우
nli("저는, 그냥 알아내려고 거기 있었어요", "나는 처음부터 그것을 잘 이해했다")

 

이처럼 자연어 추론 task를 통해 두 문장간의 무관,내포,모순 관계를 파악할 수 있으며 Pororo에서는 한국어뿐만 아니라 영어, 일본어, 중국어까지 지원하고 있습니다.

 

 

# 영어
nli_en = Pororo(task="nli", lang="en")
print(nli("A soccer game with multiple males playing.", "Some men are playing a sport."))

 

# 중국어
nli_zh = Pororo(task="nli", lang="zh")
print(nli_zh('一群人抬头看着建筑物屋顶边缘的3人。', '三人正在楼梯上爬下来。'))

 

 

(2) 텍스트 의미적 유사성(Semantic Textual Similarity)

 

사전학습된 딥러닝 모델을 통해 문장의 semantic을 분석하여 유사도를 측정하는 task 입니다.
두 개의 문장을 입력으로 받아 서로의 의미가 유사할 수록 1에 가깝게, 관계가 없을 수록 0에 가까운 유사도를 return합니다.

 

입력 Parameters

  • sent_a: 첫번째 문장
  • sent_b: 두번째 문장

Returns

  • similarity: 유사도 (0 ~ 1)

https://kakaobrain.github.io/pororo/text_cls/sts.html

 

Semantic Textual Similarity — PORORO: Platform Of neuRal mOdels for natuRal language prOcessing 0.3.1 documentation

Semantic Textual Similarity Semantic Textual Similarity related modeling class class pororo.tasks.semantic_textual_similarity.PororoStsFactory(task: str, lang: str, model: Optional[str])[source] Bases: pororo.tasks.utils.base.PororoFactoryBase Sentence sim

kakaobrain.github.io

 

 

# "similarity"를 parameter로 입력하여 클래스를 불러옵니다.
from pororo import Pororo
sts = Pororo(task="similarity", lang="ko")
sts

 

# 문장의 의미가 유사한 경우
sts("나는 동물을 좋아하는 사람이야", "나는 동물을 사랑하는 사람이다")

 

# 문장의 의미가 유사하지 않은 경우
sts("나는 동물을 좋아하는 사람이야", "어떤 남자들은 스포츠를 하고 있다")

 

sts 역시 한국어뿐만 아니라 영어, 일본어, 중국어를 지원합니다.

 

 

# 영어
sts_en = Pororo(task="similarity", lang="en")
sts_en("Two dogs and one cat sitting on couch.", "Two dogs and a cat resting on a couch.")

 

 

(3) 리뷰 점수화(Review Scoring)

 

리뷰 텍스트를 분석하여 1점 ~ 5점의 척도로 리뷰점수를 측정하는 task 입니다.
이를 활용하여 별점 혹은 평점 없이 텍스트만 존재하는 리뷰데이터들을 점수화할 수 있습니다.

 

입력 Parameters

  • sent: 리뷰 텍스트

Returns

  • score: 리뷰 점수 (1.0 ~ 5.0)

https://kakaobrain.github.io/pororo/text_cls/review_score.html

 

Review Scoring — PORORO: Platform Of neuRal mOdels for natuRal language prOcessing 0.3.1 documentation

© Copyright 2021, Kakao Brain Corp.

kakaobrain.github.io

 

 

# "review"를 parameter로 입력하여 클래스를 불러옵니다.
from pororo import Pororo
review = Pororo(task="review", lang="ko")
review

 

review("그냥저냥 다른데랑 똑같숩니다")

 

review("가격에 비해 맛은 별로네요. 다시 방문할 필요는 없을 것 같습니다.")

 

review("인생맛집!! 다음에 또 찾아뵐게요~")

 

# 영어
review_en = Pororo(task="review", lang="en")
print("review_score_en", review_en("Just what I needed! Perfect for western theme party."))

# 중국어
review_zh = Pororo(task="review", lang="zh")
print("review_score_zh", review_zh("锅外型好可爱,家人喜欢,很适合3口之家使用"))

 

 

(4) 제로샷 토픽 분류(Zero-shot Topic Classification)

 

문장과 분류하고자 하는 class 들을 입력으로 받아 해당 문장이 어느 class 에 속하는지 분류하는 task입니다.
모델을 학습하는 과정에서 사용되지 않은 데이터와 클래스를 입력하더라도 잘 분류할 수 있도록 하는 task로 이를 활용하면 어느 분야에 속하는 topic이든 텍스트를 분류할 수 있습니다.

 

입력 Parameters

  • sent(str): 분류하고자 하는 문장
  • labels(List): 분류 클래스

Returns

  • 각 클래스별 해당 문장이 속할 confidence scores

https://kakaobrain.github.io/pororo/text_cls/zero.html

 

Zero-shot Topic Classification — PORORO: Platform Of neuRal mOdels for natuRal language prOcessing 0.3.1 documentation

© Copyright 2021, Kakao Brain Corp.

kakaobrain.github.io

 

 

# "zero-topic"를 parameter로 입력하여 클래스를 불러옵니다.
from pororo import Pororo
zsl = Pororo(task="zero-topic", lang="ko")
zsl

 

# 기사 제목을 통한 뉴스 카테고리 분류
zsl('''라리가 사무국, 메시 아닌 바르사 지지..."바이 아웃 유효" [공식발표]''', ["스포츠", "사회", "정치", "경제", "생활/문화", "IT/과학"])

 

# 영화 리뷰데이터를 통한 감성 분류
zsl("아 더빙.. 진짜 짜증나네요 목소리", ["긍정", "부정"])

 

# 댓글 데이터를 통한 혐오표현 분류
zsl("아줌마들 카페에서 한 잔에 밥값보다 비싼 커피 쳐마시면서 웃고 떠드는 거 극혐이다", ["혐오", "정상"])

 

Zero-shot Topic Classification 역시 한국어와 영어, 일본어, 중국어를 지원합니다.

 

 

# 기사 제목을 통한 뉴스 카테고리 분류 (영어)
zsl_en = Pororo(task="zero-topic", lang="en")
zsl_en("Who are you voting for in 2020?", ["business", "art & culture", "politics"])

 

# 기사 제목을 통한 뉴스 카테고리 분류 (일본어)
zsl_ja = Pororo(task="zero-topic", lang="ja")

# 가가와 진지는 효고 현 고베 시 다루미 구 출신의 프로축구 선수. 전 일본 대표.포지션은 MF, FW. 보루시아 도르트문트 시대의 2010-11 시즌으로 리그 전반기 17 시합에서 8 득점을 기록하며 9 시즌만의 리그 우승에 공헌. 키커지가 선정한 분데스리가의 연간 베스트 일레븐에 이름을 올렸다.
# ["스포츠", "기술", "정치"]
zsl_ja("香川 真司は、兵庫県神戸市垂水区出身のプロサッカー選手。元日本代表。ポジションはMF、FW。ボルシア・ドルトムント時代の2010-11シーズンでリーグ前半期17試合で8得点を記録し9シーズンぶりのリーグ優勝に貢献。キッカー誌が選定したブンデスリーガの年間ベスト イレブンに名を連ねた。",["スポーツ", "政治", "技術"])