logo

[텍스트 분석] 문장 BERT를 이용한 키워드 추출

전처리는 [토픽 모델링을 위한 전처리](/course/text-mining/토픽 모델링을 위한 전처리)를 참조

 

sentence_transformers

colab에서 실습 시 런타임 → 런타임 유형 변경 → GPU

설치

!pip install sentence_transformers

임포트

from sentence_transformers import SentenceTransformer

모델 로딩

model = SentenceTransformer('jhgan/ko-sroberta-multitask')
 

비슷한 문서 보기

문장 임베딩

doc_emb = model.encode(df['abstract'])

0번 문서와 비슷한 문서 보기

from sklearn.metrics.pairwise import cosine_distances
import numpy as np

doc_idx = 0
dists = cosine_distances(doc_emb[[doc_idx]], doc_emb).flatten()
df.iloc[np.argsort(dists)[:10]]
statusko_titleen_titleabstract
0등록개운죽 잎 및 줄기 추출물을 함유하는 컨디셔닝 샴푸 조성물 및 이를 이용한 컨디셔닝...Conditioning shampoo composition containing le...본 발명은 개운죽 잎 및 줄기 추출물을 함유하여 모발의 윤기와 부드러움의 지속력을 ...
179등록생약추출액이 함유된 샴푸조성물Shampoo composition본 발명은 두피와 모발의 세정효과가 우수할 뿐만 아니라 두피와 모발의 건강을 유지시...
133등록천연 추출물이 함유된 기능성 샴푸 조성물 제조방법Hair shampoo composition including natural ext...본 발명은 집중 한방추출물을 복합적으로 적용하여 두피와 모발의 건강을 유지함은 물론...
182등록두피 및 모발 상태 개선용 샴푸 조성물Shampoo composition for improving state of sca...본 발명은 두피 및 모발 상태 개선용 샴푸 조성물에 관한 것으로, 더욱 상세하게는 ...
113공개친환경 원료를 사용한 두피 건강용 샴푸Scalp health shampoo using eco-friendly ingred...본 발명은 편백잎, 솔잎, 잣나무잎, 녹차잎 및 병풀을 전해환원수와 혼합하여 발효시...
196등록식물 추출물 및 천연 계면활성제를 함유하는 천연 샴푸 조성물Natural shampoo composition comprising plant e...본 발명은 편백잎, 솔잎, 잣나무잎, 녹차잎 및 병풀을 전해환원수와 혼합하여 발효시...
198등록탈모 방지 및 모발 개선 기능을 갖는 샴푸 조성물Shampoo composition for preventing hair loss a...본 발명은, 약용식물워터를 포함하는 샴푸 조성물에 관한 것으로, 상기 약용식물워터는...
111등록탈모방지 및 발모 촉진용 샴푸A shampoo for promoting a growith of a hair an...본 발명은 자생 식물 추출물과 천연 한약재 추출물을 주요 유효 성분으로 하여 비듬을...
107등록황련추출물, 박하추출물 및 사해미네랄을 함유하는 비듬방지용 샴푸 조성물The Dandruff Preventing Hair Cleaner Compositi...본 발명은 자생 식물 추출물과 천연 한약재 추출물을 주요 유효 성분으로 하여 비듬을...
206등록샴푸 조성물SHAMPOO COMPOSITION본 발명은 샴푸 조성물에 관한 것으로, 정제수, 글루카메이트, 폴리쿼터, 판테놀, ...
 

키워드 추출

words = cv.get_feature_names_out()
word_emb = model.encode(words)
dists = cosine_distances(doc_emb[[doc_idx]], word_emb).flatten()
for i in np.argsort(dists)[:5]:
    print(words[i])
첨가제
추출물
추출액
화합물
계면활성제

 

Max Sum Similarity

from scipy.special import factorial
n = 10
k = 5
factorial(n)/factorial(n-k)/factorial(k)
252.0
from itertools import combinations

max_dist = 0
max_combi = None
candidates = np.argsort(dists)[:n]
for combi in combinations(candidates, k):
    word_dists = cosine_distances(word_emb[list(combi)])
    sum_dist = word_dists.sum()
    if sum_dist > max_dist:
        max_dist = sum_dist
        max_combi = combi
max_dist
10.816771
for i in max_combi:
    print(words[i])
추출액
계면활성제
보습제
천연
두피

 

Maximal Marginal Relevance

초기화

첫번째 키워드는 문서와 가장 비슷한 것으로 선택

from sklearn.metrics.pairwise import cosine_similarity
diversity = 0.5
keyword, *candidates = np.argsort(dists)[:n].tolist()
keywords = [keyword]

나머지 키워드를 하나씩 추가

for _ in range(k - 1):
    # 문서와 유사도 계산
    doc_sims = cosine_similarity(doc_emb[[doc_idx]], word_emb[candidates])[0]
    # 키워드와 유사도 계산
    keyword_sims = cosine_similarity(word_emb[keywords], word_emb[candidates])
    # 가장 높은 키워드 유사도를 선택
    keyword_sims = np.max(keyword_sims, axis=0)
    # MMR: 문서와는 비슷하고, 기존 키워드와는 달라야함
    mmr = (1 - diversity) *  doc_sims - diversity * keyword_sims
    # MMR이 가장 높은 키워드 위치
    most_similar_idx = np.argmax(mmr)
    # 후보에서 해당 키워드를 선택
    keyword = candidates[most_similar_idx]
    # 새 키워드 추가
    keywords.append(keyword)
    # 추가된 키워드는 후보에서 제거
    candidates.remove(keyword)
for i in keywords:
    print(words[i])
첨가제
두피
천연
보습제
추출액

Previous
LDA
Next
검색