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、女團、楊超越
細粒度主題:娛樂
粗粒度主題:娛樂、時尚、體育