Skip to content

문장 BERT를 이용한 키워드 추출

전처리는 토픽 모델링을 위한 전처리를 참조

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]]

키워드 추출

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)
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
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)