반응형

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



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

 

 

반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts