王德強,郭旦懷,張 舒,曹榮強,王彥棡
1(中國科學院 計算機網絡信息中心,北京 100190)
2(中國科學院大學,北京 100049)
食源性疾病是當今世界普遍存在的問題,過去的幾十年里世界各大洲均有食源性疾病的暴發.由于食源性疾病本身的特點(就醫比例低),其漏報率相當高,目前的監測系統監測到的病例僅僅是實際發病病例的冰山一角.隨著大數據時代的到來[1],給食源性疾病的探測和預警帶來了新的思路.基于用戶行為對疾病的區域風險進行預測成為了可能.基于用戶行為的疾病預測主要分為使用搜索數據和社交媒體數據.在搜索數據方面,2008年Google 提出Google Flu 平臺對全球的流感疫情進行估測[2],2014年百度上線百度預測平臺,其中也包括疾病預測[3].使用搜索數據進行公共衛生事件的探測,由于其定位依據是用戶使用的IP 地址,其空間精度較低.比較適合于對空間精度要求不高的群體性分析[4].基于社交媒體方面的研究較少,芝加哥政府利用監督學習算法監測識別twitter 中關于可能的食源性疾病的內容,并通過twitter 做出相應的響應[5].郭旦懷等人通過社交媒體數據對食源性疾病事件進行聚類分析和風險評估[6].如何從社交媒體中快速識別出由于食源性疾病事件,并且推測出事件的關鍵信息,如地理坐標等,成為一個非常關鍵的問題.Chandra 等人利用概率模型等利用Twitter 用戶常用的關鍵詞構建了city 級別的twitter 用戶的位置推測模型[7].祝天剛等使用TextRank 以及動態上下文推斷算法對社交媒體中的食源性疾病事件進行探測[8].在食源性疾病風險預測方面,郭旦懷[6]等使用多源大數據對食源性疾病風險進行預測,但并未構建一個完整的系統平臺.蔡皎潔等[9]基于語義挖掘構建了食源性疾病安全預警系統,但只使用了食品檢測數據,未能使用多源大數據.本文基于多源大數據,面向食源性疾病事件的數據獲取、數據分析、數據可視化整個過程,構建了一個完整的大數據系統.
食源性疾病由于其成因的多樣性以及不確定性,每年都會造成巨大的社會經濟損失.由于其成因復雜,需要使用多種數據進行分析,因此需要平臺能夠快速的從互聯網中獲取到食源性疾病事件的相關信息,并且準確的識別食源性疾病事件,推斷出其關鍵信息.互聯網中雖然包含著海量數據,但是由于數據的來源不同,結構也不盡相同,需要對數據進行有效融合.對于多源數據,數據之間的關聯變的不易被發現,通過數據挖掘的方法能夠有效找出數據之間潛在的關聯,對食源性疾病進行有效預測,同時對于預測的結果,以及獲取的數據,平臺需要提供高效的可視化方法和交互方式.基于以上需求,本文開發了食源性疾病事件智能探測與預警平臺.
在本文中,我們關注于搭建一整套面向食源性疾病事件探測與風險預警的原型系統.系統整合針對食源性疾病的多源數據獲取,數據融合,事件探測與關鍵信息推斷,風險預測與模型評價.系統采用分層的方式進行開發,主要分為數據(Data),模型 (Model),可視化(Visualization)三層,系統結構如圖1.

圖1 平臺系統結構
本文將系統劃分大數據采集模塊,數據融合與存儲模塊,事件探測與信息推斷模塊,模型自適應選擇模塊以及可視化與交互模塊.
大數據采集模塊主要集成了分布式爬蟲系統,由于影響食源性疾病的因素眾多且機理復雜,所以需要多種數據進行分析,互聯網中包含官方統計數據、社交媒體數據等海量數據,官方統計數據格式清晰,可信度高.社交媒體中包含大量信息,其中也包括著食源性疾病事件的相關信息.大數據采集模塊能夠快速地從互聯網中獲取環境數據、社會經濟數據、基礎地理數據、出行數據、社交媒體等數據,并且將獲取到的數據存儲在分布式數據庫中;數據融合與存儲模塊主要包括多源異構的數據融合與時空數據的存儲,由于本文使用的數據來源很多,面對多源異構數據,本文開發了基于時空索引的數據融合算法,并且根據時空索引建立時空數據庫,能夠高效讀取數據;事件探測與信息推斷模塊主要針對社交媒體數據中的食源性疾病事件,由于社交媒體中雖然富含大量信息,但同時也包含著大量噪聲.以微博為例,即便是微博中包含食源性疾病的關鍵字,也未必是一個食源性疾病事件.對于社交媒體中食源性疾病事件的識別,本文開發了基于短文本分類的事件探測算法.一條微博包含的信息十分有限,很多關鍵信息,如地理坐標信息,并不能包含在單條微博當中,本文采用動態上下文的推斷策略推測食源性疾病事件的地理位置信息;自適應模型選擇模塊中集成了多種風險預測模型,由于不同地區爆發的食源性疾病可能表現出不同的特點,需要使用多種模型進行預測.預測結果通過統一的模型選擇指標,對模型進行自適應選擇;可視化與交互模塊主要對多源數據以及風險預測結果進行可視化,以及整合平臺與用戶之間的交互功能.
傳統的的數據分析系統通常是集成數據處理、計算、可視化在一臺服務器上或者一個計算節點上,當數據量較小時,這樣的系統結構可以充分的勝任.當數據規模逐漸增大,尤其當數據源有多個時,單機的性能往往不能同時勝任大規模、多源數據的計算和可視化任務.通過將數據處理(Data)、模型計算(Model)、可視化計算(Visualization)分離的方式來解決性能瓶頸的問題[10],本文系統也基于D-M-V 分層架構進行開發,系統結構如圖2所示.

圖2 系統主要模塊
面向服務的體系結構(Service-Oriented Architecture,SOA),是一個組件模型,它將應用程序的不同功能單元(稱為服務)通過這些服務之間定義良好的接口和契約聯系起來.通過SOA 的設計模式,可以將D-MV 的三層結構中每層結構分離開來,降低系統耦合程度,將系統入口統一到Web 頁面進行管理.使用這樣的設計模式,可以將系統的不同組件(例如數據存儲,數據建模和數據可視化)分發到不同的計算機中.基于分布和松散耦合的特性,分析任務可以利用并行計算資源統一的服務接口使得用戶使用系統更加靈活,基于Web 的形式,將復雜的原始數據、多樣的模型和操作系統與用戶隔離開來,同時,使用基于Web 的形式更有利于集成其他基于Web 的服務,如風險地圖等.
TextCNN 是Yoon Kim 在2014年提出的一種用于文本分類的算法[11],主要思路是將CNN (Convolutional Neural Networks)的技術用于文本分類,通過利用多個不同大小的卷積核(kernel)來提取相關句子里的關鍵信息(與多窗口大小的n-gram 模型類似),從而可以更好地捕捉文本的局部相關性.網絡結構主要包括輸入層(input layer)、嵌入層(embedding layer)、卷基層(convolutional layer)、池化層(pooling layer)和輸入層(output layer).
在本平臺的實驗數據集上,使用TextCNN 對含有食源性關鍵字的微博進行事件探測,可以達到最好的分類效果.
模型的自適應選擇主要包括兩個部分,包括對于特征的選擇和對于預測模型的輔助選擇,本文通過對Xgboost 對特征的貢獻進行計算,減去無效的特征,對于模型的選擇,系統提供多種評價指標,包括AUC(Area Under Curve),即受試者工作特征曲線(ROC)下方的面積,精準率(Precision),召回率(Recall),F1 值(F1 Score)等作為模型的評價指標,輔助用戶進行模型選擇.
面向多源網絡數據,平臺集成了分布式爬蟲系統,并基于分布式爬蟲系統開發了多種爬蟲程序,能夠自動抓取社交媒體數據,如微博、美團網評論數據,出行數據如共享單車出行數據,官方統計數據,如國家統計局相關統計數據.
自動數據收集是整個系統的基礎.具體包括自動數據采集和原始數據的存儲.分析所需的數據可以分為靜態數據和動態數據兩類.靜態數據是主要在官方網站上發布的數據更新頻率較低或經常更新的政府或機構.靜態數據提供基本信息,包括數字地圖和其他地理數據,氣候數據,記錄環境特征的遙感數據和社會經濟統計數據.動態數據是從動態更新的網絡媒體和社交網絡收集的數據.微博、美團網評論數據被設置為自動爬蟲的目標.為此我們為不同的數據源部署自動爬蟲,完全不同的數據結構,并保持最新信息被及時檢測和存儲.
靜態數據源提供具有明確地理坐標或位置的結構良好的數據.官方網站通常會定期發布數據.為了接收這些具有可控開銷的靜態數據,收集靜態數據的搜索器被分配定時任務以檢查網站的更新并請求最新發布的數據.由于結構不變,地理標簽明確,所收集的數據在存儲之前不需要太復雜的處理.對于動態數據,自動收集更復雜.為了獲得實時的信息,爬蟲必須不斷地監控新聞和社交媒體的網頁,尋找特殊的關鍵詞,包括突發事件的描述,疾病的名稱等,這些都可以看作是突發事件的標志.
本文開發的分布式爬蟲系統采用Celery (http://www.celeryproject.org/)作為分布式任務隊列,使用Rides 作為分布式后端,使用MongoDB (https://www.mongodb.com/) 作為分布式數據庫,基于Python requests (http://www.python-requests.org/)發送網絡請求及下載頁面,使用beautiful soup4 (https://www.crummy.com/software/BeautifulSoup/)解析頁面,基于Flask (http://flask.pocoo.org/)開發web 界面管理整個數據采集系統.系統結構如圖3所示.
社交媒體網站如微博、美團網等對于爬蟲往往有著嚴格的限制.為此,爬蟲系統建立了IP 池、賬號池解決限制訪問的問題,對于驗證碼則通過CNN 進行驗證碼識別,多次識別錯誤時接入人工打碼平臺進行驗證碼識別.
由于影響食源性疾病的因素眾多,本文采用了多種數據,數據格式與來源見表1.面對多源異構數據,首先要做的是對多源異構數據進行數據融合,置于統一的時空坐標系中.本文所用數據雖然來源眾多,但主要有四種格式,柵格數據、矢量數據、表結構化數據以及文本數據.對于柵格數據和矢量數據主要問題在于不同的數據采用的投影坐標系以及地理坐標系都不盡相同,首先要將其置于統一的時空坐標系當中.本文使用Proj4 (https://proj4.org/) 進行投影坐標轉換,GDAL 庫(https://www.gdal.org/)進行矢量、柵格數據的提取.

圖3 分布式爬蟲系統

表1 多源數據類型與來源
由于直接通過gdal 對時空數據進行讀取比較低效的,為此,在提取時空坐標上的不同屬性信息后,基于空間數據的最小粒度,建立時空數據庫,以時空立方體的形式以進行高效索引.
本文采用的文本數據主要是微博語料數據、美團網評論語料數據,對于事件時間,可以抓取到微博發博時間,評論發送時間來確定,地理坐標則根據下文的地理坐標推斷算法進行推斷.結構化數據本身已經包含了時空信息,可以直接進行使用.
3.3.1 基于短文本分類的時間探測算法
微博等社交媒體數據蘊含了大量的信息,然而由于其本身的特點,其中的噪聲也特別多.為了充分利用微博數據進行食源性疾病的檢測,首先要對數據進行清洗.為了去除干擾的僵尸微博賬戶,本文目前利用用戶的關注粉絲比、微博總量等作為篩選條件,選出真正有價值的微博內容,同時基于短文本分類算法開發了食源性疾病事件探測算法,對微博語料中的食源性疾病進行探測.
常見的短文本分類算法流程如圖4所示,主要包括分詞、去停用詞、詞向量的訓練以及分類器的訓練.傳統的短文本分類算法主要是根據分詞后計算的詞組TF-IDF 權重,然后使用樸素貝葉斯分類器進行分類.本文開發的平臺采用Jieba (https://github.com/fxsjy/jieba) 分詞庫進行分詞,基于sklearn (http://scikit-learn.org/)開發TF-IDF 算法,基于gensim (https://radimrehurek.com/gensim/)開發Word2vec[12]算法,基于TensorFlow(https://tensorflow.google.cn/) 開發Fasttext[13]和Textcnn 算法,平臺集成多種分類算法,并且展現分類效果,供用戶選擇.

圖4 短文本分類流程
3.3.2 基于動態上下文的地理位置推斷算法
由于新浪微博每條所含字數小于140 個字,平均微博長度為30 個字左右,一條微博很難全面準確的描述食品安全事件.由于用戶很有可能會有連續多條微博涉及食源性疾病問題,而其中只有某一條直接含有食源性疾病關鍵詞,其他相關微博可能含有有關食源性疾病的其他重要信息,如地理位置等.那么,簡單地根據關鍵詞篩選單條微博的方法會錯過許多含有重要信息的微博.本文目前研究采用動態上下文確定事件窗口,根據事件窗口確定候選微博.動態上下文窗口,是依據微博之間的語義相似度來確定的,分別向前、向后利用微博間的文本相似性來確定上下文窗口.
地理位置推斷算法流程如圖5所示,對于美團網評論數據,根據店鋪名稱獲得地理位置坐標.對于微博數據,首先對微博文本檢測是否包含地理位置名詞,若包含地理位置名字,則根據地理名稱的Geocoding 獲取地理坐標,若單條微博文本中不包含地理位置信息,則在候選微博集中尋找地理位置信息,若微博上下文中也未包含地理位置信息,則根據用戶注冊地址確定食源性疾病事件地理位置.
在多源數據的基礎上,經過豐富的特征工程,開發了食源性疾病的風險預測算法,使用多種機器學習算法,開發了多種風險預測模型,如邏輯回歸、決策樹、梯度提升樹,隨機森林等,并且提供多種的評測標準.并將多種模型集成在大數據處理平臺上,使用并行化算法優化模型,使得平臺能夠利用多源大數據快速計算食源性疾病爆發的區域風險.
對于模型的結果的展示,本文基于Echarts (https://echarts.baidu.com/)實現基于地圖的風險可視化,交互系統采用Web 形式,基于Flask 開發Web 后臺,前端采用bootstrap UI 以JavaScript 進行開發.

圖5 食源性疾病事件地理位置推斷
通過平臺抓取北京市相關數據,獲取食源性疾病相關微博10 萬條,美團網評論數據500 萬條,結合環境數據、官方統計數據等多源數據,數據來源與格式見表1,系統界面及預測風險如圖6所示.

圖6 2018年6月食源性疾病風險示意圖
本文通過人工標注了的3 萬條包含食源性疾病關鍵字的微博進行訓練,訓練集和測試集的比例為8:2.通過AUC 對分類結果進行評價.實驗結果見表2.

表2 事件探測算法實驗結果
從實驗結果可以看出,使用TextCnn 文本分類算法可以達到最高的分類準確度,能夠較好的識別出短文本中的食源性疾病事件.
根據社交媒體中的病例信息,通過上下文地理位置推斷算法推斷出地理位置后,使用多種模型進行風險預測,在小區域粒度下,預測在給定時間條件下,一個地點是否會發生食源性疾病,通過AUC 進行評價,實驗結果見表3.

表3 風險預測算法實驗結果
從實驗結果可以看出,使用XGBOOST[14]對北京食源性疾病發生的風險進行預測可以達到最好效果.
本文使用大數據與人工智能的方法對食源性疾病事件進行探測和風險預警.面向食源性疾病的數據獲取、數據分析和數據可視化的需求開發了食源性疾病事件智能探測與預警平臺,使用多源數據對食源性疾病事件的風險進行預測與評估,為食源性疾病的管理與防治提供一定的指導作用.