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') |
실행 결과입니다. 새로운 문장과 기존 문장 사이의 코사인 유사도를 보여줍니다. 기존 문장에서 유사도가 높을 수록 새로운 문장과 유사한 문장입니다.
반응형