“神策杯”2018高校算法大師賽是一個(gè)只能高校在校生solo的單人賽。神策數(shù)據(jù)提供了10萬(wàn)篇左右資訊文章的標(biāo)題以及正文,其中一千篇文章有對(duì)應(yīng)的標(biāo)注數(shù)據(jù)。標(biāo)注數(shù)據(jù)中每篇文章的關(guān)鍵詞不超過(guò)5個(gè),關(guān)鍵詞都在文章的標(biāo)題或正文中出現(xiàn)過(guò)。根據(jù)已有的數(shù)據(jù),需要訓(xùn)練一個(gè)“關(guān)鍵詞提取”模型,提取沒(méi)有標(biāo)注數(shù)據(jù)的文章的關(guān)鍵詞,每篇文章最多提交兩個(gè)關(guān)鍵詞。
最終排名:6 / 622
附:github地址
比賽簡(jiǎn)介(Datacastle)
(1)比賽介紹:比賽根據(jù)神策數(shù)據(jù)提供的一千篇資訊文章及其關(guān)鍵詞,參賽者需要訓(xùn)練出一個(gè)”關(guān)鍵詞提取”的模型,提取10萬(wàn)篇資訊文章的關(guān)鍵詞。
(2)評(píng)價(jià)指標(biāo):提交的預(yù)測(cè)結(jié)果中,每篇文章最多輸出兩個(gè)關(guān)鍵詞。預(yù)測(cè)結(jié)果跟標(biāo)注結(jié)果命中一個(gè)得 0.5 分,命中兩個(gè)得一分。英文關(guān)鍵詞不區(qū)分大小寫(xiě)。
問(wèn)題分析
通過(guò)初步分析,本次比賽訓(xùn)練集和測(cè)試集的樣本比例大致是1:100,因此選擇采用無(wú)監(jiān)督的模型(tfidf/tfiwf,textRank,主題模型LSI/LDA)進(jìn)行關(guān)鍵詞提取。依據(jù)比賽背景,我將其分成兩個(gè)步驟,首先根據(jù)資訊文章和標(biāo)題選取關(guān)鍵詞候選集,然后選擇其中兩個(gè)概率最大的關(guān)鍵詞。
數(shù)據(jù)分析
(1)訓(xùn)練集和測(cè)試集的樣本比例1:100
(2)?通過(guò)分析標(biāo)注數(shù)據(jù)以及標(biāo)題的關(guān)系可以看出,1000篇標(biāo)注文章中,只有20篇左右文章的關(guān)鍵詞是不在標(biāo)題中,而且80%左右文章至少有兩個(gè)關(guān)鍵詞是在標(biāo)題中,可以看出標(biāo)題的重要性。大家看到一篇資訊文章,通常會(huì)首先關(guān)注標(biāo)題,因?yàn)闃?biāo)題會(huì)概括出這個(gè)文章的主要內(nèi)容。

(3)通過(guò)分析標(biāo)題中的數(shù)據(jù)可以看到,如果標(biāo)題中含有書(shū)名號(hào)或者是人名,95%以上都是對(duì)應(yīng)文章的關(guān)鍵詞。這個(gè)應(yīng)該跟每個(gè)人的習(xí)慣(打標(biāo)簽人的習(xí)慣)有關(guān),書(shū)名號(hào)中的內(nèi)容通常會(huì)對(duì)應(yīng)影片,電視劇,歌曲等的名稱,這些名詞和人名很大概率會(huì)在一開(kāi)始吸引我么的注意,因此是關(guān)鍵詞的概率就很大。
樣本構(gòu)造
由于采用的是無(wú)監(jiān)督模型,因此,可以我把官方提供的一千條標(biāo)注樣本作為線下驗(yàn)證集,來(lái)驗(yàn)證模型的精度和效果,基本上可以做到線上線下一致。而對(duì)于線上提交結(jié)果,我將一千條標(biāo)注數(shù)據(jù)的標(biāo)簽作為結(jié)巴分詞的自定義詞,用以提高分詞的準(zhǔn)確度。
數(shù)據(jù)預(yù)處理
分詞預(yù)處理過(guò)程
- 對(duì)于jieba分詞,去除了一些常用的停用詞(從網(wǎng)上找的),避免后期一些停用詞對(duì)模型精度產(chǎn)生影響,停用詞主要包括英文字符、數(shù)字、數(shù)學(xué)字符、標(biāo)點(diǎn)符號(hào)及使用頻率特高的單漢字等。比如的,呢。
- 將一千條標(biāo)注數(shù)據(jù)的標(biāo)簽作為結(jié)巴分詞的自定義詞,用以提高分詞的準(zhǔn)確度。主辦方有說(shuō)明過(guò),“訓(xùn)練集文章的關(guān)鍵詞構(gòu)成的集合”與“測(cè)試集文章的關(guān)鍵詞構(gòu)成的集合”,這兩個(gè)集合可能存在交集,但不一定存在包含與被包含的關(guān)系。
- 在網(wǎng)上找到搜狗的詞典,給jieba分詞添加用戶詞典,提高分詞準(zhǔn)確度。
- 利用哈工大ltp分詞接口進(jìn)行分詞,同樣作為模型樣本,用于彌補(bǔ)jieba分詞的分詞錯(cuò)誤。
- 利用ltp的接口,同時(shí)識(shí)別jieba分詞和ltp分詞的結(jié)果中的名詞甚至是人名,用于后期的規(guī)則。
增大title中詞語(yǔ)的權(quán)重
在這里,采用的是簡(jiǎn)單的title復(fù)制的方式,對(duì)于一條樣本,利用句號(hào)將n個(gè)相同的title和context進(jìn)行字符串拼接,然后分詞并用于后期tfidf的計(jì)算,這樣就可以達(dá)到增大title中詞語(yǔ)的權(quán)重。這里n的確定,每一條樣本的n是不一樣的,依據(jù)context中句子的個(gè)數(shù)乘上一定的比例來(lái)確定n。(通過(guò)訓(xùn)練集,也就是我的線下驗(yàn)證集來(lái)確定比例,這個(gè)比例,從實(shí)際場(chǎng)景來(lái)說(shuō),就是人們對(duì)title關(guān)注度的反映)
模型選擇
對(duì)比無(wú)監(jiān)督的模型(tfidf/tfiwf,textRank,主題模型LSI/LDA)的效果,最終采用tfidf作為基礎(chǔ)模型進(jìn)行關(guān)鍵詞候選集的選取。
tfidf
tfidf(詞頻-逆文檔頻率)算法是一種統(tǒng)計(jì)方法,用以評(píng)估一字詞對(duì)于一個(gè)文件集或一個(gè)語(yǔ)料庫(kù)中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時(shí)會(huì)隨著它在語(yǔ)料庫(kù)中出現(xiàn)的頻率成反比下降。
TF(詞頻)就是某個(gè)詞在文章中出現(xiàn)的次數(shù),TF(詞頻) = 某個(gè)詞在文章中出現(xiàn)的次數(shù) / 該篇文章的總詞數(shù);IDF(逆向文檔頻率)為該詞的常見(jiàn)程度,IDF 逆向文檔頻率 =log (語(yǔ)料庫(kù)的文檔總數(shù) / (包含該詞的文檔總數(shù)+1)),如果一個(gè)詞越常見(jiàn),那么其分母就越大,IDF值就越小。
Tfiwf
TF不變,IWF是文檔所有詞語(yǔ)詞頻之和/該單詞詞頻

Pagerank(此處列出只為引出下面的textrank)
需要知道有哪些網(wǎng)頁(yè)鏈接到網(wǎng)頁(yè)A,也就是要首先得到網(wǎng)頁(yè)A的入鏈,然后通過(guò)入鏈給網(wǎng)頁(yè)A的投票來(lái)計(jì)算網(wǎng)頁(yè)A的PR值。這樣設(shè)計(jì)可以保證達(dá)到這樣一個(gè)效果:當(dāng)某些高質(zhì)量的網(wǎng)頁(yè)指向網(wǎng)頁(yè)A的時(shí)候,那么網(wǎng)頁(yè)A的PR值會(huì)因?yàn)檫@些高質(zhì)量的投票而變大,而網(wǎng)頁(yè)A被較少網(wǎng)頁(yè)指向或被一些PR值較低的網(wǎng)頁(yè)指向的時(shí)候,A的PR值也不會(huì)很大,這樣可以合理地反映一個(gè)網(wǎng)頁(yè)的質(zhì)量水平。

Vi表示某個(gè)網(wǎng)頁(yè),Vj表示鏈接到Vi的網(wǎng)頁(yè)(即Vi的入鏈),S(Vi)表示網(wǎng)頁(yè)Vi的PR值,In(Vi)表示網(wǎng)頁(yè)Vi的所有入鏈的集合,Out(Vj)表示網(wǎng)頁(yè)Vj鏈接到其他網(wǎng)頁(yè)的數(shù)量,d表示阻尼系數(shù),是用來(lái)克服這個(gè)公式中“d *”后面的部分的固有缺陷用的:如果僅僅有求和的部分,那么該公式將無(wú)法處理沒(méi)有入鏈的網(wǎng)頁(yè)的PR值,因?yàn)檫@時(shí),根據(jù)該公式這些網(wǎng)頁(yè)的PR值為0,但實(shí)際情況卻不是這樣,所有加入了一個(gè)阻尼系數(shù)來(lái)確保每個(gè)網(wǎng)頁(yè)都有一個(gè)大于0的PR值,根據(jù)實(shí)驗(yàn)的結(jié)果,在0.85的阻尼系數(shù)下,大約100多次迭代PR值就能收斂到一個(gè)穩(wěn)定的值,而當(dāng)阻尼系數(shù)接近1時(shí),需要的迭代次數(shù)會(huì)陡然增加很多,且排序不穩(wěn)定。公式中S(Vj)前面的分?jǐn)?shù)指的是Vj所有出鏈指向的網(wǎng)頁(yè)應(yīng)該平分Vj的PR值,這樣才算是把自己的票分給了自己鏈接到的網(wǎng)頁(yè)。
textrank
一種用于文本的基于圖的排序算法,僅利用單篇文檔本身的信息即可實(shí)現(xiàn)關(guān)鍵詞提取,不依賴于語(yǔ)料庫(kù)。(調(diào)用jieba的接口)

Wji是指Vi和Vj兩個(gè)句子之間的相似度,可以采用編輯距離和余弦相似度等。當(dāng)textrank應(yīng)用到關(guān)鍵詞提取時(shí),與自動(dòng)摘要提取不同:1)詞與詞之間的關(guān)聯(lián)沒(méi)有權(quán)重,即Wji是1;2)每個(gè)詞不是與文檔中所有詞都有鏈接,而是通過(guò)設(shè)定固定長(zhǎng)度滑動(dòng)窗口形式,在窗口內(nèi)的詞語(yǔ)間有鏈接。
主題模型
主題模型認(rèn)為在詞與文檔之間沒(méi)有直接的聯(lián)系,它們應(yīng)當(dāng)還有一個(gè)維度串聯(lián)起來(lái),這個(gè)維度就是主題。主題模型就是一種自動(dòng)分析每個(gè)文檔,統(tǒng)計(jì)文檔內(nèi)詞語(yǔ),根據(jù)統(tǒng)計(jì)的信息判斷當(dāng)前文檔包含哪些主題以及各個(gè)主題所占比例各為多少。主題模型是一種生成模型,一篇文章中每個(gè)詞都是通過(guò)“以一定概率選擇某個(gè)主題,并從這個(gè)主題中以一定概率選擇某個(gè)詞語(yǔ)”這樣一個(gè)過(guò)程得到的;

主題模型常用的方法是LSI(LSA)和LDA,其中LSI是采用SVD(奇異值分解)的方法進(jìn)行暴力破解,而LDA則是通過(guò)貝葉斯學(xué)派方法對(duì)分布信息進(jìn)行擬合。通過(guò)LSA或LDA算法,可以得到文檔對(duì)主題的分布和主題對(duì)詞的分布,可以根據(jù)主題對(duì)詞的分布(貝葉斯方法)得到詞對(duì)主題的分布,然后通過(guò)這個(gè)分布和文檔對(duì)主題的分布計(jì)算文檔與詞的相似性,選擇相似性高的詞列表作為文檔的關(guān)鍵詞。
LSA
潛在語(yǔ)義分析(Latent Semantic Analysis, LSA),也叫做Latent Semantic Indexing, LSI. 是一種常用的簡(jiǎn)單的主題模型。LSA是基于奇異值分解(SVD)的方法得到文本主題的一種方式。

Umk代表了文檔對(duì)主題的分布矩陣,Vnk的轉(zhuǎn)置代表了主題對(duì)詞語(yǔ)的分布矩陣。
LSA通過(guò)SVD將詞、文檔進(jìn)行更本質(zhì)地表達(dá),映射到低維的空間,并在有限利用文本語(yǔ)義信息的同時(shí),大大降低計(jì)算的代價(jià),提高分析質(zhì)量。但是計(jì)算復(fù)雜度非常高,特征空間維度較大的,計(jì)算效率十分低下。當(dāng)一個(gè)新的文檔進(jìn)入已有特征空間時(shí),需要對(duì)整個(gè)空間重新訓(xùn)練,才能得到新加入文檔后的分布信息。此外,還存在對(duì)頻率分布不敏感,物理解釋性薄弱的問(wèn)題。
pLSA
在LSA的基礎(chǔ)上進(jìn)行了改進(jìn),通過(guò)使用EM算法對(duì)分布信息進(jìn)行擬合替代了使用SVD進(jìn)行暴力破解。
PLSA中,也是采用詞袋模型(詞袋模型,是將一篇文檔,我們僅考慮一個(gè)詞匯是否出現(xiàn),而不考慮其出現(xiàn)的順序,相反,n-gram考慮了詞匯出現(xiàn)的先后順序),文檔和文檔之間是獨(dú)立可交換的,同一個(gè)文檔內(nèi)的詞也是獨(dú)立可交換的。在PLSA中,我們會(huì)以固定的概率來(lái)抽取一個(gè)主題詞,然后根據(jù)抽取出來(lái)的主題詞,找其對(duì)應(yīng)的詞分布,再根據(jù)詞分布,抽取一個(gè)詞匯。
LDA
LDA 在 PLSA 的基礎(chǔ)上,為主題分布和詞分布分別加了兩個(gè) Dirichlet 先驗(yàn)分布。PLSA中,主題分布和詞分布都是唯一確定的。但是,在LDA中,主題分布和詞分布是不確定的,LDA的作者們采用的是貝葉斯派的思想,認(rèn)為它們應(yīng)該服從一個(gè)分布,主題分布和詞分布都是多項(xiàng)式分布,因?yàn)槎囗?xiàng)式分布和狄利克雷分布是共軛結(jié)構(gòu),在LDA中主題分布和詞分布使用了Dirichlet分布作為它們的共軛先驗(yàn)分布。
在 LDA 中,主題的數(shù)目沒(méi)有一個(gè)固定的最優(yōu)解。模型訓(xùn)練時(shí),需要事先設(shè)置主題數(shù),訓(xùn)練人員需要根據(jù)訓(xùn)練出來(lái)的結(jié)果,手動(dòng)調(diào)參,再優(yōu)化主題數(shù)目。

我們可以根據(jù)數(shù)據(jù)的多項(xiàng)式分布和先驗(yàn)分布求出后驗(yàn)分布,然后將這個(gè)后驗(yàn)分布作為下一次的先驗(yàn)分布,不斷迭代更新。求解方法一般有兩種,第一種是基于Gibbs采樣算法求解,第二種是基于變分推斷EM算法求解。
小結(jié)
模型對(duì)比:tf-idf的idf值依賴于語(yǔ)料環(huán)境,這給他帶來(lái)了統(tǒng)計(jì)上的優(yōu)勢(shì),即它能夠預(yù)先知道一個(gè)詞的重要程度,而textrank只依賴文章本身,它認(rèn)為一開(kāi)始每個(gè)詞的重要程度是一樣的,但是用到了詞之間的關(guān)聯(lián)性(將相鄰的詞鏈接起來(lái))。主題模型LSA和LDA都依賴于語(yǔ)料庫(kù),在新的一篇文檔進(jìn)來(lái)后需要重新訓(xùn)練,但是主題模型可以充分利用到文本中的語(yǔ)義信息。Tfidf和textrank都可以用jieba的接口,而主題模型可以用sklearn中g(shù)ensim的接口。
在我們的本次比賽,雖然說(shuō)可以看出來(lái)整個(gè)數(shù)據(jù)集是有一定的主題的,包括娛樂(lè),體育等,但是從關(guān)鍵詞標(biāo)簽來(lái)看,這個(gè)跟主題名稱并沒(méi)有很大的關(guān)聯(lián),而是跟標(biāo)題關(guān)聯(lián)性很大,所以tfidf雖然是簡(jiǎn)單的統(tǒng)計(jì),但是卻可以發(fā)揮很大的效果(增大title的權(quán)重)。
規(guī)則
結(jié)合前面的分析,加入一系列人工規(guī)則,利用tfidf模型得到的10個(gè)關(guān)鍵詞候選集確定最終概率最大的兩個(gè)關(guān)鍵詞label(人工規(guī)則,其實(shí)就是給模型加入人的主觀性,有助于提高模型精度)
1.利用re正則表達(dá)式獲取title中書(shū)名號(hào)的內(nèi)容作為重要度最高的候選集;
2.利用訓(xùn)練集標(biāo)簽構(gòu)建keyword_set,利用jieba對(duì)title分詞結(jié)果構(gòu)建jieba_title_set,將10個(gè)候選集中同時(shí)存在于keyword_set和jieba_title_set中的作為重要度第二高的候選集;
3.將10個(gè)候選集中同時(shí)存在于jieba_title_name_list和ltp_title_name_list中的關(guān)鍵詞作為重要度第三高的候選集;
4.將10個(gè)候選集中存在于jieba_title_name_list的關(guān)鍵詞作為重要度第四高的候選集;
5.將10個(gè)候選集中位于title內(nèi)且詞性為名詞的關(guān)鍵詞作為重要度第五高的候選集;
6.將10個(gè)候選集中位于keyword_set的關(guān)鍵詞作為重要度第六高的候選集;
7.將10個(gè)候選集中位于title中,詞性為非名詞的關(guān)鍵詞作為重要度第七高的候選集;
8.其余的候選集作為重要度最低的候選集;
賽后總結(jié)
這次我是第一次接觸跟文本相關(guān)的比賽,所以入門(mén)了挺多關(guān)于文本處理的操作,包括如何分詞,如何做數(shù)據(jù)預(yù)處理(去除停用詞,提高分詞準(zhǔn)確性),如何針對(duì)特定問(wèn)題選擇相關(guān)的模型作為基礎(chǔ)模型(tfidf/tfiwf,textRank,主題模型LSI/LDA),以及怎么針對(duì)問(wèn)題對(duì)結(jié)果進(jìn)行優(yōu)化。這次比賽由于跟其他比賽有重疊,所以用在這上面的時(shí)間并不是特別多,在前期從幾十名不斷優(yōu)化做到第二之后(640分,總分1000),思路有點(diǎn)短路,然后其他比賽時(shí)間也相對(duì)緊張,所以后面就很少再做改進(jìn)了,最終A/B榜都是排名第六,模型還是具有魯棒性的。答辯過(guò)后,看到了其他選手的分享,才知道自己在思路上具有一定的局限性,所以沒(méi)做到前三(前三采用有監(jiān)督模型,四到六采用無(wú)監(jiān)督模型),下面來(lái)總結(jié)一下本次比賽的不足以及其他選手的亮點(diǎn)。
(1)由于是單人賽,而且沒(méi)有跟其他選手或朋友交流,在一定思路做到極限后沒(méi)有開(kāi)拓新的思路,這個(gè)確實(shí)比較可惜。這次比賽區(qū)分答辯選手前后排的根本是,采用的是有監(jiān)督模型還是無(wú)監(jiān)督模型。官方后面的解釋,他們是想引導(dǎo)選手從無(wú)監(jiān)督的角度來(lái)做,所以測(cè)試集的樣本數(shù)遠(yuǎn)遠(yuǎn)大于訓(xùn)練集的數(shù)量,而且訓(xùn)練集的數(shù)量只有1000條,因?yàn)樯癫吖臼且梃b選手的模型落地到實(shí)際的產(chǎn)品中,也對(duì)實(shí)時(shí)性有一定的要求,此時(shí)無(wú)監(jiān)督模型可以在保持一定精度的前提下大大減少訓(xùn)練和預(yù)測(cè)的時(shí)間,有助于算法的落地。
(2)在答辯的時(shí)候,記得評(píng)委曾經(jīng)提問(wèn)過(guò),為啥我沒(méi)想到二分類(lèi),我的回答是陷入了思維局限了,確實(shí),這也可以看出來(lái),一個(gè)人的力量說(shuō)白了還是很有限的。我在本次比賽做了一堆規(guī)則,其實(shí)如果將規(guī)則對(duì)應(yīng)到一個(gè)二分類(lèi)模型來(lái)說(shuō),這樣二分類(lèi)模型所學(xué)到的東西肯定是比人為定義規(guī)則間的優(yōu)先級(jí)要好。一個(gè)規(guī)則,其實(shí)可以對(duì)應(yīng)到二分類(lèi)模型中的一個(gè)甚至是多個(gè)特征(比如書(shū)名號(hào),可以提取成是否是書(shū)名號(hào)中的內(nèi)容這一個(gè)特征),這樣二分類(lèi)模型自然會(huì)根據(jù)樣本學(xué)習(xí)到規(guī)則間的相對(duì)重要度并體現(xiàn)到結(jié)果中。此外,人為做規(guī)則,能做的規(guī)則是有限的,然而如果是二分類(lèi)模型,可以提取很多特征(提取候選詞的tfidf、LDA等特征,也是一種變相的模型stacking融合了),特征如果是對(duì)標(biāo)簽是有區(qū)分度的,那么很有可能是可以給模型增加額外信息,提高模型的精度。
(3)第一名的選手,采用的是二分類(lèi)模型,直接將標(biāo)題作為候選集,然后根據(jù)是否在標(biāo)簽集中打01標(biāo)簽,提取特征,用lightgbm做二分類(lèi),選擇概率較大的兩個(gè)詞作為最終提交的label。比較有特色的特征,計(jì)算詞word2vec與句子doc2vec向量的余弦距離
部分特征:

(4)第二名是通過(guò)tfidf選20個(gè)候選集,然后再打標(biāo)簽,特色特征:在整個(gè)數(shù)據(jù)集里被當(dāng)成候選關(guān)鍵詞的頻率,這個(gè)其實(shí)就是該候選詞在整個(gè)數(shù)據(jù)集中tfidf在前20的頻率
(5)第三名未引入外部詞典,使用詞的凝聚度和自由度從給定文檔中發(fā)現(xiàn)新詞。
(6)第五名使用pyhanlp包來(lái)進(jìn)行命名實(shí)體識(shí)別,識(shí)別人名,據(jù)說(shuō)準(zhǔn)確度比較高。