Python/자연어처리 & 형태소 분석기

TfidfVectorizer와 Cosine Similarity를 이용한 한국어 텍스트 유사도 계산 방법

webnautes 2023. 11. 10. 05:35
반응형

TfidfVectorizer를 사용하여 텍스트를 벡터로 변환한 후(이때 형태소 분석기 Okt를 추가로 사용합니다) , cosine_similarity를 사용하여 벡터간 유사도를 계산합니다. 



2023. 11. 08 최초작성



윈도우에 KoNLPy 설치하는 방법은 아래 포스트를 참고하세요.

 

윈도우에 KoNLPy 설치하는 방법

https://webnautes.tistory.com/1956



추가로 sklearn를 설치합니다.

pip install scikit-learn



from konlpy.tag import Okt
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity


# 형태소 분석기 인스턴스 생성
tokenizer = Okt()

# 형태소 분석을 수행하는 함수 정의
def tokenize_ko(x):
    x = tokenizer.normalize(x) # 텍스트 Normalization
    x = tokenizer.morphs(x) # 형태소 분리
    return x


texts = [
    "나는 사과를 좋아합니다",
    "나는 빵을 좋아합니다",
    "나는 바나나를 좋아합니다"
]

# 새로운 문장 추가
new_texts = ["나는 사과들을 좋아합니다.", "나는 사과를 싫어합니다", "너는 사과를 좋아합니다"]

# TfidfVectorizer 객체 생성 ( 토크나이저로 형태소 분석기 사용)
vectorizer = TfidfVectorizer(tokenizer=tokenize_ko)

# 텍스트 데이터를 벡터 형태로 변환
tfidf_matrix = vectorizer.fit_transform(texts)

for new_text in new_texts:

    # 새로운 문장을 벡터 형태로 변환
    new_tfidf_vector = vectorizer.transform([new_text])

    # 새로운 문장과 기존 문장들 사이의 코사인 유사도 계산
    cosine_similarities = cosine_similarity(new_tfidf_vector, tfidf_matrix)

    # 새로운 문장과 기존 문장을 비교하여 유사도를 출력합니다.
    print(f"새로운 문장: {new_text}")
    print('-'*75)
    print(f"기존 문장:")
   
    for idx in range(3):
        most_similar_idx = cosine_similarities.argsort()[0][(idx+1)*-1]
        most_similar_sentence = texts[most_similar_idx]
        similarity_score = cosine_similarities[0][most_similar_idx]
        print(f"{most_similar_sentence} (유사도: {similarity_score:.4f})")

    print('\n\n')



실행 결과입니다. 새로운 문장과 기존 문장 사이의 코사인 유사도를 보여줍니다. 기존 문장에서 유사도가 높을 수록 새로운 문장과 유사한 문장입니다.

 

 

반응형