[텍스트 분석] 문장 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]]
status | ko_title | en_title | abstract | |
---|---|---|---|---|
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])
첨가제
두피
천연
보습제
추출액