張宇飛 李 騰 賈東立
(河北工程大學信息與電氣工程學院 邯鄲 056000)
隨著物質生活的不斷提高,人們越來越重視精神生活的享受,這使得旅游業越發受到大家的追捧。然而由于景區特點各異,信息量龐大又復雜,而且網絡上存在的數據良莠不齊,使游客很難在短時間內得到自己需要的精確信息[1]。鑒于此,有學者提出將知識圖譜應用到旅游領域,如徐溥、劉濟源[2]等都對旅游領域的知識圖譜進行了設計和構建。
河北省內不僅景點數量多(截止2020 年初,含有5A 級景點10 個,4A 級景點約130 個),還有許多像狼牙山、西柏坡等具有良好教育意義的經典紅色旅游景區,是名副其實的旅游大省。有學者通過DEMATEL 模型得出了‘旅游管理對旅游的發展作用力最強’的結論[3],但是目前河北省并沒有權威完善的智能化旅游管理平臺。因此本文選擇河北省作為研究對象,構建旅游景點知識圖譜,以幫助提高河北省旅游信息的檢索效率。
信息抽取是將需要的知識單元從大量異構的數據源中自動獲取的過程[4],對于不同結構的數據需要采用不同的抽取方法。本文選擇互動百科、百度百科、攜程網和去哪兒網四個網站作為數據來源,對于這類面向web 的半結構化數據通過網絡爬蟲的方法[5]在數據獲取的同時完成信息抽取。
選取21 個河北省內3A 級以上的景點作為研究實體在四個網站中進行搜索:對于兩個百科類網站[6],每個詞條都會返回一個類似表格的信息盒,信息盒中的內容即是本文需要的并且結構良好的屬性及屬性值數據;對于兩個旅游類網站,通過分析Html 頁面布局,找到屬性信息存儲的標簽。然后采用火車采集器作為爬蟲工具,根據網頁特點確定規則,獲取每個景點初始的<實體,屬性,屬性值>三元組,信息抽取任務完成。
本文的數據來源于四個不同的網站,所以通過信息抽取過程得到的屬性和屬性值信息在使用時會遇到兩個問題[7]:1)景點的同一屬性在不同來源中表示不同:比如對于景點的所在地這一屬性,在百度百科中的屬性名是地理位置,而在去哪兒網中對應的屬性名是地址。2)同一屬性在不同來源下對應的屬性值不同,分為兩種情況:一是正誤問題,比如對于媧皇宮景點的開放時間,互動百科顯示的值是8:00~17:00,攜程網顯示的是8:00~17:30,而最終的屬性值只能是其中正確的那一個;另一種是信息不完整問題,如景點的別稱通常會有很多個,但是在一個網站中經常會統計不完全。為了解決以上問題,進行以下知識融合。
2.2.1 屬性融合
針對“景點的同一屬性在不同來源中表示不同”的問題,通過屬性融合技術進行解決。為了使融合結果更加準確,將以下兩種方法結合使用。
方法一:使用余弦相似性算法計算相似度[8]。首先將待比較的字符串進行詞頻統計并表示為向量式,然后通過式(1):

計算余弦值,如果計算結果趨于1,代表兩個屬性值相似可進行合并,否則不相似兩個屬性值均保留。實現的核心代碼1如下:
核心代碼1
def cosc(m,n):
v_a=np.mat(m)
v_b=np.mat(n)
num=float(v_a*v_b.T)
den=np.linalg.norm(v_a)*np.linalg.norm(v_b)
cos=num/den
s=0.5+0.5*cos
return s
方法二:根據屬性值判斷屬性的相似性。在擁有兩個相似屬性的實體中,如果它們的屬性值相同的數量占據大多數,那么認為它們表示的是同一屬性,可進行合并。計算式(2)如下[9]:

公式中的分母表示具有該兩種屬性的實體個數,分子代表兩個屬性的屬性值相同的實體個數。
2.2.2 屬性值融合
針對‘同一屬性在不同來源下對應的屬性值不同’的問題,通過屬性值融合技術[10]解決。該問題分為兩種情況,所以屬性值融合過程[11]分為兩個步驟,具體描述如下:
1)根據以上對問題的描述,將本文獲取到的所有屬性分成兩類:
(1)單值屬性:即上文中存在正誤問題的屬性。該類屬性的特點是它的候選屬性值可以有多個,但是它們有對有錯,最后只有一個可以作為最終屬性值,文中此類屬性有:景點名稱、建立時間、門票價格、占地面積、郵編、建議游玩時長、開放時間、海拔高度。
(2)多值屬性:即上文中存在信息不完整問題的屬性。該類屬性的特點是它的候選屬性值可以有多個并且它們可能全部都是正確的,因而最終屬性值是可以存在多個的,文中此類屬性有:景點別稱、相關人物、景區看點、聯系方式、所獲榮譽、相關事件。
2)按照不同類型屬性的特點選擇合適的方法將屬性值進行融合:
(1)對于單值屬性,需要從多個候選屬性值中融合得到最有效最準確的一個作為最終屬性值,因此該問題的重點在于屬性值有效性或者準確度的排序,引用可信度來表示上述的有效性或者準確度。通過式(3)計算出多個候選屬性值的可信度,將可信度排序,最高的一個作為該屬性最終的屬性值。式(3)及參數解釋如下:

其中,m1至m3為自定義參數,本文中m1=10,m2=7,m3=2。E 代表來源的權重,本文定義來源于百科類網站的屬性值權重為4,來源于旅游類網站的屬性值權重為3。N 代表該屬性值出現的次數。L代表屬性值的長度,最短設為1,依次遞增。
(2)對于多值屬性,只需要將多個正確的候選屬性值進行合并然后去重即可融合形成完整的最終屬性值。去除重復屬性值操作相對簡單且方法較多,因為集合中的內容具有不可重復的特點,所以本文利用Python里的集合工具完成此過程。
本體構建屬于知識圖譜的模式層,它用于在邏輯上表達各概念之間的相互關系[12],本文對旅游本體的構建[13]過程如下,圖1 是通過Protégé軟件構建的本體模型。

圖1 本體模型
1)定義實體類別(Thing)
根據河北省旅游景點的特點,定義了景點、地址、級別、季節四類實體。其中景點下分紅色經典景區、自然風光景區和游樂休閑景區三類;地址表示景點所在的地理位置,包括河北省內的11 個城市以及其包含的縣區等地址;級別表示景區的星級,此處有3A 級、4A 級和5A 級;季節表示某景點適宜游客游玩的季節,即春季、夏季、秋季和冬季。
2)定義實體關系(Object Property)
根據定義的實體類別,創建了四種實體間的語義關系:位于——表示景點與地址之間的關系,即景點位于某地址;屬于——表示景點與級別之間的關系,即景點屬于幾星級;包含——表示大地點與小地點之間的含有關系;適宜——表示景點與季節的之間的關系,即景點適宜游玩的季節。
3)定義實體屬性(Data Property)
將經過知識處理后的景點屬性信息進行描述,定義了景點的名稱、別稱、聯系方式、建立時間、占地面積、海拔高度、開放時間、郵編、門票、所獲榮譽、相關事件、著名人物、景區看點、地位、游玩時常15個屬性。
目前存在RDF 和Neo4j 兩種較完善的知識圖譜存儲方法。其中RDF 存儲是通過三元組方式實現對數據的存儲。而Neo4j圖數據庫存儲是通過節點和邊組成圖的形式對數據進行存儲[14]。相比而言,Neo4j圖數據庫在數據操作方面更加的靈活,在數據展示方面更加的直觀,且其存儲速度不會隨著數據的增加而降低[15]。因此本文選擇Neo4j 圖數據庫作為知識存儲工具,采用Cypher語言對旅游信息的存儲命令[16]如下:
1)創建實體部分代碼
create(媧皇宮:自然風光景區{名稱:‘媧皇宮’,建立時間:‘北齊時期’,占地面積:‘76 萬平方米’,開放時間:‘8:00-17:00’,門票:‘70元’})
create(邯鄲市:地點{名稱:‘邯鄲市’})
2)創建關系部分代碼
create(媧皇宮)-[:屬于]->(AAAAA級)
create(媧皇宮)-[:位于]->(涉縣)
通過以上處理步驟,將選取的21 個景點實例以及它們之間的邏輯關系構建完成的知識圖譜結果如圖2 所示,這些節點通過代表實體間關系的邊進行連接最終形成完整的圖譜。

圖2 景點圖譜
圖3 展示的是對景點“媧皇宮”進行查詢得到的結果,除了景點自身的名稱、別稱、占地面積、開放時間等屬性信息外,關于景點位于地址、適宜游玩的季節和景點屬于的星級也是一目了然。

圖3 景點信息查詢
本文以河北省內21 個3A 級以上的景點為例,在數據爬蟲過程中實現了景點信息抽取,通過屬性融合和屬性值融合對景點知識進行了加工,又使用Protégé本體編輯軟件構建了河北省旅游本體,最終將結構化旅游知識存儲到Neo4j圖數據庫中完成了河北省旅游景點知識圖譜的構建。未來的工作將繼續從河北省現狀出發,使該景點圖譜規模更大、功能更完善,實現知識圖譜在旅游領域更廣泛的應用。