只用標籤名稱就可以做文字分類

2021-10-16 16:54:50 字數 4054 閱讀 9185

對於實際的文字分類需求,沒有標註資料是一件很常見的事情。

針對這種情況,有乙個最樸素的思路可以做:

首先,根據對應的標籤名稱,使用w2c找到對應的相近詞

使用上述的標註資料訓練文字分類模型

使用3步驟的文字分類模型對新資料**,獲得置信度高的文字,之後做半監督。

上面這個思路,非常的簡陋,最終的結果也不會很好。實際工作中,需要有大量的規則去補充。

針對上面的場景,這個**給出了乙個思路。

整個**讀下來,先給個簡單的評價,思路不錯,但是也並不成熟,不過其中有很多細節點可以讓我學習到。

人們在對乙個文字分類的時候,不會看到任何帶標籤的標註資料,而只是通過一些關於描述分類類別的單詞,就可以做出判斷。

舉個例子,人去對文字進行分類的時候,假如文字有乙個類別屬於計算機。腦海中其實是有先驗知識,比如如果句子**現人工智慧,深度學習,nlp等詞彙的時候,人們基於此可以很大概率的判斷出當前這個文字是屬於計算機這個類別。

隨後呢,注意上面只是說的是很大的概率,還會出現蘋果屬於科技類別,但是不屬於水果這個類別,也就是單單第一步還會出現語義歧義的錯誤,所以人們還會通讀一遍句子,根據上下文語義再對句子分類。

作者模擬這個思路,提出了三個步驟:

(1)找到和標籤名稱語義相關性較高的詞彙;

(2)查詢類別指示性單詞並基於這些單詞訓練單詞分類模型

(3)自訓練提公升模型

直譯過來就是通過標籤名稱替換理解類別。

這句話直譯過來的話可能不好理解,更好的表述是找到與標籤名稱語義相關性較高的詞彙。

就像我們上面說的,人們在看到標籤名稱的時候,會聯想到很多與之相關的詞彙。

類別到nlp中,預訓練模型其實就相當於模型的先驗知識,可以從中知道標籤名稱的相近詞彙。

我們知道,bert 訓練的時候是這樣的:mask掉一部分詞彙,然後通過語言模型**mask部分的輸出,計算損失函式;

現在我當前輸入是人工智慧(為了方便理解,我們可以認為輸入它是乙個詞作為整體輸入),那麼輸出的時候其實是在整個詞彙表上做softmax;

基於此,從中挑選出概率最大的50個詞彙,也就是當前這個位置最有可能出現的50個單詞。

進一步的,因為包含人工智慧這個詞的肯定不只是乙個句子,我們對每個句子中的人工智慧做同樣的操作,然後都獲取對應的前50個詞彙。

最後把這所有的50個詞彙累積起來,按照頻率從大到小,選取前100個詞彙,作為可以替換人工智慧這個標籤名稱的相近詞彙。

這個思路,簡單來說,就是從預訓練模型bert獲取標籤名稱的近義詞或者更準確的說是獲取與標籤相關詞彙的過程。

其實,看到這裡,我想到了一點,就是這個過程和我們使用glove或者word2vec獲取近似詞的過程很相似。

只不過bert是乙個動態的權重,受上下文影響,所以獲得結果更加的準確,泛化性也更強。

在**,作者也做了實驗論證這個道理。

這一步,我們得到的結果是類似這種:

簡單總結一下:

兩個步驟:

找到每個句子中存在的標籤名字,使用bert預訓練模型,找到與之最接近的50個單詞。

每個標籤中所有單詞彙總,按照頻率,找出排在前100個單詞,作為當前標籤名稱(label name)的類別詞彙(category vocabulary/category indicative words )

這個步驟,簡單來說是使用bert這類的預訓練模型在單詞這個級別訓練分類模型。

上個步驟中,針對每個label name,我們會得到對應的category vocabulary/category indicative words 。

這個時候乙個最簡單的辦法,就是只要當前的句子出現了category vocabulary中的詞彙,我們就認為當前的句子屬於相對應的label name。

但是這樣做是有很大問題的。

首先,我們知道每個單詞的詞彙意義是與語境有關係的。乙個句子出現蘋果這樣的單詞,你很難武斷的認為這個句子是屬於科技還是水果。

其次,我們得到的每個label name的category vocabulary都是有數量限制的。有的單詞其實也能表達當前label name的含義,但是並未包含在category vocabulary中。

為了緩解這兩個問題,作者提出了masked category prediction (mcp)任務;

簡單講,它分為兩個步驟:

針對句子中的每個單詞,使用bert這種預訓練模型,找到與之最近接的前50個相關詞彙(很類似第一大步驟的第一小步驟);然後將這50個相關和每個標籤的category vocabulary進行比較,當交集超過20個時候,此時這個句子中的這個單詞對應的類別就是對應的這個label name

句子經過第乙個步驟之後,句子中的部分單詞就有了類別。那麼mask掉這些單詞,然後bert相對應的每乙個單詞尾端接乙個分類器對當前單詞做類別的分類。

整體流程,如下圖:

masked category prediction

經過第二個步驟,當前模型仍然存在問題:

有的句子沒有被找到有類別的單詞,所以這些沒有被訓練到

訓練到文字分類模型使用的是對應類別單詞mask那裡的輸出,而不是cls。而cls一般可以看到整個句子的全部資訊。

針對這兩個問題,作者提出使用全部的無標籤資料,進行自訓練。

這一塊我自己知識積累的不多,就不多說了。具體的大家可以去看一下**。

整體的演算法流程如下圖所示:

lotclass_train_流程圖

datasets使用了四種:ag news;dbpedia;imdb;amazon;

實驗效果圖如下:

lotclass各大模型實驗效果圖

bert w. ****** match情況是這樣:句子只要含有標籤名稱的相近詞,就認為當前句子是對應的標籤類別,以此進行訓練。

lotclass w/o. self train是代表lotclass只走前兩步驟,不進行自訓練。

從圖中可以看到,如果不進行sefl-training,lotclass效果在所有資料集上效果也都不錯。

使用了sefl-training之後,lotclass 可以和半監督和監督模型結果媲美。

有乙個問題,lotclass這種方法,相當於在使用bert的情況下,標註了多少資料?

作者做了乙個實驗圖,如下圖:

從效果圖可以看到,lotclass的效果和bert在每個類別有48個標註資料的情況下訓練的效果相當。

我大概算了一下,ag news有4個類別,每個類別48個,也就是總共192個標註樣本。

這個**我比較感興趣的是第乙個步驟,獲取標籤名稱的相近詞彙。

針對這個步驟,做兩個方面的修改:

修改標籤詞彙:分別使用commerce;economy;business作為label name;標籤的名稱雖然變化了,但是每個標籤名稱得到的100個相近詞彙表有一半是重複的,另一半的詞彙表意思都很類似。

這說明,這個方法是有魯棒性的。不會出現,標籤名稱換了乙個相近的名字表示,而得到的詞彙表出現了劇烈的抖動。

分別使用300維度的glove和lotclass獲取標籤名稱相近詞彙,glove得到的詞彙非常的貧乏,而lotclass效果很好,模型具有很好的泛化性;

這個思路也給自己贊個思路,獲取同義詞或者近義詞可以使用這種方法。

說一下自己學到的東西。

其實看到細節1的時候,lotclass方法得到的模型表現相當於使用192個標註資料對bert進行監督訓練。

從這裡來看,標註的成本並不大;不過,應該可以使用此方法為半監督積累資料。

這個方法還不成熟,不過裡面有些思路可以積攢。

為什麼 DOCTYPE 只用新增 就可以了

doctype 是 document type 文件的型別 的縮寫,在web中你要告訴瀏覽器你的xhtml或者html是用的什麼版本,能夠讓瀏覽器根據你宣告的版本來解析html文件,不寫 doctype 你的標識和css都不會生效。位於html第一行,他在html中的doctype有兩個主要目的。1...

緩解焦慮,這麼做就可以了

期待 等待的快感 對幸福的期待本身就是幸福的。相比週日,我們更喜歡周五。因為周五是充滿希望的,快樂的事情馬上就要發生,乙個愉快的週末正向我們走來。週日儘管是休息日,但是周一就要上班了,等待我們的是早起和工作,所以週日其實並沒有那麼幸福。很多時候,我們之所以覺得焦慮,其實不是因為現在的生活太難,而是因...

做每天的自己,你就可以很了不起

我們遇到一件新的東西,剛剛進入自己工作領域時。我們總是會有乙個新的規劃,新的夢想。我們在心裡慢慢的醞釀自己的小情緒,我們總是在心底暗暗的給自己加油鼓勁,我們希望自己能夠每一天都奮發的努力。通過自己的努力,我們能在自己拼搏的行業裡成為乙個領軍人物或知名人物。可是當我們慢慢的接觸了解過後,我們的想法就會...