王 昕,李衛(wèi)紅*,童昊昕
(1. 華南師范大學地理科學學院,廣州 510631; 2. 航天精一(廣東)科技有限公司研究院,廣州 510631)
地理信息的持續(xù)泛化已成為新地理信息時代的重要特征[1-2],隨著位置大數據的廣泛應用,產生了海量諸如地址的位置大數據. 地址數據是泛化的地理數據,包括文字描述和位置描述,即語義地址信息和空間地址信息. 傳統(tǒng)的地址實體表示方法可以分為2類:一是基于數字的經緯度定位方法,二是通過文本來對地址實體進行表示. 地址實體的文本表示實際上是地理編碼問題,在這個信息化時代,如何使地址實體準確地被計算機理解并計算,這是至關重要的問題,大量學者對此進行研究[3-5]. 然而,地址實體不僅包含豐富的語義信息,也包含了大量空間信息,過分關注語義信息而忽略空間信息容易造成2種現象:一是地址實體語義相似而空間距離不相近;二是空間距離相近而地址實體語義不相似. 例如,華南師范大學和華東師范大學,一字之差卻有1 400公里之遠;百腦匯電腦城和中山大學附屬第三醫(yī)院相距不到一百米,字面上卻毫無關聯(lián). 因此,如何將地址實體的語義信息與空間信息有效結合是解決上述問題的關鍵.
知識圖譜[6-7]作為人工智能領域的研究熱點,在知識的獲取、表示、融合和推理上具有顯著的特點. 隨著衛(wèi)星遙感與傳感器技術的迅猛發(fā)展,大量基于位置的地理數據被人們獲取與使用. 學者們將知識圖譜技術引入到地理科學研究中:探討地理知識圖譜的構建與應用[8]、語料庫的構建[9-11]、地理實體和關系的抽取[12-13];實現地理學的“數據—信息—知識—智慧”的智能化轉化[14];使用知識增強技術,構建能夠智能交互的虛擬地理環(huán)境服務框架[15];借助知識嵌套技術,對包含時間和空間的軌跡數據進行知識表示,挖掘人們的日常習慣[16];利用深度遞歸神經網絡,對社交媒體數據進行地理實體的消歧工作[17]. 知識圖譜技術的廣泛應用,加速了海量地理數據向地理信息的轉變,同時也為地理學者們擴展了地理學研究的新思路. 然而,知識圖譜在本質上是一種結構化的語義網絡,用來表示知識之間的相互聯(lián)系,構建實體之間的關系網絡,從而進行知識的相關計算,在這過程中對知識進行表示是知識圖譜構建與應用的關鍵步驟[18]. 知識的表示學習[19]的目的是將知識庫中實體和關系用低維的稠密向量來表示:在低維空間中,對象向量間距離越近則表示語義相似度越高,而對象向量間距離越遠則表示語義相似度越低. 知識的表示學習能夠高效計算實體與關系間的語義聯(lián)系,量化對象之間的語義緊密程度,從而提高低頻對象的精確性[20]. 然而,目前關于融合語義關系和空間關系的地址實體表示學習的研究較少.
為解決地址實體語義相似而空間距離不相近或空間距離相近而語義不相似的問題,本文運用知識的表示學習技術,將地址實體的語義信息和空間信息進行融合,通過實體間的向量距離來衡量地址的相似程度:以廣州市天河區(qū)的標準地址數據為數據源,根據地址層級關系進行拆分,結合地址之間的空間關系和語義關系,構建空間地址三元組;運用表示學習模型TransE和TransH進行訓練,將地址實體表示為低維的稠密向量,通過元組分類和實體間的向量距離來評估2個模型在地址表示學習中的優(yōu)劣;最后分別比較地址實體的實際距離、語義相似度和實體間的向量距離. 本研究將有助于更精準地構建地理知識圖譜,為地理知識圖譜的表示學習提供方法借鑒,為地理信息科學在知識圖譜領域的研究提供新的研究思路.
2013年,BORDES等[21]提出了TransE模型,該模型基于實體和關系的分布式向量表示,其核心思想為:當(h,r,t)成立時應有h+r≈t(圖1),即將每個三元組實例(head,relation,tail)中的關系r看做從頭實體向量h到尾實體向量t的翻譯,通過不斷調整h、r和t,使h+r盡可能與t相等,從而達到學習的目的.
圖1 TransE模型核心思想圖
基于TransE模型的核心思想,BORDES等[21]的TransE實驗中為三元組定義了一個得分函數,即通過頭實體h和關系r之和與尾實體t的差的L1或L2距離來衡量其合理性,TransE的得分函數為:
fr(h,t)=‖h+r-t‖L1/L2,
(1)
其中,h是頭實體,r是關系,t是尾實體,L1、L2分別為第一、第二范式. 對于一個正確的三元組,期望其得分越小越好;而對于一個錯誤的三元組,則期望其得分越高越好. TransE模型得分函數值的大小可以幫助訓練模型區(qū)分正負樣本. 由此,可以得到基于margin的合頁損失函數為:
(2)
其中,[x]+表示x大于0時取原值,x小于0時取0;γ表示用以區(qū)分正負三元組的超參數margin,本文取γ=1;S表示正例三元組的集合,S′表示被隨機替換了頭實體或尾實體的負例三元組的集合.
TransE模型訓練的偽代碼[21]如下:
Input: Training setS={(sub,rel,obj)},marginγ,learning rate
r←/‖‖ for each
Loop
e←e/‖e‖ for each entity ent
Sbatch←sample(S,b) ∥sample minibatch of sizeb
Tbatch←? ∥initialize set of pairs
(sub′,rel,obj′)←sample(S′(sub,rel,obj)) ∥sample negative triplet
Tbatch←Tbatch∪{((sub,rel,obj),(sub′,rel,obj′))}
end for
End loop
TransE模型具有參數少、計算復雜度低的優(yōu)點,但在處理非一對一關系時存在缺陷,因此,WANG等[22]對TransE模型進行了改進,提出了TransH模型. 為了解決模型在處理不同關系時需要賦予不同的關系向量這一問題,TransH模型為每個關系r定義了一個超平面,并用關系r在該平面上的平移向量r′和法向量w來進行表示. 其核心思想為:給定一個真實三元組(h,r,t),頭實體向量h和尾實體向量t沿法向量w投影到超平面上,并在超平面上進行翻譯(圖2). 其得分函數為:
(3)
圖2 TransH模型核心思想圖
在實際情況中,關系對應的頭尾實體是不平衡,即存在非一對一關系,采用隨機負采樣的方法來替換頭尾實體并不合理,因此,TransH采用伯努利負采樣的方法來構造負例三元組:如果關系是一對多的,則使用更大的概率來替換頭實體,反之則使用更大的概率來替換尾實體. 具體步驟如下:
第一步,需要在所有三元組中統(tǒng)計每個頭實體的平均尾實體數(記為Nt)、每個尾實體的平均頭實體數(記為Nh),定義一個帶抽樣參數的伯努利分布為:
(4)
第二步,在訓練過程中,以P(X=1)的概率來替換頭實體,構造負例三元組;以P(X=0)的概率來替換尾實體,構造負例三元組.
研究區(qū)域選擇廣州市天河區(qū),共計118 807個標準地址數據,數據包括地址名稱和地址經緯度. 根據2009年國家標準化管理委員會發(fā)布的數字城市地理信息公共平臺地名/地址編碼規(guī)則[23],結合實際地址命名情況,標準地址名稱大致分為5級地址:行政區(qū)域地名、街巷名、小區(qū)名、門(樓)址和標志物名[23]. 如“廣東省廣州市中山大道華南師范大學”的層級關系可以劃分為“省-市-街道-興趣點”(表1). 本研究以此為依據對標準地址名稱進行拆分,選取興趣點名稱作為地址實體的名稱,地址實體的各級街道、街路巷和用地類型作為實體之間的關系名稱.
表1 地址層級關系示例Table 1 The instances of address hierarchy
本文使用RDF的數據描述方式,即將實體與關系表示為RDF數據三元組形式(頭實體,關系,尾實體)或記為(h,r,t),將地址三元組表示為(地址實體名稱,空間關系/語義關系,層級實體名稱),地址的層級劃分為4級:居村委、街路巷、用地類型和信息點. 在設定鄰近距離閾值時,如果閾值設定過大,會導致產生的鄰近關系過多,影響訓練效率;如果閾值設定過小,則產生的鄰近關系數量太少,無法準確描述實際情況. 經過多次實驗分析,選取50 m為鄰近距離閾值,并根據每個信息點的經緯度來劃分信息點的鄰近關系,最終生成了1 420 769條三元組(表2),根據空間地址三元組構建地址知識圖譜,圖譜示例見圖3.
表2 數據規(guī)模Table 2 The data scale 條
圖3 地址知識圖譜展示
將三元組分別按照TransE和TransH要求的數據格式輸入,模型訓練的參數設置如下:隨機梯度下降學習率為0.01、margin為1、batch為5 000、維度k為128、迭代次數為2 000;經過訓練后,兩模型的得分值loss均從20下降至0.1以下,最終得到地址實體的向量化表示. 模型訓練流程如圖4所示,以向量化的實體為基礎進行元組分類和距離評估.
圖4 TransE模型和TransH模型的訓練流程圖
本研究的目標是從地址知識庫中抽取出空間地址三元組數據集,分別使用TransE模型和TransH模型進行訓練,得到實體的向量化表示;根據實體間的向量距離來比較2個模型在空間地址三元組數據集中的優(yōu)劣;通過選取測試樣本分別計算實體空間距離、實體語義相似度和實體間的向量距離,通過對比分析驗證本實驗所解決的空間關系和語義關系不一致問題.
2.3.1 實現TransE模型和TransH模型的算法 基于TransE模型,使用開源庫TensorFlow進行模型訓練,其實現過程中最關鍵的步驟是計算圖的設計和負例三元組的構建:
(1)TransE模型實驗及部分代碼實現. 本實驗先將序列化的實體、關系和訓練樣本進行內存讀??;訓練時,對每個epoch、每個batch、每個樣本計算正例三元組的loss和負例三元組的loss,通過隨機梯度下降更新模型嵌入,生成模型文件. TransE模型在Tensorflow的計算圖python代碼如下:
def build_graph_TransE(self):
self.headEntityVector=tf.placeholder(tf.int32,[None],name=“headEntityVector”)
self.tailEntityVector=tf.placeholder(tf.int32,[None],name=“tailEntityVector”)
self.relationVector=tf.placeholder(tf.int32,[None],name=“relationVector”)
self.ones=tf.placeholder(tf.float32,[None],name=“one”)
self.headEntityVectorWithCorruptedTriplet=tf.placeholder(tf.int32,[None],name=“headEntityVectorWithCorruptedTri-plet”)
self.tailEntityVectorWithCorruptedTriplet=tf.placeholder(tf.int32,[None],name=“tailEntityVectorWithCorruptedTri-plet”)
headEntityVector_embedding=tf.nn.embedding_lookup(self.embedding,self.headEntityVector)
tailEntityVector_embedding=tf.nn.embedding_lookup(self.embedding,self.tailEntityVector)
relationVector_embedding=tf.nn.embedding_lokup(self.embedding,self.relationVector)
headEntityVectorWithCorruptedTriplet_embedding=tf.nn.embedding_lokup(self.embedding,self.headEntityVectorWithCorruptedTriplet)
tailEntityVectorWithCorruptedTriplet_embedding=tf.nn.embedding_lokup(self.embedding,self.tailEntityVectorWithCorrup-tedTriplet)
headtailrel=tf.subtract(tf.add(headEntityVector_embedding,relationVector_embedding),tailEntityVector_embedding)
headtail_corrupted=tf.subtract(tf.add(headEntityVectorWithCorruptedTriplet_embedding,relationVector_embedding),tailEntityVectorWithCorruptedTriplet_embedding)
headtailrel_square_sum=tf.reduce_sum(tf.pow(headtailrel,2),1)
headtailrel_corrupted_square_sum=tf.reduce_sum(tf.pow(headtailrel_corrupted,2),1)
headtailrel_loss=tf.subtract(headtailrel_square_sum,headtailrel_corrupted_square_sum)
loss=tf.add(headtailrel_loss,self.ones)
loss_max=tf.nn.relu(loss)
loss_v=tf.reduce_mean(loss_max)
optimizer=tf.train.AdamOptimizer(0.01)
train_op=optimizer.minimize(loss_v)
returnatrain_op,loss_v,headEntityVector_embedding,tail-EntityVector_embedding,headEntityVectorWithCorruptedTriplet_embedding,tailEntityVectorWithCorruptedTriplet_embedding,relationVector_embedding
(2)TransH模型實驗及代碼實現. TransE模型和TransH模型的算法計算流程相似,不同之處在于:模型訓練過程中,需要設計一個平面嵌入向量w,計算不同樣本的正負例三元組時,要用投影在平面上的頭尾實體向量來計算loss,且采用伯努利負采樣的方法構造負例三元組. TransH模型在Tensorflow的計算圖 python代碼如下:
def build_graph_TransE(self):
_w=tf.get_variable(name=“w”,shape=[128,1],dtype=tf.float32)
w=tf.nn.l2_normalize(_w,name=“L2_normalize_w”)
self.headEntityVector=tf.placeholder(tf.int32,[None],name=“headEntityVector”)
self.tailEntityVector=tf.placeholder(tf.int32,[None],name=“tailEntityVector”)
self.relationVector=tf.placeholder(tf.int32,[None],name=“relationVector”)
self.ones=tf.placeholder(tf.float32,[None],name=“one”)
self.headEntityVectorWithCorruptedTriplet=tf.placeholder(tf.int32,[None],name=“headEntityVectorWithCorrupted-Triplet”)
self.tailEntityVectorWithCorruptedTriplet=tf.placeholder(tf.int32,[None],name=“tailEntityVectorWithCorruptedTrip-let”)
headEntityVector_embedding=tf.nn.embedding_lookup(self.embedding,self.headEntityVector)
tailEntityVector_embedding=tf.nn.embedding_lookup(self.embedding,self.tailEntityVector)
relationVector_embedding=tf.nn.embedding_lokup(self.embedding,self.relationVector)
headEntityVectorWithCorruptedTriplet_embedding=tf.nn.embedding_lokup(self.embedding,self.headEntityVectorWithCorruptedTriplet)
tailEntityVectorWithCorruptedTriplet_embedding=tf.nn.embedding_lokup(self.embedding,self.tailEntityVectorWithCorruptedTriplet)
headEntityVector_embedding_w=tf.matmul(tf.matmul(headEntityVector_embedding,w),tf.transpose(w))
tailEntityVector_embedding_w=tf.matmul(tf.matmul(tail-EntityVector_embedding,w),tf.transpose(w))
headEntityVectorWithCorruptedTriplet_embedding_w=tf.matmul(tf.matmul(headEntityVectorWithCorruptedTriplet_embedding,w),tf.transpose(w))
tailEntityVectorWithCorruptedTriplet_embedding_w=tf.matmul(tf.matmul(tailEntityVectorWithCorruptedTriplet_embedding,w),tf.transpose(w))
headtailrel=tf.subtract(tf.add(headEntityVector_embedding-headEntityVector_embedding_w,relationVector_embedding),tailEntityVector_embedding-tailEntityVector_embedding_w)
headtail_corrupted=tf.subtract(tf.add(headEntityVectorWithCorruptedTriplet_embedding-headEntityVectorWithCorrup-tedTriplet_embedding_w,relationVector_embedding),tailEntity-VectorWithCorruptedTriplet_embedding-,tailEntityVectorWithCorruptedTriplet_embedding_w)
headtailrel_square_sum=tf.reduce_sum(tf.pow(headtailrel,2),1)
headtailrel_corrupted_square_sum=tf.reduce_sum(tf.pow(headtailrel_corrupted,2),1)
headtailrel_loss=tf.subtract(headtailrel_square_sum,headtailrel_corrupted_square_sum)
loss=tf.add(headtailrel_loss,self.ones)
loss_max=tf.nn.relu(loss)
loss_v=tf.reduce_mean(loss_max)
optimizer=tf.train.AdamOptimizer(0.01)
train_op=optimizer.minimize(loss_v)
returnatrain_op,loss_v,headEntityVector_embedding,tail-EntityVector_embedding,headEntityVectorWithCorruptedTriplet_embedding,tailEntityVectorWithCorruptedTriplet_embedding,relationVector_embedding
(3)TransE模型的負例三元組的構建python代碼如下:
def getCorruptedTriplet(self,triplet):
i=uniform(-1,1)
if i<0:
while True:
entityTemp=sample(self.entityList,1)[0]
if(entityTemp,triplet[1],triplet[2]) not in self.filter: break
corruptedTriplet=(entityTemp,triplet[1],triplet[2])
else:
while True:
entityTemp=sample(self.entityList,1)[0]
if(triplet[0],entityTemp,triple[2]) not in self.filter:
break
corruptedTriplet=(triplet[0],entityTemp,triplet[2])
return corruptedTriplet
(4)TransH模型的負例三元組的構建python代碼如下(本實驗中,每個頭實體的平均尾實體數為13,每個尾實體的平均頭實體數為18):
def getCorruptedTriplet(self,triplet):
i=uniform(0,31)
if i<13:
while True:
entityTemp=sample(self.entityList,1)[0]
if(entityTemp,triplet[1],triplet[2]) not in self.filter:
break
corruptedTriplet=(entityTemp,triplet[1],triplet[2])
else:
while True:
entityTemp=sample(self.entityList,1)[0]
if(triplet[0],entityTemp,triple[2]) not in self.filter:
break
corruptedTriplet=(triplet[0],entityTemp,triplet[2])
return corruptedTriplet
2.3.2 模型評估 由于本實驗選擇的數據集為空間地址三元組,無法通過已有知識進行推理預測,例如A地址與B地址是鄰近關系,B地址與C地址是鄰近關系,無法證明A地址與C地址也是鄰近關系. 因此,本實驗不選擇鏈接預測和文本關系事實抽取作為評估方法. 考慮到地址實體間除了包含語義關系,還包含有空間距離關系,因此,本實驗選擇元組分類和向量距離評估作為模型評估方法.
元組分類是指判斷一個給定的三元組(h,r,t)是否屬于正確的三元組,實質上是一個二分類任務. 例如:給定一個三元組(吉祥公寓火車東站店,Near,Otto2美學館),計算頭實體向量加關系向量與尾實體向量之間的距離(h+r-t),根據h+r-t是否小于閾值來判斷三元組是否正確(通過驗證集來確定閾值大小).
通過隨機選取1 000條三元組來構造測試數據集,得到TransE模型和TransH模型的分類準確率分別為71.7%和88.5%. 從分類準確率的結果來看,TransH模型確實優(yōu)于TransE模型,其原因在于:在中文地址數據集中非一對一關系較多,因此,引入了超平面投影的TransH模型在中文地址數據集中的三元組分類任務表現較為優(yōu)秀,表明對復雜關系的建模在中文地址數據的向量離散化任務中是有優(yōu)化作用的.
距離評估是指在不同模型中,分別計算正負例三元組中實體間的向量距離(h+r-t),根據翻譯模型訓練的機制(即縮小正例三元組中h+r與t之間的距離,增大負例三元組中h+r與t之間的距離),以此來評估模型的優(yōu)劣.
通過1∶1關系構造正負三元組驗證集,分別計算其在TransE模型和TransH模型中的向量距離,由結果(表3)可知:TransH模型在正例三元組中實體間的向量距離(0.525)優(yōu)于TransE模型的(0.531),然而TransE模型在負例三元組中實體間的向量距離(1.388)優(yōu)于TransH模型的(1.379);TransE模型的正負例距離差(0.857)略優(yōu)于TransH模型的(0.854),表明TransE、TransH模型對同一三元組的實體距離的訓練結果是相似的.
表3 三元組中實體間的向量距離Table 3 The vector distance between entities of a triple
然而,選取相同的3個地址實體進行對比分析,由結果(圖5,圖6)可知:
(1)無論是TransE模型還是TransH模型,存在關系的兩實體的向量距離確實比不存在關系的兩實體的向量距離要小得多. 例如,在TransE模型的訓練結果中,吉祥公寓火車東站店與Otto2美學館的向量距離(0.545)遠小于吉祥公寓火車東站店與匯悅臺東門幼兒園的向量距離(1.414);在TransH模型的訓練結果中,吉祥公寓火車東站店與Otto2美學館的向量距離(0.533)同樣遠小于吉祥公寓火車東站店與匯悅臺東門幼兒園的向量距離(1.335).
(2)在TransH模型中,存在鄰近關系的實體間的向量距離要小于不存在鄰近關系的實體間的向量距離. 例如,不存在鄰近關系的吉祥公寓火車東站店與匯悅臺東門幼兒園的向量距離(1.335)大于不存在任何關系的賓館與幼兒園的向量距離(1.235);而存在鄰近關系的吉祥公寓火車東站店與Otto2美學館的向量距離(0.533)小于存在街路巷關系的Otto2美學館與天譽社區(qū)的向量距離(0.552).
(3)TransE模型中,通過向量距離表現實體語義關系的情況并不明顯. 例如,存在鄰近關系的吉祥公寓火車東站店與Otto2美學館的向量距離(0.545)小于存在街路巷關系的吉祥公寓火車東站店與林和街道的向量距離(0.601),卻大于存在居村委關系的Otto2美學館與天譽社區(qū)的向量距離(0.513).
從表2可以發(fā)現地址三元組數據集中鄰近關系的數量遠遠大于其他幾種語義關系,空間關系相較于語義關系的復雜程度更高,由此可以推測:TransH模型相較于TransE模型,更加注重于對復雜關系的建模.
圖5 TransE模型中實體間的向量距離
圖6 TransH模型中實體間的向量距離
由上述元組分類和向量距離評估的結果可知:TransH模型優(yōu)于TransE模型. 因此,選擇TransH模型的訓練結果作為評判本研究所要解決的傳統(tǒng)地址實體語義和空間相似性不一致問題的量化標準.
選取6個地理實體,分別為:太平洋電腦城、百腦匯電腦城、怡東電腦城、火炬大廈、壬豐大廈、摩登百貨,后文依次用A、B、C、D、E、F替代. 通過兩點經緯度坐標計算各地理實體間的直線距離:L(AB)=0.1 km,L(AC)=0.2 km,L(DE)=0.5 km,L(DF)=0.2 km;通過TransH模型訓練得到的實體向量分別得到各地理實體間的向量距離:V(AB)=1.131,V(AC)=0.551,V(DE)=1.312,V(DF)=0.571. 針對地理實體語義相似性的計算,考慮到地理實體為短文本,故選用較為簡單高效的余弦相似度計算方法,得到各地理實體間的語義距離:S(AB)=0.67,S(AC)=0.58,S(DE)=0.5,S(DF)=0,由此可以看出:(1)V(AC) 傳統(tǒng)研究中僅使用地址語義關系來計算兩地址實體的相似程度,存在距離相近而語義不相似或語義相似而距離不相近的問題,針對這個問題,本文提出使用知識表示學習的方法對地址實體進行向量化表示. 通過對比TransE模型和TransH模型的訓練結果,驗證了在地址實體的表示學習任務中,TransH模型的表示學習效果明顯優(yōu)于TransE模型. 空間關系和語義關系的結合,能夠很好地解決地址實體之間可能存在的語義和空間不一致的問題,更好地通過向量間距離來表示地址實體之間的緊密程度. 同時,中文數據集在知識表示學習中的使用,能夠豐富翻譯模型在中文數據集的知識表示研究,也能幫助我們更好地針對中文文本進行文本語義研究,方便將研究進行成果轉化.3 結論