技術背景と課題
都市のデジタル化において、データ統合は重要な一歩です。某市の交通局は、複数の部門から提供される道路施設データの重複や誤り、命名の不一致などの問題に直面していました。例えば、「中山南路」と「中山南路段」、「解放路(鼓楼区)」と「南京市解放路」など、異なる表記であっても同一の場所を指すことがあります。従来の手動でのデータ整合には大量の時間と労力が必要で、10万以上の道路施設レコードの洗浄と統合には3名の専任スタッフが6ヶ月以上かかり、費用は100万元以上に上る予定でした。
MGeo: 中国語アドレス向けのセマンティックマッチングエンジン
この問題を解決するために、同交通局は阿里云のオープンソースMGeoアドレス類似度マッチングモデルを導入しました。これにより、データ統合期間は7日に短縮され、人件費は0.5人月に削減され、直接的な財政支出は120万元以上節約されました。
技術的背景と主要な課題
住所データは非構造化かつ地域性が高い特徴を持っています。特に中国語の住所は複雑で、省市区町村五級行政区画、道路レベル(街/路/巷/弄)、方位詞(東/西/南/北段)、括弧内の補足説明など、様々な形式が含まれます。さらに、略語(「南京东路」 vs 「沪东宁路」)、別名(「新街口广场」 vs 「中山路1号」)、誤字脱字などの問題も存在します。
動作原理の詳細解説
MGeoはSentence-BERTアーキテクチャを使用し、2つの入力住所を固定次元のベクトル表現にエンコードし、それらのセマンティックな近さを余弦類似度で測定します。
モデルアーキテクチャ設計
import torch
import torch.nn as nn
from transformers import AutoModel, AutoTokenizer
class AddressMatcher(nn.Module):
def __init__(self, model_name='hfl/chinese-roberta-wwm-ext'):
super().__init__()
self.bert = AutoModel.from_pretrained(model_name)
self.dropout = nn.Dropout(0.1)
self.classifier = nn.Linear(768, 1)
def encode(self, texts):
inputs = tokenizer(texts, padding=True, truncation=True,
max_length=64, return_tensors="pt").to(device)
outputs = self.bert(**inputs)
embeddings = outputs.last_hidden_state[:, 0, :]
embeddings = torch.nn.functional.normalize(embeddings, p=2, dim=1)
return embeddings
def forward(self, text1, text2):
vec1 = self.encode(text1)
vec2 = self.encode(text2)
similarity = torch.cosine_similarity(vec1, vec2)
return similarity
実装と運用
以下の手順でMGeoモデルを展開し、実際のデータクリーニングプロセスを実行しました。
環境準備とイメージのデプロイ
docker pull registry.aliyun.com/mgeo/v1.0-cuda11.7
docker run -it --gpus '"device=0"' \
-v /data/traffic:/root/workspace \
-p 8888:8888 \
--name mgeo-infer \
registry.aliyun.com/mgeo/v1.0-cuda11.7
コンテナ内での設定と実行
docker exec -it mgeo-infer bash
conda activate py37testmaas
cp /root/推理.py /root/workspace/inference_road.py
推論スクリプトの実行
import pandas as pd
from mgeo import MGeoModel, MGeoTokenizer
tokenizer = MGeoTokenizer.from_pretrained("mgeo-base")
model = MGeoModel.from_pretrained("mgeo-base")
model.eval().cuda()
def load_address_pairs(csv_path):
df = pd.read_csv(csv_path)
pairs = [(row['addr1'], row['addr2']) for _, row in df.iterrows()]
return pairs
def batch_inference(pairs, batch_size=128):
results = []
for i in range(0, len(pairs), batch_size):
batch = pairs[i:i+batch_size]
addrs1 = [p[0] for p in batch]
addrs2 = [p[1] for p in batch]
inputs = tokenizer(addrs1, addrs2, padding=True,
truncation=True, max_length=64,
return_tensors="pt")
inputs = {k: v.cuda() for k, v in inputs.items()}
with torch.no_grad():
similarity = model(**inputs).cpu().numpy()
results.extend(similarity.flatten().tolist())
return results
pairs = load_address_pairs("/root/workspace/road_facilities_pairs.csv")
scores = batch_inference(pairs)
result_df = pd.DataFrame({
"address1": [p[0] for p in pairs],
"address2": [p[1] for p in pairs],
"similarity_score": scores,
"is_match": ["是" if s > 0.85 else "否" for s in scores]
})
result_df.to_csv("/root/workspace/match_results.csv", index=False)
コスト効果分析と経験のまとめ
プロジェクトの経済効果は以下の通りです:
| 項目 | 従来の手法 | MGeo AI手法 | 節約額 |
|---|---|---|---|
| 人件費 | 108万 | 3万 | 105万 |
| 時間 | 180日 | 7日 | 173日前倒し |
| 修正コスト | 20万 | <2万 | 18万 |
| 合計 | 128万 | 5万 | 123万 |
結論と展望
MGeoの成功は、オープンソースAI技術が政府のデジタル化に大きな価値をもたらすことを示しています。短期的には交通施設データの資産管理を支援し、中期的には他の部門への展開、長期的にはスマートシティの実現に向けた取り組みが期待されます。