王維建
(上海新華控制技術(shù)(集團)有限公司,上海 200240)
隨著互聯(lián)網(wǎng)的快速發(fā)展,我國的網(wǎng)民數(shù)量快速增加。據(jù)CNNIC發(fā)布的《第39次中國互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計報告》顯示[1],截至2016年12月,我國網(wǎng)民規(guī)模達7.31億,互聯(lián)網(wǎng)的普及率達到53.2%。微博作為分享簡短實時信息的廣播式的社交網(wǎng)絡(luò)平臺,吸引了龐大的用戶群。《報告》顯示,截止至2017年3月31日,微博月活躍用戶已達3.4億。作為新興的媒介,微博依靠其龐大的用戶群數(shù)量和迅速的消息傳播能力,使得一些微博熱點事件能在極短時間內(nèi)廣泛傳播并形成網(wǎng)絡(luò)輿情。有些網(wǎng)絡(luò)水軍也利用這個特點來控制輿論、傳播謠言等,使得微博給不法分子留下了可趁之機。計算微博文本相似度,有助于比較微博之間的關(guān)系,對于識別網(wǎng)絡(luò)水軍、尋找輿論操控者以及打擊傳播違法虛假信息的行為都有重大意義。同樣,計算微博文本相似度的工作為微博傳播路徑構(gòu)建、微博熱點話題檢測和微博輿情檢測等奠定基礎(chǔ)。
微博,即微型博客,源自英文單詞microblog。作為Web 2.0的產(chǎn)物,微博屬于博客的一種形式,但單篇的文本內(nèi)容通常限制在140個字以內(nèi)。這一特點使得微博的信息碎片化,文本本身普遍短小、簡潔,與傳統(tǒng)意義上的文章有較大的差別,使得傳統(tǒng)的用于長文本相似度計算的方法不太適用于微博研究。同時,微博中經(jīng)常包括各種以“@”開頭的用戶ID名稱和各類表情的使用等,大大增大了微博文本處理的難度。因此,如何利用微博短文本的特點設(shè)計高效的微博文本相似度計算算法成為一個難點。
本文提出一種基于公共塊的“對稱-補償”微博文本相似度計算模型,根據(jù)微博文本各個詞之間的相似度、公共塊中詞項的數(shù)量、詞語在微博中出現(xiàn)的順序及微博標簽等屬性來計算微博間的相似度,并設(shè)置一個合理的閾值,當(dāng)相似度大于該閾值時認為兩條微博是“相似的”。
國內(nèi)外研究者已經(jīng)開展了大量的文本相似度計算工作,提出過多種類型的算法。張煥炯、王國勝等[2]提出基于漢明距離的文本相似度計算,王振振、何明等[3]提出基于LDA主題模型的文本相似度計算方法,郭慶琳、李艷梅等人[4]提出利用TF-IDF算法提取特征詞并用向量空間余弦值來衡量文本相似度的算法。但是,這些算法不是專門針對微博短文本,在用于短小簡潔的微博文本相似度計算時效果難免會下降。對于短文本相似度計算,重慶理工大學(xué)黃賢英等人[5]提出基于公共詞塊的英文短文本相似度計算,將傳統(tǒng)文本相似度計算與短文本的特點結(jié)合起來。
微博本身具有簡潔性和隨意性,使得微博文本并不像傳統(tǒng)文本一樣具有較為固定的結(jié)構(gòu)與語法,甚至還可能夾雜一些表情、用戶ID或者網(wǎng)絡(luò)流行用語。微博文本中還可能含有標簽話題,即以“#”開頭和結(jié)尾的、高度概括表達該條微博文本內(nèi)容主題的文字,一般不超過10個字?;诠矇K的“補償-對稱”博文本相似度計算模型將緊密結(jié)合并利用微博的特點進行相似度計算,計算框圖如圖1所示。
圖1 計算流程
微博文本的隨意性,使得它并不像普通傳統(tǒng)性文本有清晰的結(jié)構(gòu)、明晰的格式以及合乎邏輯的語法。微博中常常有一些對計算微博文本相似度的干擾項,如表示各種表情的編碼、以“@”開頭來引用某一用戶ID或者含有系統(tǒng)自帶的“轉(zhuǎn)發(fā)微博”“秒拍視頻”等詞項。正文部分各類標點符號如“,”“?”等,或者是一些常用的停用詞如“哦”“啊”“的”詞,也不利于正確計算微博之間的相似度。所以,對微博文本先進行預(yù)處理顯得十分必要。
預(yù)處理流程如下:
步驟 1:去除微博文本中形如“http∶//”“https∶//”的網(wǎng)址。
步驟2:去除以“#”開頭的微博標簽,并提取儲存用于之后的處理。
步驟3:去除以“@”開頭的微博用戶ID。
步驟4:去除停用詞,停用詞集合A={哦,啊,嗎,阿,哎,哎呀,哎喲,唉,吧,……}共598個詞元素(限于篇幅僅列出部分詞元素)。
步驟5:去除標點符號,標點符號集合B={“,”“。”“!”“?”“:”“、”……}共58個(限于篇幅僅列出部分標點符號)。
整個計算模型的最小子結(jié)構(gòu)是依賴于詞語與詞語之間的相似度。所以,經(jīng)過預(yù)處理后的微博文本,還需要對其進行分詞處理,從而進行后續(xù)計算相似度的工作。
本文提出利用Google開發(fā)的一款開源詞向量計算工具word2vec計算并構(gòu)建兩條微博文本的詞語相似度矩陣[6],核心是神經(jīng)網(wǎng)絡(luò)機器學(xué)習(xí)算法。采用CBOW(Continuous Bag-of-Words)和Skip-Gram兩種模型,將詞語映像到同一坐標系,得出數(shù)值向量。CBOW的目標是根據(jù)上下文預(yù)測當(dāng)前詞語的概率,且上下文所有的詞對當(dāng)前詞出現(xiàn)概率的影響權(quán)重一樣,因此叫Continuous Bag-of-Words模型。例如,在袋子中取詞,取出數(shù)量足夠的詞即可,至于取出的先后順序無關(guān)緊要。Skip-gram剛好相反,它是根據(jù)當(dāng)前詞語來預(yù)測上下文的概率。word2vec可以在百萬數(shù)量級的詞典和上億的數(shù)據(jù)集上進行高效訓(xùn)練,且該工具得到的訓(xùn)練結(jié)果——詞向量可以很好地度量詞與詞之間的相似性。
通過爬取大量微博文本,將其進行分詞后作為word2vec神經(jīng)網(wǎng)絡(luò)的訓(xùn)練集。word2vec神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程,每個詞的向量維度被設(shè)置為400。詞向量訓(xùn)練時上下文掃描窗口的大小被設(shè)定為5,而最低頻率設(shè)定為5,即如果一個詞語在所有文檔中出現(xiàn)的次數(shù)小于5則被丟棄。在大量數(shù)據(jù)訓(xùn)練后,可以獲得一個相比其他模型更加適用于微博這個特定類型文本的計算詞語相似度的模型,對一些網(wǎng)絡(luò)用語、流行話語、特定的人名或者英文單詞等都更加有針對性。對兩條微博,從兩個詞對集合中分別選擇一個詞組成一組詞對,計算詞對的相似性。利用word2vec計算每組詞對的詞語相似度可以構(gòu)建一個矩陣,矩陣元素是對應(yīng)兩個詞的相似度。
本文提出基于公共塊“對稱-補償”模型算法進行微博文本相似度的計算,具體步驟如下:
步驟1:在得到微博文本詞語相似度矩陣后,遍歷該矩陣每一行,找到該行中相似度最大值(≥0.3),并把該值對應(yīng)的詞對寫入詞對集合。
步驟2:將第一條微博記為微博A,第二條微博記為微博B。
步驟3:將詞對集合中的每對單詞屬于微博A的詞項寫入詞集1,屬于微博B的詞項寫入詞集2。
步驟4:將步驟2中的兩個詞集根據(jù)在對應(yīng)的微博文本中出現(xiàn)的順序進行排序,得到排序后的詞集1記做D_WordList1,排序后的詞集2記做D_WordList2。
步驟5:從D_WordList1中選擇前兩個詞語,如果它們在詞對集合中對應(yīng)的詞語在D_WordList2中不是連續(xù)遞增,則將這兩個詞從D_WordList1中刪除,并且作為兩個公共塊寫入公共塊集合,重復(fù)該操作;如果它們對應(yīng)的詞語在D_WordList2中是連續(xù)的,則繼續(xù)遍歷到D_WordList1下一個元素進行順序判斷,直到D_WordList1變?yōu)榭占?/p>
步驟6:計算公共塊在微博A、微博B中的順序向量。為方便計算,直接定義公共塊集合順序向量在微博A中的順序向量為r1=(1,2,…,i),而相應(yīng)地通過在公共塊序列中的詞對可以找到每個公共塊在微博B中出現(xiàn)的順序,確定微博B的順序向量。
步驟7:采用公共塊序列計算文本相似度基于以下三條規(guī)則。(1)文本的公共塊數(shù)量越多,文本之間的相似度越高;(2)文本公共塊所包含的詞項個數(shù)越多,文本間的相似度越高;(3)兩篇文本中公共塊的先后順序越符合,文本間的相似度越高。
具體的計算公式如式(1)~式(3)所示:
其中simword由公共塊包含詞項數(shù)量決定,simorder由公共塊在兩篇文本中的出現(xiàn)順序決定,B(D1,D2)指所有公共塊包含的詞項總數(shù),L(D1)和L(D2)指兩篇微博文本中分別包含的詞項個數(shù),r1和r2分別指公共塊在微博D1和微博D2中的順序向量,根據(jù)公共塊在兩條微博中出現(xiàn)的順序,可以計算出兩條微博對應(yīng)的順序向量。α和β為實際實驗中人為調(diào)整的兩個系數(shù)參數(shù),本文設(shè)α=0.7,β=0.3。
步驟8:補償。在構(gòu)建詞語間的相似度矩陣中可以明顯發(fā)現(xiàn),有些詞語的相似度非常高,這是微博文本相似度高的指示標志。同樣,利用微博文本特有的以“#”開頭和結(jié)尾的話題功能,當(dāng)兩條微博相同話題數(shù)量越大,可以認為兩條微博“相似”的可能性越大。因此,計算過程中記錄相似度大于0.8的詞對數(shù)目并記為Count1,可以得到補償性指標。
同時,記錄兩條微博的相同話題標簽數(shù)量,并記為Count2,以得到補償性指標:
通過補償,將上述計算的sim(D1,D2)進行修正,得到新的sim(D1,D2):
步驟9:對稱。從上述步驟中可以看出,在順序向量的選取中,為了方便計算,將微博A的順序向量直接定義為r1=(1,2,…,i),再以該向量為參照結(jié)合公共塊序列和詞項的排序結(jié)果得出微博B的順序向量。顯然,這樣的計算不具有對稱性,即把第一條微博作為微博A而把第二條微博作為微博B計算得出的結(jié)果,不同于把第二條微博作為微博A而把第一條微博作為微博B計算得出的結(jié)果。因此,對稱算法將第一條微博作為微博B,第一條微博作為微博A,并重復(fù)上述的步驟3到步驟7,分別記兩次計算得出的相似度結(jié)果為sim1(D1,D2)和sim2(D1,D2),則最終兩條微博之間的相似度為:
以從新浪微博上隨機選取的兩條微博為例子來分析算法流程。兩條微博內(nèi)容如下:
①震驚!詹老漢生涯首次被驅(qū)逐出場??!還是在球隊大比分領(lǐng)先的情況下!#詹姆斯被驅(qū)逐#轉(zhuǎn)發(fā)微博【可愛】【可愛】【可愛】
②#詹姆斯被驅(qū)逐#職業(yè)生涯首次,詹姆斯對裁判判罰不滿,連吃到兩個T直接被驅(qū)逐出場!@NBA籃球協(xié)會【花心】
經(jīng)過去除標點符號、停用詞以及表情之類的工作之后進行分詞,得到對應(yīng)的兩條文本為:
①震驚 詹 老漢 生涯 首次 驅(qū)逐 出場 還是在 球隊 大比分 領(lǐng)先 的 情況 下
② 職業(yè)生涯 首次 詹姆斯 對 裁判 判罰 不滿連 吃 到 兩個 t 直接 被 驅(qū)逐 出場
可以看出,經(jīng)過文本預(yù)處理后,微博中對相似度計算無關(guān)緊要的東西已經(jīng)被去除,且以詞語的形式來表達這條微博的內(nèi)容,以進行關(guān)于相似度計算的工作,然后通過word2vec計算構(gòu)建相似度矩陣。限于篇幅,這里給出矩陣的部分結(jié)果如表1所示。
表1 微博詞語相似度計算矩陣部分結(jié)果
在得到的完整相似度矩陣中,若以第一條微博為微博A,第二條微博為微博B,則可以得到詞對集合為{<驅(qū)逐,首次>,<大比分,出場>,<首次,判罰>,<老漢,驅(qū)逐>,<領(lǐng)先,詹姆斯>,<生涯,驅(qū)逐>,<情況,驅(qū)逐>,<球隊,驅(qū)逐>,<出場,首次>,<詹,裁判>,<震驚,裁判>},由詞對集合生成詞集并排序可以得到D_WordList1{震驚,詹,老漢,生涯,首次,驅(qū)逐,出場,球隊,大比分,領(lǐng)先,情況}和D_WordList2{首次,首次,詹姆斯,裁判,裁判,判罰,驅(qū)逐,驅(qū)逐,驅(qū)逐,驅(qū)逐,出場},然后遍歷D_WordList1,尋找其在WordList2中對應(yīng)的詞語,得到公共塊序列{[(震驚,裁判),(詹,裁判),(老漢,驅(qū)逐),(生涯,驅(qū)逐)],[(首次,判罰)],[(驅(qū)逐,首次),(出場,首次),(球隊,驅(qū)逐)],[(大比分,出場)],[(領(lǐng)先,詹姆斯),(情況,驅(qū)逐)]}。
由以上分析知,兩微博公共塊數(shù)量為5。所以,微博A的順序向量為r1=(1,2,3,4,5)。對于第一個公共塊的第一個元素(震驚,裁判),可以從D_WordList2中知道“裁判”出現(xiàn)在第4個位置,故順序向量r2第一個元素為4,經(jīng)過類似計算可以得出微博B的順序向量為r2=(4,6,1,11,3)。
在兩條微博構(gòu)建的相似度矩陣中,矩陣元素大于0.8的詞對數(shù)目共有6對,而相同的話題標簽有一個,所以可以計算得到Bonus1=1.18,Bonus2=(1+0.08),則:
同樣地,交換兩條微博位置,即以第二條微博為微博A,第一條微博為微博B,經(jīng)過相同步驟后可以計算得到sim2(D1,D2)=0.669,因此得到該兩條微博的相似度最終結(jié)果為:
采用真實的新浪微博數(shù)據(jù)進行測試,且微博的話題標定利用新浪微博中的“熱門話題”功能,其在每一個熱門話題中的微博都圍繞同一個主題,且內(nèi)容也較為相似。而不同的熱門話題中的微博由于主題不同內(nèi)容不同,所以相似度較低。因此,論文將屬于同一熱門話題下的微博標定為“相似的”,而屬于不同熱門話題的微博標定為“不相似的”,作為算法的測試集。
實驗分別選用80組人工標定為“相似的”的微博與80組人工標定為“不相似的”的微博來測試算法有效性。將數(shù)據(jù)測試結(jié)果分為如表2所示的4種情況。
表2 分類實驗評價表
由表2可以計算出準確率和召回率:
準確率越高,說明被預(yù)測為“相似的”的微博中確實為“相似的”的微博所占比例越高;召回率越高,說明實際為“相似的”的微博被正確預(yù)測為“相似的”的比例越高。因此,可以用準確率和召回率來評價算法模型的有效性。
由于LDA模型、TF-IDF算法等并不太適用微博這種簡短而又隨意的文本相似度計算,因此將采用黃賢英等人提出的傳統(tǒng)的基于公共塊的短文本相似度計算方法和本文提出的“補償-對稱”模型算法分別進行實驗,并比較兩者的實驗結(jié)果。
經(jīng)過計算,兩種方法得到的計算結(jié)果在各個相似度區(qū)間的數(shù)據(jù)組數(shù),如表3所示。
表3 兩種方法的計算結(jié)果
對于傳統(tǒng)的公共塊算法,結(jié)果如圖2所示。
圖2 基于傳統(tǒng)公共塊算法的微博相似度頻率
圖2 左邊是被標定為“不相似的”的微博的各個相似度的頻率,圖2右邊是被標定為“相似的”的微博的各個相似度的頻率。同樣,對于“補償-對稱”模型,其實驗結(jié)果如圖3所示。
圖3 基于“補償-對稱”模型的微博相似度頻率
可以明顯看出,傳統(tǒng)的公共塊模型算法中,在相似度為0.3~0.5中,“相似的”微博與“不相似的”微博有較多重疊,使得算法在該區(qū)間內(nèi)的區(qū)分性不高。而“補償-對稱”算法盡管在該區(qū)間內(nèi)同樣有重疊,但可以看到其重疊數(shù)量相對較少,區(qū)分性有提升。
圖4、圖5給出不同的判斷閾值應(yīng)用兩種模型的準確率和召回率。
圖4 兩種方法在不同閾值下的準確率曲線
圖5 兩種方法在不同閾值下的召回率曲線
可以看出,在準確率方面,隨著閾值的增加,兩種方法的準確率都在不斷提高。在閾值小于0.4的情況下,傳統(tǒng)公共塊模型算法計算得到的準確率略微高于“補償-對稱”模型;而在閾值大于0.4時,“補償-對稱”模型準確率則明顯更高。在召回率方面,隨著閾值的增加,兩種方法的召回率都在不斷下降。但是,在各個閾值情況下,“補償-對稱”模型的召回率都要明顯高于傳統(tǒng)公共塊模型至少10%??梢?,無論在準確率還是召回率方面,本文提出的算法模型識別效果都要好于傳統(tǒng)的公共塊模型。
將上述準確率和召回率的曲線繪制在同一張圖中,如圖6所示。對于“補償-對稱”模型,當(dāng)把閾值設(shè)置在較低的位置如0.34時,雖然可以獲得高達95%的召回率,但是實驗的準確率卻不到65%;當(dāng)把閾值設(shè)置在較高的位置如0.48時,可以發(fā)現(xiàn)其準確率達到了95%的水平,但是召回率顯著下降,僅有60%左右。因此,為了達到較好的效果,即準確率和召回率都保持在較高的水平,選擇兩條召回率曲線與準確率曲線的交點對應(yīng)的橫坐標0.42作為閾值。在該閾值下,召回率與準確率都達到了80%以上,整體效果良好。這為應(yīng)用“補償-對稱”模型提供了參考:設(shè)置閾值在0.42左右,可以使召回率和準確率都保持在較高水平。
圖6 兩種方法的準確率與召回率曲線
同理,取傳統(tǒng)公共塊模型算法的召回率和準確率曲線的交點橫坐標作為其閾值。顯然,在專門針對短文本的兩種算法中,傳統(tǒng)公共塊模型與“補償-對稱”模型在選擇上述閾值的情況下都可以達到比較良好的效果。但是,本文提出的“補償-對稱”模型的召回率與準確率比傳統(tǒng)模型高了8%,說明該模型相比傳統(tǒng)公共塊模型有更好的分類效果。
從以上實驗結(jié)果可以看出,“補償-對稱”模型進一步將相似度極高的詞項和微博標簽話題考慮在內(nèi),對相似度進行補償,并且彌補了公共塊算法本身存在的不對稱性而可能造成的相似度計算偏差較大的缺點,使得實驗得到的結(jié)果要優(yōu)于傳統(tǒng)的公共塊模型算法。
提出的基于公共塊“補償-對稱”模型的文本相似度計算方法不僅考慮了文本的公共塊數(shù)量、文本公共塊所包含的詞項個數(shù)以及兩篇文本中公共塊的先后順序,還考慮相似度極高的詞項和微博標簽話題,對相似度進行補償,進一步彌補了公共塊算法本身存在的不對稱性,提高了相似度計算的精度,可為微博溯源、輿情檢測、網(wǎng)絡(luò)水軍識別、打擊違法犯罪等提供技術(shù)支持。閾值選擇對于準確率與召回率的影響較大,下一步工作將探討如何根據(jù)實際需要設(shè)定閾值,從而使算法能夠更好地達到預(yù)期效果。