Places Aggregate 自訂位置分數

目標

圖片

無論是尋找度假飯店或適合全家入住的公寓,往往需要花費大量時間比較眾多選項,過程令人沮喪。如果能提供自訂指標,顯示飯店是否適合觀光客,或根據家庭友善程度為公寓房源排名,就能讓使用者輕鬆做出決定,不必再費心比較。

本文說明如何使用 Places Aggregate API,根據指定地理區域內的地點密度,產生動態自訂地點分數。分數是根據指定條件得出的數值排名,可立即反映地點是否符合需求。

假設您要宣傳某個城市的飯店,並想建立適合遊客的分數,凸顯最吸引人的旅遊區飯店。使用 Places Aggregate API 計算每間飯店附近有多少相關地點類型。舉例來說,您知道顧客重視飯店的位置,希望附近有許多下列地點:

  • 餐廳和咖啡店
  • 公園與博物館
  • 服飾店

只要對這些所選地點類型的計數套用重要性權重,即可計算出每間飯店位置的整體分數。分數反映了地點的整體合適度,依據是附近地點。指派給各個地點類型的權重,應與您的特定用途和目標對象重視的項目一致。本文將以「適合遊客」分數做為主要範例,但您可以根據使用者客層和需求建立分數。

必要條件

閱讀本文前,建議您先熟悉下列說明文件:

  • Places Aggregate API 開發人員說明文件,瞭解技術細節和可用參數。
  • [選用] Gemini Developer API 開發人員說明文件:瞭解如何使用 API 呼叫 Gemini,本文將此做為產生自訂位置分數的選項。

選取相關地點類型

如要建立自訂地點分數,第一步是從表 A 中,決定與顧客相關的地點類型。由於我們要建立適合遊客分數,因此選取了以下地點類型,這些是遊客在住宿期間會想靠近的地點:

  • 餐廳
  • 公園
  • clothing_store
  • 博物館
  • coffee_shop

接著,為每個地點類型指派權重,反映其在最終分數中的相對重要性。權重應根據用途和使用者偏好設定中最重要的部分決定。在本例中,權重比例介於 0 到 1 之間,如下所示:

地點類型

加權

餐廳

0.8

公園

0.6

clothing_store

0.3

博物館

0.2

coffee_shop

0.5

呼叫 Places Aggregate API

取得感興趣的地點類型清單後,下一步是呼叫 Places Aggregate API。

Places Aggregate API 需要位置篩選器。在本範例中,請使用 circle,並將中心 latLng 設為飯店位置,radius 設為 500 公尺。此外,請設定 ratingFilter,傳回評分介於 3.8 到 5 之間的地點,並排除評分較低的地點。

請嘗試變更位置篩選器的設定,找出最適合您特定用途的設定。舉例來說,您可以增加半徑值,擷取中心經緯度較大半徑範圍內的地點。或者,您也可以使用其他方法設定搜尋區域,例如「Region」(區域) 或「Custom area」(自訂區域)。

請參閱 Places Aggregate API 說明文件的地點篩選器部分,瞭解可用的選項。

針對要產生自訂分數的每個地點類型和位置,呼叫 Places Aggregate API。舉例來說,呼叫其中一間飯店的餐廳地點類型:

curl --location 'https://areainsights.googleapis.com/v1:computeInsights' \
--header 'X-Goog-Api-Key: API_KEY \
--header 'Content-Type: application/json' \
--data '{
    "insights": [
        "INSIGHT_COUNT"
    ],
    "filter": {
        "locationFilter": {
            "circle": {
                "latLng": {
                    "latitude": 51.51611,
                    "longitude": -0.12726
                },
                "radius": 500
            }
        },
        "typeFilter": {
            "includedTypes": [
                "restaurant"
            ]
        },
        "ratingFilter": {
            "minRating": 3.8,
            "maxRating": 5
        }
    }
}'

完成所有 API 呼叫後,您會取得各個位置的資料,如下所示:

地點類型

加權

數量

餐廳

0.8

56

公園

0.6

3

clothing_store

0.3

32

博物館

0.2

8

coffee_shop

0.5

41

產生自訂位置分數

現在您已取得每個地點的地點數量和各個地點類型的權重,可以產生自訂地點分數。本節將討論兩種做法:使用本機演算法,或使用 Gemini Developer API。

方法 1:使用演算法

首先介紹的是使用本機演算法,根據每個地點類型的權重和數量產生分數。將這個分數正規化為 0 到 5 的範圍,值越高代表根據您的條件,該區域越有吸引力。在本範例中,請根據上述資料產生兩個 JavaScript 物件:

itemCounts

typeWeights

    {
      "restaurant": 56,
      "park": 3,
      "clothing_store": 32,
      "museum": 8,
      "coffee_shop": 41
    }
    
    {
      "restaurant": 0.8,
      "park": 0.6,
      "clothing_store": 0.3,
      "museum": 0.2,
      "coffee_shop": 0.5
    }
    

將 itemCounts 乘以 typeWeights,然後將結果加到整體 weightedCount,即可根據計數和權重產生分數:

let weightedCount = 0;
for (const itemType in itemCounts) {
  weightedCount += itemCounts[itemType] * typeWeights[itemType];
}
weightedCount = weightedCount.toFixed(2);

在本例中,這個步驟的輸出內容為:78.3。

現在,您可以使用對數正規化,產生這個地點的最終分數,範圍介於 0 到 5 之間:

if (weightedCount === 0) {
   normalizedScore = 0;
} else {
   normalizedScore = Math.log(weightedCount + 1);
}

// Clamp between 0 and 5
normalizedScore = Math.max(0, Math.min(5, normalizedScore));

在這個範例中,最終分數輸出結果為:4.36 (四捨五入至小數點後兩位)。

選項 2:使用 Gemini Developer API

除了使用本機演算法,Gemini Developer API 也能有效計算所有地點的自訂地點分數。只要提供所有飯店地點的數量和權重資料,以及系統指示即可。

如果您想在計算中加入細微資訊,這個方法特別實用,例如:

  • 各飯店地點的文字說明,例如:「這個地點適合家庭入住,晚上很安靜」。
  • 使用者相關資訊,例如:「這位使用者要為家人預訂住宿,偏好位於市中心且安靜的區域」。

Gemini Developer API 可理解並考量這類質性資料,因此能提供比純數學方法更精細、更相關的分數。

使用 Gemini Developer API 時,除了上述地點類型和加權表,您還可以取得每個地點的說明資料,如下所示:

位置

說明

51.49884, -0.17978

位於市中心,鄰近博物館,晚上安靜,適合家庭入住。

51.51750, -0.13065

位於市中心,鄰近酒吧和餐廳。晚上熱鬧喧囂,適合團體聚會。

51.45712, 0.01146

住宅區,遠離市中心。

51.51271, -0.09933

位於市中心,靠近河邊。晚上很安靜,適合家庭入住。

51.58502, -0.06445

住宅區,距離市中心較遠。

您可以在 Gemini 提示中加入這些定性描述,以及任何使用者資訊或偏好設定。

系統指示

Gemini 需要指令和原始資料,才能根據提供的資料點,為每個地點產生分數。以下是達成這項目的的系統指令範例:

You will be given a json file containing details about a number of locations grouped by their latitude and longitudes.

Within the location details is information about the count of places nearby the location that match a specific category, and the weighting of importance of that category, between 0 - 1.

You will also be given information about the user's preference, and a description of each location. Take this into consideration when generating scores.

Generate a location suitability score taking these into account for each location. The score should be between 1 - 5 inclusive, to two decimal places. The minimum score a location can receive is 1.

Output in JSON

上述系統指令可讓 Gemini 瞭解預期的資料,以及 AI 模型的預期輸出內容。此外,系統也會要求以 JSON 格式輸出。

結構化輸出內容

雖然我們已要求 Gemini 以 JSON 格式輸出結果,但仍須更具體地說明輸出內容的結構,才能知道透過程式碼查詢時會得到什麼結果。為此,我們可以使用 Gemini API 中的 responseSchema 欄位,在要求中加入額外的結構化輸出指令。這會使用 OpenAPI 結構定義物件限制模型輸出內容。

例如:

{
  "type": "array",
  "description": "Array of location data with score",
  "items": {
    "type": "object",
    "properties": {
      "location": {
        "type": "object",
        "description": "Geographical coordinates of the location",
        "properties": {
          "latitude": {
            "type": "number",
            "format": "float",
            "description": "Latitude of the location"
          },
          "longitude": {
            "type": "number",
            "format": "float",
            "description": "Longitude of the location"
          }
        },
        "required": [
          "latitude",
          "longitude"
        ]
      },
      "score": {
        "type": "string",
        "description": "A score associated with the location"
      }
    },
    "required": [
      "location",
      "score"
    ]
  }
}

這個範例要求 Gemini 輸出 JavaScript 陣列,其中包含下列內容:

  • 地點經緯度
  • 自訂位置分數

使用上述系統指令和結構化輸出內容,Gemini 對某個地點的回覆會如下所示,其中 score 是自訂地點分數:

[
  {
    "location": {
      "latitude": 51.51611,
      "longitude": -0.12726
    },
    "score": "4.13"
  }
]

顯示分數

使用上述任一方法為每個地點產生自訂地點分數後,即可與飯店詳細資料一併顯示,或做為搜尋篩選選項。例如「顯示適合遊客分數高的地點」。這樣一來,客戶就能根據資料做出預訂決策。

結論

自訂地點分數是強大的工具,可讓使用者一目瞭然地瞭解某個區域是否合適。本文示範如何使用五種不同的地點類型,為多個地點產生自訂地點分數。您可以根據需求修改這項實作,並將類似的地點類型合併為一項要求,傳回這些類型的匯總計數,提供給自訂位置評分解決方案。

立即試用 Places Aggregate API,生成深入的地點評分,協助客戶做出明智的地點決策!

貢獻者

Henrik Valve | 開發人員體驗工程師