資料劃分

明天依舊可好 | 柯尊柏發表於2018-08-27

前言

這段時間在研究自然語言處理的相關問題,主要是學習如劃分資料,嘗試過利用機器學習中的相關知識建立模型對資料進行評分後加以劃分,但是由於語料庫的不足導致訓練出的模型對資料的區分度不夠,另一方面也是因為部分資料比較‘刁鑽’難以以正常方法區分。後來嘗試過呼叫百度的詞法分析,利用百度平臺現成的技術對資料做初步處理,然後再進一步處理,這樣會大大降低資料劃分的難度。做到後面發現百度的詞法分析存在太多不足,許多作品、名人以及地名都不能很好得到識別,基於百度詞法分析得出資料劃分結果正確率只能維持在85%上下,很難再得到提高。後面也試過利用boson平臺的相關技術,和百度一樣也存在很多不足。經過一番思考決定建立一套自己的資料劃分流程,寫下這篇部落格用以記錄。


這裡我們把名人資料、非名人資料作為劃分物件
名人資料:介紹某位名人的一段(一句)話,例如:Raj Babbar,演員,主要作品有《迷宮下的罪惡2》、《天命玩家》、《Bodyguard》等。 (下面統稱為A資料
非名人資料:不是介紹某位名人的一段(一句)話,例如:德國ABASAG一向致力於促進“企業資源規劃系統”(ERP)在中國的發展。(下面統稱為B資料


資料劃分流程主要分以下幾個步驟:

  • 資料分詞
    • 對A資料進行分詞
    • 將所有詞彙單元存入詞袋
  • 特徵提取
    • 分等級提取特徵詞彙
    • 對不同等級特徵詞彙分別進行評分
  • 詞彙評分
  • 獲取AB合格率分界線
    • 依據每條資料的長度劃分
    • 分別獲取不同長度的資料的AB評分分界線
  • 優化
    • 優化特徵詞彙的等級劃分和評分
    • 優化資料長度的劃分
  • 確定分界線

資料分詞

資料分詞,在整套流程中以結巴分詞為標準,避免產生分詞誤差問題。以‘|’為分詞的分隔符,在分詞過後通過split()函式將詞彙提取出來並存入詞庫。

text='|'.join(jieba.cut(text))

text_list = text.split('|')

很明顯結巴分詞完全可以達到我們想要的效果。

還在路上,稍等...

特徵提取

在經過第一步的分詞後獲取了大量詞彙,第二步就是要把這些資料中具有代表性的高頻詞彙提取出來。按照每個詞彙出現的頻率進行統計,考慮到還存在是、的、這、而、與等等沒有區分度的詞彙,在提取高頻詞彙後我們還要將其中沒有區分度的詞彙刪除防止其對我們後面的資料評分造成影響。(下面所說的高頻詞彙、特徵詞彙均不包括這些沒有區分程度的詞彙,就不多加贅述了)

還在路上,稍等...

特徵詞彙的評分規則如下

詞彙頻率 特徵親密度 評分
前50 非常親密 4分
50~100 親密 3分
100~200 比較親密 2分

還有一些明顯的名人特徵詞彙,列舉如下

資料型別 評分
人名 4分
地名 3分
作品 4分
時間 4分

對於人名的識別,由於在英文取名這個小程式中我們儲存了大量的名人,不需要花費太多精力可以直接進行判斷。對於作品名,一般都是用書名號括起來的,這個也可以很好解決,對於地名這個就比較麻煩,我們現在沒有現成的資料資源,還是需要藉助百度的詞法分析,條件允許的話最好還是自己收集地名資料,百度的詞法分析有時候在地名的識別上還是不夠準確的。

詞彙評分與分界線劃定

拿到每一條資料我們需要先進行分詞,取得每條資料的詞彙總數(n),每個詞彙給予2分,那麼該條資料的總分就是2n,下一步獲取這條資料中特徵詞彙的得分(m),那麼這條資料的合格率就是m/2n,評分就此完成。我們將所有資料的合格率進行統計並製成圖。很明顯A資料與B資料的分界線在0.35附近。

  • 橫軸:資料合格率
  • 縱軸:每個合格率資料的條數
還在路上,稍等...

優化

在這一步,我們就需要綜合我們的評分規則以及我們在上一步得出來的資料合格率統計圖,使AB之間分界線更加明確。不斷細化特徵資料的等級劃分,提取前500個高頻詞彙分5個等級。對不同長度的資料AB分界線也是有所不同的,長資料包含有大量的解釋性文字特徵詞彙佔比相對較少,短資料言簡意賅特徵詞彙佔比多AB分界線自然隨之右移。考慮到這一點我們就需要對不同長度的資料取不同的分界線,在優化時資料長度時細化它自然就需要考慮在內了。

  • 橫軸:資料合格率
  • 縱軸:每個合格率資料的條數
還在路上,稍等...

確定分界線

隨著優化的進行AB不斷線性化,優化的難度越來越大效果也越來越小,AB分界線只能無限接近線性,如同一個反比例函式無限接近於座標軸卻永遠不會相交於座標軸。

相關文章