문제

두 개의 텍스트의 토큰/단어가 포함 된 두 개의 배열을 취하는 함수가 있으며 두 텍스트 사이의 관계를 보여주는 코사인 유사성 값을 제공합니다.

이 기능은 $ tokensa (0 => House, 1 => Bike, 2 => man)와 배열 $ TokensB (0 => Bike, 1 => House, 2 => Car)를 사용하고 유사성을 계산합니다. 부동 소수점 값으로 돌아갑니다.

function cosineSimilarity($tokensA, $tokensB) {
    $a = $b = $c = 0;
    $uniqueTokensA = $uniqueTokensB = array();
    $uniqueMergedTokens = array_unique(array_merge($tokensA, $tokensB));
    foreach ($tokensA as $token) $uniqueTokensA[$token] = 0;
    foreach ($tokensB as $token) $uniqueTokensB[$token] = 0;
    foreach ($uniqueMergedTokens as $token) {
        $x = isset($uniqueTokensA[$token]) ? 1 : 0;
        $y = isset($uniqueTokensB[$token]) ? 1 : 0;
        $a += $x * $y;
        $b += $x;
        $c += $y;
    }
    return $b * $c != 0 ? $a / sqrt($b * $c) : 0;
}

75 개의 텍스트를 서로 비교하려면 모든 텍스트를 서로 비교하기 위해 5,625 개의 단일 비교를해야합니다.

MySQL의 공간 열을 사용하여 비교 수를 줄일 수 있습니까?

내 기능이나 텍스트를 비교하는 방법에 대해 이야기하고 싶지 않습니다. 비교 수를 줄이는 것만으로도.

MySQL의 공간 열

  • 다음과 같이 공간 열을 만듭니다 : 테이블 생성 ABC (clmnname 유형)
  • 가능한 유형이 나열됩니다 여기
  • 여기 나중에 데이터를 선택하는 방법 [예 : multiptointfromtext () 또는 astext ()
  • 다음과 같은 값을 삽입하십시오 : clmnname 값에 삽입 (geomfromtext ( 'point (1 1)')

그러나 내 문제에 이것을 어떻게 사용합니까?

추신 : 알고리즘과의 비교 수를 줄이는 방법을 찾고 있습니다. 이 질문에서. Vinko Vrsalovic은 공간 특징에 대한 또 다른 질문을 열어야한다고 말했습니다.

도움이 되었습니까?

해결책

하는 동안 R-Trees 일반적으로 임의의 수의 차원으로 데이터를 색인 할 수 있습니다. MySQL 공간 능력은 제한됩니다 Geometry 유형 (2 치수).

벡터 인 경우 2-차원 그리고 정상화 한 다음 다음을 수행 할 수 있습니다.

  • 원을 차이에 맞는 각도 수의 두 배로 나눕니다.
  • 찾아보세요 MBR 각 부문의 중심에서 주어진 코사인 차이가있는 벡터
  • 내에서 모든 벡터를 찾으십시오 MBR
  • 정확한 차이를 위해 미세한 필터링을 수행하십시오.

그러나이 경우 값의 각도를 미리 처리하고 평원으로 색인하는 것이 더 좋습니다. B-Tree 인덱스.

다른 팁

사실 당신은 전용입니다 75 * 74 / 2 = 2775 비교. 모든 단어를 74 개의 다른 단어와 비교하지만 Word1을 Word2와 Word2와 Word1과 비교할 필요는 없습니다. 그래서 그것은 제공합니다 비교의 절반.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top