吳德平,華 鋼
1(中國礦業大學 信息與控制工程學院,徐州 221008)
2(江蘇安全技術職業學院 網絡與信息安全學院,徐州 221011)
安全生產事關生命財產安全.通過對安全生產事故劃分,對安全生產事故發生的行業、時間、地域、原因、教訓等多個維度展開大數據分析,采用語義分析技術,從客觀的數據中挖掘安全生產事故的特點與規律,為安全生產的應急管理提供科學決策具有重要技術意義和參考價值.本文旨在通過NLP 技術實現安全生產事故大數據分析.圖1是安全生產事故分類的實現流程,通過該流程實現安全生產事故的分類.準備大量的安全生產案例作為語料,jieba分詞工具實現語料分詞,將分詞后的單元輸入Word2Vec模型獲得詞向量,通過K-means 聚類對詞向量實現聚類實現安全生產事故的分類[1].

圖1 安全生產事故分類實現流程
文本表示是把字詞處理成向量或矩陣,以便計算機能進行處理.文本表示是自然語言處理的開始環節.目前常用的文本表示模型有:詞袋模型、主題模型和詞嵌入模型等.詞袋模型主要有One-Hot (獨熱編碼)、n-gram、TF-IDF.本例采用One-Hot 編碼.
One-Hot 編碼,又稱一位有效編碼,其方法是使用N位狀態寄存器來對N個狀態進行編碼,每個狀態都有它獨立的寄存器位,并且在任意時候,其中只有一位有效.本質上是用一個只含一個1,其他都是0 的向量來唯一表示詞語.表1中安全生產事故性質分類為例(僅考慮死亡人數),死亡人數1-9 的一種One-Hot 編碼如表1.

表1 One-Hot 編碼示意
分詞是實現中文文本詞性標注、關鍵詞抽取等功能.jieba 分詞包是Python 中很好的分詞組件,通過加載大量安全生產案例的文本文件,先基于詞典分詞,然后進行詞性標注和發現新詞,同時進行關鍵詞提取完成分詞.同時可使用jieba.suggest_freq(‘事故’,True)調節單個詞語的詞頻,使“事故”能被分出來,提高分詞效果[2-5].
Word2Vec 是Google 推出的用于獲取詞向量的工具包.Word2Vec 作為神經概率語言模型,采用兩種模型(CBOW 和Skip-gram) 與兩種方法(Hierarchical Softmax 和Negative Sampling)的組合.CBOW 是根據某個詞前面的N個詞或前后N個詞計算某個詞概率的模型,其模型如圖2.Skip-gram 是根據某個詞計算它前后出現某幾個詞的各個概率.

圖2 CBOW 模型
CBOW 模型一般采用3 層神經網絡結構,分為輸入層,隱藏層(嵌入層)和輸出層(Softmax 層).CBOW模型輸入上下文詞的One-Hot 編碼,然后連接一個全連接層,再連接若干個層,最后接Softmax 分類器,再通過梯度優化和反向傳播讓模型逼近最小誤差就可以得到詞向量.由于神經網絡模型訓練中生成的詞匯往往數萬以上,這大大降低了神經網絡的訓練速度,本例選用CBOW+負采樣提高訓練速度,該組合具有運算快的特點.任何采樣算法應該保證頻次越高的樣本越容易被采樣出來.負采樣的本質就是每次讓一個訓練樣本更新神經網絡的部分權重.CBOW 模型中詞向量的數量大,神經網絡則有龐大的權重數,不同于原本每個訓練樣本更新所有的權重,負采樣每次讓一個訓練樣本僅僅更新一部分的權重,其他權重全部固定,這樣即可以減少計算量,同時在一定程度上增加隨機性,降低了損失值.具體代碼中loss 函數定義如下:
loss=tf.reduce_mean(tf.nn.nce_loss(weights=nce_we ights,biases=nce_biases,labels=train_labels,inputs=embed,num_sampled=num_sampled,num_classes=words_size)).
train_inputs 是中心詞,train_label 是該中心詞在滑動窗口內的上下文詞.train_inputs 中會有連續n-1(n為滑動窗口大小)個元素是相同的.即同一中心詞.embddings 是要學習的詞向量的存儲矩陣[6-13].
Gensim 是一款開源的第3 方Python 工具包,用于無監督地學習到文本隱層的主題向量表達.主要用于主題建模和文檔相似性處理,在獲取單詞的詞向量等任務中非常有用.Gensim 中集成有CBOW+負采樣算法,Word2Vec 相關的API 都在包gensim.models.Word2Vec 中.本例中設置的主要參數如表2.

表2 Gensim 模型主要參數設定
實驗基于Tensorflow 和Python3.7,取樣1000 個安全生產案例,對100 個詞向量可視化結果如圖3.不難看出這些詞向量以安全生產為主題.主題擬合較好,如發生、事故、經過、事故、原因等;同義詞檢測如年月日時語義相似度很高,數字的一致性檢查很好.

圖3 安全生產案例詞向量可視化
K-means 算法是一種迭代型無監督學習聚類算法,采用距離作為相似性指標,從而發現給定數據集中的K個類,且每個類的中心是根據類中所有值的均值得到,每個類用聚類中心來描K-means 算法是一個重復移動類中心點的過程,把類的中心點,移動到其包含成員的平均位置,然后重新劃分其內部成員.K是算法計算出的超參數,表示類的數量;K-means 可以自動分配樣本到不同的類,但是不能決定究竟要分幾個類,K必須是一個比訓練集樣本數小的正整數.對于詞向量集D={X1,X2,···,Xm},K-means 算法針對聚類的分類C={C1,C2,···,Ck}最小化平方誤差為

其中,μi是第K個聚類的均值向量.每個類的畸變程度等于該類重心與其內部成員位置距離的平方和.若類內部的成員彼此間越緊湊則類的畸變程度越小,反之,若類內部的成員彼此間越分散則類的畸變程度越大.求解成本函數最小化的參數就是一個重復配置每個類包含的觀測值,并不斷移動類重心的過程.其算法如圖4.
由于安全生產事故分類,如重大事故指死亡10 人以上,30 人以下或重傷50 以上,100 以下;或直接經濟損失5000 萬以上,1 億元以下.分類中死亡、重傷人數,特別是財產損失數值范圍很大,特征空間會變得非常稀疏.為了解決這個問題,可通過線性回歸模型,利用半監督學習,即用已有的詞向量確定傷害與死亡、重傷較少人數(取30 人以下)的關聯度X1i、X2i和作為標簽,令相應的權重值分別為W1i、W2i,把經濟損失與傷害人數關聯度Bi視為偏移量,線性回歸的預測函數為:

利用已有的樣本訓練式(2)可確定相應的學習參數,如表3.如對于特大事故,利用學習好的參數W1i、W2i,再利用預測函數(2)和大量樣本確定X1n、X1n和Bn[14-16].

圖4 K-means 聚類算法流程圖

表3 事故性質與關聯參數
對4 類安全事故,聚類簇數K=4,算法開始均值向量取值如下:

將μ1、μ2、μ3、μ4作為初始化聚類中心,然后按照圖4中算法計算,得到最終分類.
取1000 個安全生產事故為樣本,把樣本的詞向量作為聚類的輸入,按照上述實驗,圖示化結果如圖5.圖中,綠色為特大事故,藍色為重大事故,黃色為較大事故,紅色為一般事故。通過得到的詞向量和上述聚類算法,較好的實現安全生產事故分類.在樣本數萬時,分類正確率達93%以上.同時該模型對安全生產事故開展多個維度數據分析也有很好的借鑒意義.

圖5 安全生產事故分類圖