공간 MySQL 기능을 갖춘 텍스트 비교 속도 향상 (기능 벡터)
-
12-09-2019 - |
문제
두 개의 텍스트의 토큰/단어가 포함 된 두 개의 배열을 취하는 함수가 있으며 두 텍스트 사이의 관계를 보여주는 코사인 유사성 값을 제공합니다.
이 기능은 $ 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과 비교할 필요는 없습니다. 그래서 그것은 제공합니다 비교의 절반.