개발일지

[NLP] Kiwi 설치와 keyBert 한글 키워드 추출

송채채 2023. 4. 28. 11:43
반응형

Keybert와 kiwi형태소분석기를 사용하여 키워드추출 하기

 

Keybert와 kiwi형태소분석기를 사용하여 키워드추출 하기

1 2 # !pip install keybert # !pip install kiwipiepy

hmkim312.github.io

블로그를 참고한 것으로 거의 동일한 내용이니, 위 블로그를 봐주시면 더 자세한 설명을 볼 수 있습니다.

설치

pip install keybert
pip install kiwipiepy
pip install transformers

KeyBERT 공식 홈페이지

 

 

KeyBERT

KeyBERT KeyBERT is a minimal and easy-to-use keyword extraction technique that leverages BERT embeddings to create keywords and keyphrases that are most similar to a document. About the Project Although there are already many methods available for keyword

maartengr.github.io

Kiwi 형태소 분석기

 

GitHub - bab2min/kiwipiepy: Python API for Kiwi

Python API for Kiwi. Contribute to bab2min/kiwipiepy development by creating an account on GitHub.

github.com

 

모델 불러오기

from keybert import KeyBERT
from kiwipiepy import Kiwi
from transformers import BertModel

model = BertModel.from_pretrained('skt/kobert-base-v1')
kw_model = KeyBERT(model)

kobert의 모델을 사용함 

 

텍스트 전처리

약 800-1000자 정도의 텍스트를 기준으로 함

kiwi 형태소에서 명사만 추출하기 위해 "NN"으로 시작하는 것만 추출함

nouns 리스트에 저장하여 추출이 끝나면 하나의 문자열로 return함

text = """서울 지진 대피소에 대한 데이터 분석을 위해서는 어떤 종류의 데이터가 필요할까요? 예를 들어, 서울시의 지진 대피소 위치, 수용 가능 인원, 대피소 내부 시설물, 대피소 이용 현황 등의 정보가 필요할 것입니다. 
지진 대피소 위치 분석 예시: 지진 대피소 위치는 서울시 공공데이터 포털에서 제공하는 "서울시 지진대피소 안내" 데이터를 사용할 수 있습니다. 이 데이터셋에는 지진 대피소 명칭, 위치(주소), 좌표, 수용 인원, 관리 기관 등의 항목이 포함되어 있습니다. 
이를 바탕으로 대피소 위치를 지도에 시각화하여 지진 발생 시 대피소가 필요한 지역을 파악할 수 있습니다. 대피소 이용 현황 분석 예시: 대피소 이용 현황은 서울시에서 제공하는 "서울시 재난정보 실시간 수집 및 제공 서비스" 데이터를 사용할 수 있습니다. 
이 데이터셋에는 대피소 이용 현황(대피소 이용 가능 여부, 이용 중인 인원 수), 지진 발생 시 대피소 이용 현황 등의 정보가 포함되어 있습니다. 이를 바탕으로 대피소 이용 현황을 분석하여 인원이 많은 대피소를 파악하거나, 대피소 이용 가능 여부 등을 파악할 수 있습니다."""

kiwi = Kiwi()
result_text = ''
for sentence in kiwi.analyze(text):
    nouns = []
    for token in sentence[0]:
        if token.tag.startswith('NN'):
            nouns.append(token.form)
    if nouns:
        result_text = ' '.join(nouns)
print(result_text)

result_text의 결과

'서울 지진 대피소 데이터 분석 종류 데이터 필요 예 서울시 지진 대피소 위치 수용 가능 인원 대피소 내부 시설물 대피소 이용 현황 등 정보 필요 것 지진 대피소 위치 분석 예시 지진 대피소 위치 서울시 공공 데이터 포털 제공 서울시 지진 대피소 안내 데이터 사용 수 데이터 지진 대피소 명칭 위치 주소 좌표 수용 인원 관리 기관 등 항목 포함 바탕 대피소 위치 지도 시각 지진 발생 시 대피소 필요 지역 파악 수 대피소 이용 현황 분석 예시 대피소 이용 현황 서울시 제공 서울시 재난 정보 실시간 수집 제공 서비스 데이터 사용 수 데이터 대피소 이용 현황 대피소 이용 가능 여부 이용 중 인원 수 지진 발생 시 대피소 이용 현황 등 정보 포함 바탕 대피소 이용 현황 분석 인원 대피소 파악 대피소 이용 가능 여부 등 파악 수'

키워드를 추출하는 게 목표라서, 문장 자체를 명사로만 이루어지게 하는 것이 더 깔끔함

 

키워드 추출

keywords = kw_model.extract_keywords(result_text, keyphrase_ngram_range=(1, 1), stop_words=None, top_n=20)
keywords
>>[('데이터', 0.4451),
 ('지진', 0.4023),
 ('서울', 0.3941),
 ('정보', 0.3515),
 ('서울시', 0.3509),
 ('지도', 0.3341),
 ('분석', 0.3061),
 ('재난', 0.245),
 ('시설물', 0.2277),
 ('지역', 0.2274),
 ('공공', 0.2011),
 ('포털', 0.1774),
 ('사용', 0.1751),
 ('이용', 0.171),
 ('위치', 0.1682),
 ('기관', 0.1638),
 ('수집', 0.1616),
 ('실시간', 0.1505),
 ('발생', 0.1442),
 ('주소', 0.1425)]

비지도 학습으로 하고 싶어서 이전 게시물들은 TextRank기법을 사용한 라이브러리를 테스트함

그 중에는 KR-wordrank가 가장 괜찮았고, 간단히 사용할 수 있는 언어모델은 keyBert를 테스트함

둘 중에 비교를 하자면,,,,사실 엄청 차이가 크진 않지만 keyBert가 더 좋은 것 같다.

이정도면 지금 수준에서는 만족~

 

코드 합본

from keybert import KeyBERT
from kiwipiepy import Kiwi
from transformers import BertModel

model = BertModel.from_pretrained('skt/kobert-base-v1')
kw_model = KeyBERT(model)

text = """서울 지진 대피소에 대한 데이터 분석을 위해서는 어떤 종류의 데이터가 필요할까요? 예를 들어, 서울시의 지진 대피소 위치, 수용 가능 인원, 대피소 내부 시설물, 대피소 이용 현황 등의 정보가 필요할 것입니다. 지진 대피소 위치 분석 예시: 지진 대피소 위치는 서울시 공공데이터 포털에서 제공하는 "서울시 지진대피소 안내" 데이터를 사용할 수 있습니다. 이 데이터셋에는 지진 대피소 명칭, 위치(주소), 좌표, 수용 인원, 관리 기관 등의 항목이 포함되어 있습니다. 이를 바탕으로 대피소 위치를 지도에 시각화하여 지진 발생 시 대피소가 필요한 지역을 파악할 수 있습니다. 대피소 이용 현황 분석 예시: 대피소 이용 현황은 서울시에서 제공하는 "서울시 재난정보 실시간 수집 및 제공 서비스" 데이터를 사용할 수 있습니다. 이 데이터셋에는 대피소 이용 현황(대피소 이용 가능 여부, 이용 중인 인원 수), 지진 발생 시 대피소 이용 현황 등의 정보가 포함되어 있습니다. 이를 바탕으로 대피소 이용 현황을 분석하여 인원이 많은 대피소를 파악하거나, 대피소 이용 가능 여부 등을 파악할 수 있습니다."""

kiwi = Kiwi()
nouns_list = []
for sentence in kiwi.analyze(test2):
    nouns = [token.form for token in sentence[0] if token.tag.startswith('NN')]
    if nouns:
        nouns_list.extend(nouns)
result_text = ' '.join(nouns_list)

keywords = kw_model.extract_keywords(result_text, keyphrase_ngram_range=(1, 1), stop_words=None, top_n=20)
print(keywords)