MOne︱基於詞包的無監督多主題得分 練習題

代碼可見:mattzheng/TopicClassifier

1 開源的今日頭條數據

又開源了一個某機構整理的今日頭條數據,可見:今日頭條中文新聞文本(多層)分類數據集

本數據集有1000+分類,2914000條數據,雖然沒有放開正文,但是也是非常好的詞包收集源,於是筆者花了很久整理一版本。今日頭條的數據樣式爲:

以|,|分割的各字段,從前往後分別是 新聞ID,分類代碼,新聞字符串(僅含標題),新聞關鍵詞,新聞label

1000866069|,|tip,news|,|【互聯網資訊】PPT設計寶典!十招教你做出拿得出手的PPT|,|互聯網,美國,ppt,powerpoint,幻燈片,演示文稿,微軟,字體列表|,|

由開源的內容就可以構建一套新聞類的詞包。但是發現,分類代碼太過詳細,1000+類別,項目太多,而且準確率有待考察,還不如直接歸類到大類,粗線條一些的。下面做了一些數據清洗:

  • 1、分類約束,只考察大類,把譬如: digital/appliances/small_home_appliance
    digital/appliances/television折算成digital
  • 2、有一些素材不是那麼優質,主題點很多,反正數據2000W+,只篩選主題分類代碼只有一種類別的素材
  • 3、約束字數,不能有1個字以及字數超過8

'新聞關鍵詞''新聞label'字段,同質化挺多,經過篩選之中,兩個語料質量都挺高的。


2 準備主題詞包素材

主題詞包素材,包括四樣內容:

  • 每個詞出現在哪些主題之中,topic
  • 每個詞出現在哪些主題之中,同時統計每個詞主題頻次,topic_detail
  • 每個詞TF,tf
  • 每個詞IDF,idf

每個單詞的格式樣式爲:

{
    'word':{
            'idf':1,
            'tf':1,
            'topic': ['new','sports']
            'topic_detail':{
                'digital': 16,
                'emotion': 4,
                'general_positive': 0
    }
  }
}

其中'topic''topic_detail'是對應的。同時自己寫了一個計算TFIDF的過程,但是計算IDF必須要不斷遍歷全文件,花了好幾天時間終於計算出結果。

最終整理得到了如下爲'網易雲音樂'的主題內容:

{'idf': 9.0134188194616147,
 'tf': 88,
 'topic': ['digital',
  'news_tech',
  'news_entertainment',
  'news_baby',
  'news_game',
  'news_car',
  'news_house',
  'emotion',
  'news_finance'],
 'topic_detail': {'digital': 16,
  'emotion': 4,
  'general_positive': 0,
  'news': 0,
  'news_agriculture': 0,
  'news_astrology': 0,
  'news_baby': 2,
  'news_car': 2,
  'news_collect': 0,
  'news_comic': 0,
  'news_culture': 0,
  'news_design': 0,
  'news_edu': 0,
  'news_entertainment': 35,
  'news_fashion': 0,
  'news_finance': 1,
  'news_food': 0,
  'news_game': 4,
  'news_health': 0,
  'news_history': 0,
  'news_home': 0,
  'news_house': 1,
  'news_military': 0,
  'news_novel': 0,
  'news_pet': 0,
  'news_politics': 0,
  'news_society': 0,
  'news_sports': 0,
  'news_tech': 28,
  'news_travel': 0,
  'news_world': 0,
  'science_all': 0,
  'technique': 0,
  'video_ent': 0}}

記錄每個詞的詞頻、IDF,以及分屬主題以及每個主題出現頻次。


3 MOneTopic 無監督主題得分流程

有些主題判定分出關鍵內容之後就打上一個標籤,但是每個詞語的屬性很多樣,那麼句子的屬性也有可能有很多屬性。
基於前面整理的詞包素材內容,包含詞粒度的四樣內容:每個詞分屬主題、分屬主題頻數、詞TF/IDF信息。
那麼接下來的流程就是:

3.1 一句話輸入:

網易雲音樂是一款專注於發現與分享的音樂產品,依託專業音樂人、DJ、好友推薦及社交功能,爲用戶打造全新的音樂生活。

3.2 用戶詞典載入

jieba.add_word並規定詞性,然後分詞時候根據自定義的詞性就可以比較好的篩選出這些關鍵詞。當然這些關鍵詞把順序打亂了。

3.3 計算主題得分

這邊主題得分可以有兩種類型:

  • 粗粒度:每個詞分屬主題topic、
  • 細粒度:分屬主題頻數topic_detail

    {‘perTopic’: {‘digital’: {‘degree’: 5.1740782122905022, ‘num’: 1362},
    ‘news_baby’: {‘degree’: 1.3448044692737429, ‘num’: 354},
    ‘news_culture’: {‘degree’: 1.4739664804469272, ‘num’: 388},
    ‘news_entertainment’: {‘degree’: 19.64022346368715, ‘num’: 5170}}

那麼這個就是細粒度版本的,可以看到每個主題的計數都很誇張,這個把每個單詞的屬性;

{'totalTopic': {'digital': {'degree': 2.6153846153846154, 'num': 6},
  'news_entertainment': {'degree': 2.6153846153846154, 'num': 6},
  'news_finance': {'degree': 2.6153846153846154, 'num': 6},
  'news_tech': {'degree': 3.4871794871794872, 'num': 8}

粗粒度版本中的主題數量就沒那麼誇張。

這邊的篩選規則是,超過這些主題內容的數值的90%分位數的進行保留。

3.4 貼上關鍵詞的TF/IDF

從詞包之中拿出來,貼出:

{'DJ': {'idf': 10.794004988091546,
   'tf': 14,
   'tfidf': 151.11606983328164},
  '產品': {'idf': 12.403442900525645, 'tf': 2, 'tfidf': 24.80688580105129},
  '分享': {'idf': 12.808908008633811, 'tf': 1, 'tfidf': 12.808908008633811},
  '發現': {'idf': 12.403442900525645, 'tf': 2, 'tfidf': 24.80688580105129},
  '好友': {'idf': 10.729466466953975, 'tf': 15, 'tfidf': 160.94199700430963},
  '打造': {'idf': 10.457532751470332, 'tf': 20, 'tfidf': 209.15065502940664},
  '推薦': {'idf': 11.7102957199657, 'tf': 5, 'tfidf': 58.551478599828499},
  '生活': {'idf': 10.668841845137539, 'tf': 16, 'tfidf': 170.70146952220063},
  '用戶': {'idf': 12.403442900525645, 'tf': 2, 'tfidf': 24.80688580105129},
  '社交功能': {'idf': 12.403442900525645, 'tf': 2, 'tfidf': 24.80688580105129},
  '網易雲音樂': {'idf': 9.0134188194616147, 'tf': 88, 'tfidf': 793.18085611262211},
  '音樂': {'idf': 4.4418402757952107, 'tf': 8605, 'tfidf': 38222.035573217785},
  '音樂人': {'idf': 8.4458093838454467, 'tf': 156, 'tfidf': 1317.5462638798897}}

4 MOneTopic 函數記錄

在本篇使用的函數中,筆者爲了方便自己記憶,有如下的函數:

  • getPseg:按照詞性進行分詞,可以有效將定義的關鍵詞暴露出來;
  • totalTopic,粗粒度主題得分,每個詞基本屬性,不帶詞頻,[‘體育’,’新聞’]
  • perTopic,細粒度主題打分,每個基本屬性+帶詞頻,[‘體育’:10,’新聞’:1]
  • ShowTfidf,根據詞典把每個詞的IDF、TF灌入;
  • TopN,主要對totalTopic/perTopic進行排序處理,原則是大於90%分位數的保留,該函數可以調節。
  • TopicClassifier,主函數,如下解釋。
TopicClassifier(sentense,TopicDict,topic_class,percs = 90,allowPOSs = ['topic'])

其中,

  • sentense爲輸入單個句子;
  • TopicDict爲今日頭條整理的詞典;
  • topic_class,如附件;
  • percs,代表粗粒度、細粒度主題得分的時候,篩選前90%分位數;
  • allowPOSs ,代表分詞的時候,給入的詞性。

MOneTopic 無監督主題標記設想

由於整理出來的質量高的分類都是新聞類的,所以筆者自己整理的數據集比較適合鑑別新聞類文本的主題。
主題標記的粗粒度以及細粒度版本都各有自己優缺點。

那麼模塊如何使用,就留由看客自己鑑定了。


案例一:

‘網易雲音樂是一款專注於發現與分享的音樂產品,依託專業音樂人、DJ、好友推薦及社交功能,爲用戶打造全新的音樂生活。’

關鍵詞:音樂、音樂人、網易雲音樂、打造、生活
細粒度主題:娛樂、數碼
粗粒度主題:科技、娛樂、數碼、金融


案例二:

‘世界盃小組賽進入最後一輪,前2輪表現極其出色的C羅贏得了全世界的稱讚,就連葡萄牙總統馬塞洛-雷貝洛-德索薩也在同俄羅斯總統普京會面時,也不禁自誇:我們葡萄牙可是有C羅這種頂級巨星的。’

關鍵詞:C羅、馬塞洛、葡萄牙、表現、總統、俄羅斯總統普京
細粒度主題:體育
粗粒度主題:體育、國際、健康


案例三:

‘《創造101》終於收官了——經過昨晚(6月23日)的一夜鏖戰,十一名女團人選最終確定:孟美岐、吳宣儀、楊超越、段奧娟、yamy、賴美雲、紫寧、Sunnee(楊芸晴)、李紫婷、傅菁、徐夢潔。’

關鍵詞:創造101、女團、楊超越
細粒度主題:娛樂
粗粒度主題:娛樂、時尚、體育

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章