技術解讀 | 基於fastText和RNN的語義消歧實戰

雲腦科技發表於2018-07-16

1.問題的引入

在我們雲腦科技最近的一個專案中,需要對文字中提取的實體進行消歧(WSD, Word Sense Disambiguation),即確定某個實體在當前上下文中是我們期望的一個意義。

比如,美國電影《壞女孩》由Myriad Pictures Inc.於2013年出品。講述雅蕾克絲,一個女同性戀,父母離異,母親重新找了一個繼父,卻又早早自殺身亡;父親也重新找了個繼母,繼母對她百般刁難。

其中壞女孩、繼父、繼母、同性戀都是候選的電影作品名。但結合上下文,如何去掉歧義候選,只保留壞女孩,這就是我們需要解決的消歧問題。

2.解決消歧問題的一般思路

2.1 基線演算法

機器學習任務一般需要對效果有簡單的基線設定,WSD的基線可以用Lesk演算法確定。人類在類似WordNet的詞彙釋義標註語料上的共識大概75%-80%,這可以作為WSD任務的上限參考。

Lesk是一個經典的演算法。它的主要思想是:在詞典中,常常需要藉助若干其它詞彙來對一個詞進行解釋。因此針對一條語料,我們可以選取它與詞典中詞彙重疊最多的那條釋義。如果詞典中的解釋太過簡單,可以把已標註釋義的例句也當做釋義內容。

2.2 監督學習演算法

監督學習演算法一般涉及如下步驟:

a.確定詞表釋義表,eg: 目標詞bass, 兩個釋義:樂器-貝斯、魚類-鱸魚;

b.獲取訓練語料:google、crawl;

c.特徵提取:一般先設定一個視窗(window),只關心這個視窗內的詞。常用的兩種提取:視窗內每一個位置的詞彙、相對位置、詞性;以及忽略位置和詞性的詞袋錶示,即詞典內詞的出現計數;

d.分類器選擇樸素貝葉斯邏輯迴歸、SVM、KNN、神經網路

2.3 半監督學習演算法

如果對於目標問題沒有足夠的標註語料,如何啟動呢?

一般可以從少量的手動標註啟動,按照同一共現釋義相同進行標註擴充套件,例如:bass的鱸魚解釋一般與fish共現;樂器貝斯解釋一般與play共現。因此可以標註所有<fish, bass> 和 <play, bass>的語句。

還可以按照同一文章釋義相同進行標註擴充套件,例如利用共現詞標註了某個句子,那麼可以確定這個文章中其他的目標詞的同釋義標註。

3.fastText和RNN的組合消歧方法

3.1 選型思路

在本文的應用場景下,我們對於詞彙的候選釋義集合是固定的。比如候選詞壞女孩來說,我們並不關心它的實際解釋,只關心它在當前語境中是否代表一個電影名。

因此,與上述一般化的消歧思路不同,我們可以先把問題轉化成一個語境分類問題。fastText在這種近乎端到端的文字分類問題上有非常不錯的效果,模型尺寸較小而且訓練速度也很快。在fastText分類器對候選詞的上下文進行領域分類後,基本能夠排除掉大部分的非目標領域候選,比如示例語句中的繼父/繼母/同性戀等等。

但是在拿到最終的目標詞提取結果後,發現還有一些電影語境中的其他歧義候選詞。比如美國電影《壞女孩》這個例句,能夠透過電影領域上下文分類,但是候選詞中有電影,沒錯,電影也是一個影片的候選詞。因此,我們還需要更精細化的消歧處理。因此,我們在此處引入了基於RNN的序列標註演算法,在確定語境範圍後,進一步在語境內標註合理的出現位置。

3.2 fastText語境分類

訓練語料

我們的訓練語料是來自一些公開網站的影視資訊和資訊資訊,利用中文標點進行了語句切分。由於我們的語料中絕大多數的作品名是由書名號擴起的,可以利用這一點將語句進一步標註為包含領域關鍵詞的短句。

特徵處理

為了簡化處理,直接將原始語句做了bigram切分。此時我們去掉了語料中的書名號,因為語料的標註是用書名號這種強規則來標註的,因此模型很可能只學到書名號這個特徵。並且在做中文bigram切分時,非中文的數字/英文單詞也需要作為一個整體處理。

訓練模型

利用官方的原始碼編譯二進位制工具進行訓練,以下是訓練調參過程中的一些小tips。

a.使用epoch引數來更好的擬合訓練集;

b.使用wordGram引數,讓fastText學習到連續的切分嵌入,彌補分詞不足和語序的缺失,但是模型大小會飛速增長,我只用到了wordGram=3;

c.使用minCount引數對詞表詞頻進行過濾,避免詞表過於龐大。以我們的語料為例,過濾效果是詞表從75w減少到7w,我選取的minCount=5;

d.使用quantize命令壓縮最終的模型,尺寸會小很多,本例中是300m到7.5m;

e.使用test命令進行驗證集驗證時,會發現準確P和召回R是相等的,這是因為fastText把分類問題都當做多分類來處理,不會輸出針對每個分類的PR,最終會用所有分類的PR進行某種平均。因此需要手動編寫一個基於predict命令的驗證過程;

f.注意語料的設計,起初只用了電影語料的作品句子和非作品句子,結果發現在普通文字上的表現並不好。因此又加入了一部分的社會新聞語料,讓模型能有更好的泛化效果。

3.3 RNN序列標註

訓練語料

語料部分還是採用了fastText相同的規則,利用書名號這種強特徵標註了作品名部分。由於序列標註的分類不平衡問題非常明顯,因此決定用RNN的序列標註作為fastText的一個補充,訓練語料中沒有新增不含作品名的語句。

特徵處理

直接採用字元級別的切分,同時和fastText一樣去掉了書名號,此處將連續的字母和英文單詞都做了特殊標籤的處理,可謂一切從簡。同時將訓練語料統一在長度30上,超長的截斷,不足的補充[eos]。

訓練模型

a.採用多層的雙向RNN+softmax分類;

b.引入了dropout進行正則化處理;

c.針對序列標註的類不平衡問題,起初嘗試了針對分類配置loss權重的方法,但是權重設定過於主觀。最終我們使用了focal loss。Focal Loss的核心思想是樣本因為分類難度的不同對損失函式的貢獻是不同的。鼓勵模型把難分類的分對,而不是進一步最佳化易分類的效果。

4.小結

最後回顧一下我們在這項任務中的若干做法。

1.消歧問題的基線可以藉助貝葉斯、Lesk等簡單演算法來設計;

2.語料不足時可以採用一些半監督的方法來擴充標註樣本,人為總結標註規則;

3.利用fastText做短句分類,確定候選詞所在上下文是否是目標領域;

4.利用RNN在短句中做關鍵資訊標註,過濾掉領域上下文中非關鍵資訊的候選;

5.利用focal loss改善序列標註中的類別不均衡問題,提升模型的召回表現。

歡迎探討。

作者介紹

Amow,雲腦科技機器學習演算法工程師,負責開發NLP方向的基礎服務。

相關文章