目標
次の休暇のためのホテルであれ、家族向けのアパートであれ、理想的な場所を見つけるには、多くの場合、数多くの選択肢を比較するという、面倒で時間のかかるプロセスが必要になります。観光客にとってのホテルの適合性を示すカスタマイズされた指標を提供したり、家族連れに適したアパートのリスティングをランク付けしたりすることで、ユーザーが簡単に判断できるように支援できたらどうでしょうか。
このドキュメントでは、Places Aggregate API を使用して、定義された地理的エリア内の場所の密度に基づいて、動的なカスタムの場所スコアを生成する方法について説明します。スコアは、指定した条件に対する数値ランキングであり、その場所がニーズにどの程度適しているかを即座に伝えることができます。
ある都市のホテルを宣伝し、観光客向けのスコアを作成して、最も魅力的な観光エリアにあるホテルをハイライト表示するとします。Places Aggregate API を使用して、各ホテルの近くにある関連する場所の種類の数をカウントします。たとえば、顧客が、次の場所の近くにあるホテルを重視していることがわかっているとします。
- レストラン、コーヒー ショップ
- 公園、博物館
- 衣料品店
選択した場所タイプの数に重要度の重み付けを適用することで、各ホテルの場所の総合スコアを計算できます。このスコアは、付近の場所に基づいて、その場所の全体的な適合性を反映しています。各場所タイプに割り当てる重みは、特定のユースケースとターゲット オーディエンスにとって重要な要素に合わせる必要があります。このドキュメントでは、観光客向けスコアを主な例として使用しますが、スコアはユーザーの属性やニーズを反映するように作成できます。
前提条件
このドキュメントを読む前に、次のドキュメントをよく理解しておくことをおすすめします。
- Places Aggregate API のデベロッパー向けドキュメント。技術的な詳細と使用可能なパラメータについて説明しています。
- [省略可] Gemini Developer API のデベロッパー向けドキュメント。API を使用して Gemini を呼び出す方法を理解します。このドキュメントでは、カスタム ロケーション スコアを生成するオプションとして使用されています。
関連する場所のタイプを選択する
カスタム ロケーション スコアを作成する最初のステップは、表 A から、顧客に関連する場所タイプを決定することです。観光客向けのスコアを作成するため、観光客が滞在中に近くにいてほしい場所のタイプとして、以下を選択しました。
- restaurant
- park
- clothing_store(衣料品店)
- museum
- coffee_shop
次に、これらの場所タイプに重みを割り当て、最終スコアにおける相対的な重要度を反映させます。重み付けは、ユースケースとユーザーの好みに最も重要な要素に基づいて決定する必要があります。この例では、重み付けの尺度は 0 ~ 1 の範囲で、次のようになります。
場所タイプ |
重み付け |
restaurant |
0.8 |
park |
0.6 |
clothing_store(衣料品店) |
0.3 |
museum |
0.2 |
coffee_shop |
0.5 |
Places Aggregate API を呼び出す
関心のある場所タイプのリストが作成されたので、次のステップは Places Aggregate API を呼び出すことです。
Places Aggregate API には、位置情報フィルタが必要です。この例では、circle を使用します。中心 latLng はホテルの場所、radius は 500 m です。また、ratingFilter を設定して、評価が 3.8 ~ 5 の場所を返すようにし、評価の低い場所をカウントから除外します。
特定のユースケースに合わせて、位置情報フィルタの設定をさまざまに変更してみてください。たとえば、半径の値を大きくすることで、中心の緯度と経度からより広い半径内の場所をキャプチャできます。または、地域やカスタムエリアなど、別の方法で検索エリアを設定することもできます。
Places Aggregate API ドキュメントのロケーション フィルタ セクションをよく理解し、利用可能なオプションについて確認してください。
カスタムスコアを生成する場所の種類と場所ごとに Places Aggregate API を呼び出します。たとえば、ホテルの 1 つのレストランの場所タイプを呼び出します。
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 へのすべての呼び出しが完了すると、各ビジネスについて次のようなデータが得られます。
場所タイプ |
重み付け |
数 |
restaurant |
0.8 |
56 |
park |
0.6 |
3 |
clothing_store(衣料品店) |
0.3 |
32 |
museum |
0.2 |
8 |
coffee_shop |
0.5 |
41 |
カスタム ロケーション スコアを生成する
各場所の場所の数と、各場所の場所タイプの重み付けがわかったので、カスタムの場所スコアを生成できます。このセクションでは、ローカル アルゴリズムを使用する方法と、Gemini Developer API を使用する方法の 2 つについて説明します。
オプション 1: アルゴリズムを使用する
最初に説明するオプションは、ローカル アルゴリズムを使用して、各場所タイプの重み付けと数からスコアを生成する方法です。このスコアを 0 ~ 5 のスケールに正規化します。値が大きいほど、基準に基づいてより魅力的なエリアであることを示します。この例では、上記のデータから 2 つの 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 桁に丸められます)です。
オプション 2: Gemini Developer API を使用する
ローカル アルゴリズムを使用する代わりに、Gemini Developer API を使用すると、すべての場所のカスタム ロケーション スコアを効率的に計算できます。すべてのホテル拠点について、システム指示とともにカウントと重み付けのデータを提供するだけです。
この方法は、次のような微妙なニュアンスを含む情報を計算に含める場合に特に有用です。
- 各ホテルの場所に関するテキストの説明(例: 「この場所は家族連れに適しており、夜間は静かです」)。
- ユーザーに関する情報(例: 「このユーザーは家族向けに予約しており、中心部にある静かなエリアを希望しています」)。
Gemini Developer API は、この定性データを理解して考慮できるため、純粋に数学的なアプローチを超えた、より高度で関連性の高いスコアを算出できます。
Gemini Developer API を使用すると、上記の場所タイプと重み付けテーブルに加えて、各場所の説明データを次のように取得できます。
ロケーション |
説明 |
美術館や博物館に近い中心部に位置し、夜は静かで、家族連れに適しています。 |
|
バーやレストランに近い中心部に位置しています。夜はにぎやかで混雑。グループにおすすめ。 |
|
市内中心部から離れた住宅地。 |
|
川に近い中心部に位置しています。夜は静かで、家族連れに適しています。 |
|
市内中心部から離れた住宅地。 |
これらの定性的な説明は、ユーザー情報や設定とともに、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 配列を出力するようリクエストしています。
- 場所の緯度と経度
- カスタム ロケーション スコア
上記のシステム指示と構造化出力を使用すると、1 つの場所に対する Gemini からのレスポンスは次のようになります。score はカスタムの場所スコアです。
[
{
"location": {
"latitude": 51.51611,
"longitude": -0.12726
},
"score": "4.13"
}
]
スコアを表示する
上記の方法のいずれかを使用して各場所のカスタム ロケーション スコアを生成すると、ホテルの詳細とともに表示したり、検索フィルタ オプションとして使用したりできます。たとえば、「観光客向けのスコアが高い場所を表示して」などです。これにより、お客様は予約時にデータに基づいた意思決定を行うことができます。
まとめ
カスタムのロケーション スコアを使用すると、ユーザーがエリアの適合性を一目で把握できる強力なツールになります。このドキュメントでは、5 つの異なる場所タイプを使用して、さまざまな場所のカスタム ロケーション スコアを生成する方法について説明しました。この実装は、ニーズに合わせて変更できます。また、類似した場所タイプを 1 つのリクエストに結合して、それらのタイプの集計数を返し、カスタムの場所スコアリング ソリューションに提供することもできます。
今すぐ Places Aggregate API をお試しください。分析に役立つ場所スコアを生成して、お客様が十分な情報に基づいて場所に関する意思決定を行えるよう支援しましょう。
寄稿者
Henrik Valve | DevX エンジニア