> 백엔드 개발 > 파이썬 튜토리얼 > 외부 라이브러리 없이 두 문장 간의 코사인 유사성을 어떻게 계산할 수 있습니까?

외부 라이브러리 없이 두 문장 간의 코사인 유사성을 어떻게 계산할 수 있습니까?

DDD
풀어 주다: 2024-11-01 13:14:02
원래의
860명이 탐색했습니다.

How Can You Calculate Cosine Similarity Between Two Sentences Without External Libraries?

외부 라이브러리 없이 두 문장 문자열 간의 코사인 유사성 계산

자연어 처리 측면에서 문서 간 텍스트 유사성을 측정하려면 코사인 유사성 계산이 필수적입니다. tf-idf-cosine과 같은 외부 라이브러리를 사용하면 이 작업을 용이하게 할 수 있지만 이러한 종속성에 의존하지 않고 수동으로 코사인 유사성을 계산하는 것도 가능합니다.

코사인 유사성 개요

코사인 유사성은 텍스트를 나타내는 두 벡터 사이의 각도를 수량화합니다. 코사인 유사성이 높을수록 각도가 작아지고 텍스트 간의 유사성이 커짐을 의미합니다. 이는 정규화된 벡터를 크기로 나눈 내적을 사용하여 계산됩니다.

수동으로 코사인 유사성 구현

코사인 유사성을 수동으로 계산하려면 다음 단계를 정의합니다.

  1. 토큰화: 문장을 개별 단어로 나눕니다.
  2. 벡터화: 각 문장의 각 단어에 대한 카운터를 만듭니다. 빈도(용어 빈도).
  3. 정규화: 각 요소를 해당 요소의 제곱합(L2 표준)의 제곱근으로 나누어 벡터를 정규화합니다.
  4. 코사인 계산: 정규화된 벡터의 내적을 계산하고 크기로 나눕니다.

코드 구현

아래는 수동 코사인 유사성 계산의 Python 구현:

<code class="python">import math
import re
from collections import Counter

WORD = re.compile(r"\w+")

def get_cosine(vec1, vec2):
    intersection = set(vec1.keys()) & set(vec2.keys())
    numerator = sum([vec1[x] * vec2[x] for x in intersection])
    
    sum1 = sum([vec1[x] ** 2 for x in vec1])
    sum2 = sum([vec2[x] ** 2 for x in vec2])
    denominator = math.sqrt(sum1) * math.sqrt(sum2)
    
    if not denominator:
        return 0.0
    else:
        return numerator / denominator

def text_to_vector(text):
    words = WORD.findall(text)
    return Counter(words)

text1 = "This is a foo bar sentence ."
text2 = "This sentence is similar to a foo bar sentence ."

vector1 = text_to_vector(text1)
vector2 = text_to_vector(text2)

cosine = get_cosine(vector1, vector2)

print("Cosine:", cosine)</code>
로그인 후 복사

Result

이 코드는 다음과 같이 실행됩니다.

Cosine: 0.861640436855
로그인 후 복사

이 값은 다음을 나타냅니다. 두 문장 사이의 높은 코사인 유사성을 통해 텍스트상 유사함을 확인합니다.

추가 고려 사항

이 수동 접근 방식은 기본적인 구현을 제공하지만 다음을 통해 향상될 수 있습니다. :

  • 향상된 단어 정규화를 위해 형태소 분석 또는 표제어 분석을 통합합니다.
  • 보다 정교한 토큰화 방식을 구현합니다.
  • 더 정확한 유사성 계산을 위해 TF-IDF와 같은 가중치를 추가합니다.

위 내용은 외부 라이브러리 없이 두 문장 간의 코사인 유사성을 어떻게 계산할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿