筆者所在的數據策略團隊近期在做推薦策略的時候發現了一些bad cases,即商戶在發布職位的時候,有意或無意地錯誤發布本不屬於某類目的職位。如下圖所示,在廣告文案類目中,我們可以發現裡面包含遊戲開發和java開發等類目。
首先,用戶使用關鍵詞進行搜索或者點擊某類目進行搜索,說明有強烈的找該方面工作的意願,一旦返回的結果中包含上述毫不相干的職位,將會極大地降低用戶體驗甚至使用戶對產品可靠性產生質疑。
其次,上文提到了這可能是商戶有意為之的結果。因為我們觀察到存在某些灰產用戶,其在幾乎每個招聘二級類目下都發布了大量與當前類目毫不相干的計算機培訓的職位。
綜上,我們需要基於商戶發布的職位標題/職位描述去進行文本分類,將商戶發布的職位類目和我們分析的結果進行對比,對於相關性很低的(比如商戶類目為程式設計師,我們分類結果是服務員),我們在展示頁面給予降權,使相應帖子不優先展示或者不展示。
本文將提出一種基於Word2Vector模型的文本分類方法解決上述問題。行文邏輯如下:第二節介紹傳統的做文本分類的方法;第三節介紹Word2Vector模型原理;第四節介紹我們如何使用該模型做職位的分類;第五節介紹踩過的一些坑。
本文旨在用較為通俗形象的文字解釋算法,本人才疏學淺,如有不當之處,歡迎高手不吝賜教。
二、文本分類簡介
2.1概述
文本分類,顧名思義,即給定類目體系下,根據文本的內容確定類別的過程。在我們的問題中,我們將使用58招聘的類目體系,將商戶發布的職位標題及職位描述作為文本內容。
2.2歷史及現狀
1960-1970:人工+規則(關鍵詞或者正則表達式)的方式,制定規則的人需要對某類目領域有足夠的認知和了解。舉個慄子:類目詞是廚師,涉及到的規則可能是關於美食的、烹飪技巧的(刀工/炒鍋/烘焙)或者廚師工種的(水臺/砧板/打荷),需要涉及到方方面面,繁瑣複雜。
1970-1990:信息檢索概率模型(如向量空間模型Vector Space Model),以及相關評價指標如準確率、召回率的引入。
1990-2000:研究主要集中在了文本特徵(即詞語)的提取、選擇以及分類器模型的設計方面。
目前業內做文本分類的主流方法基本上是用有監督的方式(即訓練數據既含有文本數據,又帶有相應的類目標籤以幫助模型去學習該類目的表達),其過程一般如下圖所示:
ps. 向量空間模型VSM:將文本抽象成一個向量,假設我們一共有N個詞,那麼一篇文本可以表示為(w1, w2, w3, … , wn),其中wi表示第i個詞在這篇文本中的權重,其計算方法一般用詞頻-逆文章頻率即tf-idf來計算。
三、Word2Vector簡介
3.1詞向量模型
之所以要引入詞向量模型,是因為上述傳統的VSM存在如下缺點:
①一般情況下,詞語的總數N會很大(注意N不僅僅是單篇文章的詞語數,而是整個語料庫的詞語個數),而導致單篇文章的特徵向量會很稀疏(即向量中大部分詞語的權重都為0)。
②不能很好地刻畫詞與詞之間的相似性。相似性是詞語之間一個很重要的性質,舉個極端的慄子:假設我們一共有3個詞語:「招聘」、「美容師」、「化妝師」;有2篇文章:「招聘美容師」,「招聘化妝師」。兩者語義很接近,然而其表示向量分別為[1,1,0]和[1,0,1],我們可以測算一下餘弦相似度,為1/2,即60°的夾角,說明兩者「語義距離」很遙遠。
目前業界一般用Distributed Representation方式的詞向量模型,最早由Hinton在1984年提出。其將每一個詞語映射成一個固定長度的「短」向量(比如50維,100維,相對於語料庫動輒幾十萬的詞語數量而言很短了)。類似於VSM,也是將每個詞都當做詞向量空間中的一點,在此空間中引入的距離概念,就是詞語之間語義層面的相似性了。
3.2Word2Vector模型
2013年,Google開源了一個用於生成詞向量的工具,因其簡單實用高效而引起廣泛關注。其中具體的原理因篇幅原因,本文只稍作介紹,若有興趣的讀者,可閱讀作者的原論文[8](不涉及太多算法細節)、Word2Vec相關數學原理[9]進行了解。
Word2Vector本質上有兩個學習任務,還有兩套模型。
①兩個學習任務分別是:
CBOW:對於每個詞,用其周圍的詞,來預測該詞生成的概率。
Skip-gram:對於每個詞,用其自身去預測周圍其他詞生成的概率。
②兩個模型分別是:
HierarchicalSoftmax模型:算法輸入為初始隨機的詞向量,輸出為一個包含語料裡所有詞語的Huffman樹(最優二叉樹),對於其中每一個葉節點(代表一個詞),其從根節點到葉節點的路徑即為此詞語的Huffman編碼。從名字上看,Softmax是用於解決多分類問題的(可以形象的理解為從所有詞語中選擇一個條件概率最大的),而此模型將一個多分類問題轉化多個帶有層級關係的二分類問題(這樣能夠將時間複雜度大大降低),即在每一個非葉子節點,都做一次二分類(輸出為0或者1)。下圖是該模型一個形象的展示(來自於[9]):
NegativeSampling模型:提出這個模型本質上是為了提高性能,不需要再生成複雜的Huffman樹。負採樣,顧名思義,關注點主要在負樣本上,因為正樣本是確定且數量很少的(比如CBOW裡,給定context(w),w就是唯一正樣本)。我們需要的是帶權採樣,即對於高頻詞彙,我們希望選中的概率大;低頻則較小。下圖展示了Word2Vec中負採樣的策略(來自於[10])
3.3模型特性
前面也提到過,Word2Vec是用於解決詞與詞之間的相似性問題,更準確地說是在給定語境下,同時出現的概率(即詞的共現性co-occurence)。舉個慄子,我們選取最近一個月的新浪微博數據當做語料庫去訓練模型。那麼當我輸入「迪麗熱巴」這個詞的時候,模型返回最相似的詞語可能是:「鹿晗」、「跑男」、「吃貨」、「小姐姐」這些詞(前提是我們分詞的時候,這些詞語能夠被正常切分)。
除了上述相似性(共現性),Word2Vec作者還在[8]中提到了模型能自動將詞語實體的概念組織起來並學習它們之間的隱含關係。下圖是一個部分詞向量經過PCA降維投影之後的展示,我們可以看到,首都詞和國家詞之間的語義距離幾乎一樣,而模型訓練的過程中,我們並不需要提供任何此類信息,這完全是模型自己學習到的。
四、Word2Vec應用於文本分類
4.1可行性分析
第二節我們討論了文本分類的一般步驟,基本上都是在大量有數據集上做的有監督學習,需要大量人工標註數據(58自己有商戶和用戶數據,其在錄入過程中都會標上類目,且類目不準的佔比很小,所以這方面問題不太大,而對於有些任務來說,標註數據獲取成本極高)。而第三節我們看出,Word2Vec模型不需要標註數據,其能自發的學習出詞與詞之間的相似性和某些概念之間的內在聯繫。
那如何將其用做分類呢?
詞向量,就是多維空間的一個向量,而兩個詞語的相似程度,可以由他們的向量的餘弦距離(夾角)來描述。夾角越小,表明相似性越高,即越相似的詞語指向的方向越一樣。
類目體系由類目詞語組成,假定我們有一個好的類目體系,類目詞之間具有完備性和互斥性,那麼不同類目詞向量所指向的方向應該是不一樣的。我們要做文本的分類,只要將文本映射到同一個詞向量空間中,將文本也表示成某一個向量,然後看看這個向量和哪個類目詞向量夾角最小,不就是這個文本屬於的類目麼?
如何映射文本到詞向量空間?
文本是由詞語組成的,但是並不是每個詞語對於文本的表述能力都是一樣的。舉個慄子,某職位信息是:「本工廠急招車床技工,要求有實際操作經驗、年齡不限,學歷不限」。最重要的幾個詞語(特徵)應該是「工廠」、「車床」、「技工」這幾個或代表了場所,或代表了技能,或代表了工種(實際上有個類目詞就是技工)的名詞性質的詞語,其他詞語都不能很好的幫助我們確定類目。
所以在由詞語向量生成文章向量之前,我們還需要做一步特徵選擇,這和我們在第二節中提到的特徵選擇過程是類似的,僅僅是使用的方法有差異。
4.2算法詳述
將4.1節的思路連貫的串起來,我們可以得到如下算法流程:
有如下幾點說明:
①上圖只是模型預測部分的文本分類流程,並不包含模型訓練的部分。
②停用詞指的是諸如「我」、「你」、「是」等出現在大量文章中,但是對文章的語義表達無任何作用的詞語。詞語重要度文件是離線計算獲得的詞語IDF(參見[6])文件,包含語料庫中任意詞語以及其權重。
③模型加載完畢後,首先對用戶文本進行預處理,包含了4個小步驟;其次進行特徵選擇,本算法中使用了tf-idf的方法對特徵進行排序;然後計算文章向量的時候,需要根據特徵的權重轉化詞語特徵為文章特徵;最後與類目詞進行餘弦相似度的計算,取相似度最高的類目詞作為最終類目。
五、踩過的坑
1、筆者之前應用此方法進行過新聞文本的分類,取得過較好的效果。其類目體系中一級類目約20個(政治、體育、經濟、娛樂等),每個一級類目下二級類目約20-30個(如體育下有籃球、足球、網球、桌球等),二級類目總數約為500多個。當時採取的方法是,先分一級類目,然後在當前一級類目中繼續劃分二級類目,這樣能避免一次性劃分500多個類目,極大程度上提高分類的精度。
然而這個方法並不能應用於58招聘的類目體系中。雖然其類目也是分層級的,且每一層級的個數並不多(30-40)。有以下幾個原因:
①商戶在寫職位標題和職位描述的時候,傾向於直接用三級級類目相關描述詞而不用二級類目的相關描述詞(註:58招聘屬於一級類目,所以這裡從二級類目開始算起)(比如用「水泥工」、「磚瓦工」這樣的三級類目細分詞,而很少用「普工」、「技工」這樣的二級類目抽象詞),導致部分二級類目詞語出現次數極低,這樣算出的二級類目詞和三級類目描述詞的共現性肯定是極低的,從而導致分二級類目的時候準確率就不高,更別提分三級類目了。
②很多三級類目描述詞詞和好幾個二級類目均有共現情況,如「寵物美容」和「醫療/醫院/護理」以及「美容/美發」。這樣算出共現性肯定會有偏差。
③類目的互斥性不夠,如二級類目「汽車製造/服務」和「司機/交通服務」很相似。
④類目本身應該按照功能性區分,但是有的卻按照級別去區分,比如二級類目存在「高級管理」和「生產管理/研發」這樣的類目,那麼銷售總監究竟是應該分到「高級管理」還是應該分到「銷售」?
⑤部分二級類目詞太過於抽象:「美術/設計/創意」中的創意,「政府/非營利機構」中的非營利機構等。
筆者嘗試對類目詞進行過人工修改,可以提高部分效果,但是很費時費力。目前暫時採用的方法是直接進行三級類目的劃分(1000多個),取top20,然後跟商戶打上的三級類目進行對比,如果其類目不在這top20中,則對帖子採取降權處理。
2、對於文章特徵的選擇。這方面最大的感觸就是,職位描述文本的質量實在是堪憂,表現為:
①大量重複性的千篇一律的描述,如對於薪酬福利的描述(日薪200,隨走隨結,上二休一等等),對於學歷年齡等的要求(高中學歷,30歲以下,服從領導安排等)。
②有價值的信息往往只在標題中或者在正文的某一個小角落。出於吸引點擊的考慮,很多商戶都是「標題黨」,巴不得把整個職位所有的特點都在標題中描述完全。舉個慄子:標題為「急招電工+五險+雙休包吃住」,而正文隻字不提或只提一句跟電工相關的東西。這種基本上根據標題就能選取特徵「電工」直接進行分類了。
從上面能看出,只根據詞性進行過濾,特徵選擇只根據tf-idf是不夠的,必須要有一些小tricks。筆者用到或將要用到如下幾點:
①目前選取特徵主要是選取名詞,但是更需要細分為「職位詞」(股票交易員、貨車司機等)、「場所詞」(工廠、酒吧等)、「技能詞」(java、c1等)並給予不同的權重予以區分。
②對於職位描述,嘗試用正則表達式提取出「崗位職責」的描述部分,而忽略其餘關於「崗位要求」、「薪酬待遇」等部分。
③標題相對於正文給予更大的權重。
3、對於正文長度過短的帖子,可以嘗試直接對於標題去進行類目詞的匹配。這樣做的原因很簡單:正文長度過短,特徵數量不足以很好的表達文本。而標題中如果帶有一模一樣的類目詞,那麼直接做匹配,是更加精準的。
二、參考文獻
[1]http://blog.csdn.net/chl033/article/details/4733647文本分類概述
[2]Lewis D D. Representation and learning ininformation retrieval[D]. University of Massachusetts, 1992.
[3]Yang Y, Pedersen J O. A comparative study onfeature selection in text categorization[C]//Icml. 1997, 97: 412-420.
[4] Freund Y, Schapire R E. Adesicion-theoretic generalization of on-line learning and an application toboosting[C]//European conference on computational learning theory. SpringerBerlin Heidelberg, 1995: 23-37.
[5] Jiang J, Wu C, Liang Y. Multi-categoryclassification by least squares support vector regression[J]. Advances inNeural Networks–ISNN 2005, 2005: 787-832.
[6] http://baike.baidu.com/link?url=v1dDZvWp5XCMi_iyGq734_vod7rQ4kHkKcGwlxGrXgyXi848g-fmUkNNmmQ0K_XvNmZcrsZVYrXvrPuiXNYdO_百度百科tf-idf
[7] Hinton G E. Distributed representations[J].1984.
[8] Mikolov T, Sutskever I, Chen K, et al.Distributed representations of words and phrases and theircompositionality[C]//Advances in neural information processing systems. 2013:3111-3119.
[9]http://blog.csdn.net/itplus/article/details/37969519 Word2Vec數學原理
[10]http://www.cnblogs.com/neopenx/p/4571996.html Word2Vec源碼解析
我們是
58招聘技術
在這裡
有我們的技術實踐
我們探索新技術
帶給你不一樣的收穫