FastText模型訓練指南:為產品經理量身定制

0 評論 2471 瀏覽 9 收藏 11 分鐘

前段時間,遇到一個文本分類的任務,需要基于書籍的一句話描述,來對書籍進行分類。一開始原本計劃自己從頭來訓練個模型,后來發現預訓練模型fastText竟然如此的優秀,直接用小批量數據即可解決,這倒是省了不少力氣,記錄一下整個過程和大家分享。

一、fastText簡介

fastText 是一個由 Facebook AI 研究團隊開源的文本處理庫,能夠幫助用戶高效地訓練文本分類器。它特別適用于那些需要快速實驗和部署的場景,例如在社交媒體平臺上進行情感分析、主題分類、垃圾郵件檢測等。

fastText雖然在學術上并沒有太大創新,但是它的優點也非常明顯。
在文本分類任務中,fastText(淺層網絡)往往能取得和深度網絡相媲美的精度,卻在訓練時間上比深度網絡快許多數量級。
在標準的多核CPU上, 能夠訓練10億詞級別語料庫的詞向量在10分鐘之內,能夠分類有著30萬多類別的50多萬句子在1分鐘之內。
作者:王江(復旦大學 計算機應用技術博士)https://zhuanlan.zhihu.com/p/32965521

二、fastText原理

fastText模型架構和word2vec中的CBOW很相似, 不同之處是fastText預測標簽而CBOW預測的是中間詞,即模型架構類似但是模型的任務不同。

關于fastText的具體原理,可以參考王江博士的知乎文章

三、fastText應用場景

fastText 是一個高效的文本分類庫,它可以應用于多種場景,尤其是在需要快速處理和分類大量文本數據的情況下。

以下是一些常見的應用場景:

  • 情感分析:分析用戶評論、社交媒體帖子或其他文本數據,以確定它們的情感傾向是積極的、消極的還是中性的。
  • 新聞分類:將新聞報道或文章按照主題、地點、類型等標準進行分類。
  • 意圖識別:在聊天機器人或虛擬助手中的應用,理解用戶查詢的意圖并據此提供響應。
  • 主題分類:對文檔、電子郵件或任何文本內容進行分類,以識別它們涉及的主要主題或領域。
  • 實體識別:從文本中識別和提取特定的實體,如人名、地點、組織、產品名稱等。
  • 關鍵詞提?。簭奈谋局刑崛≈匾年P鍵詞或短語,用于搜索引擎優化(SEO)或文本摘要。
  • 文本相似性:比較文本片段之間的相似性,用于檢測重復內容、抄襲或進行文本聚類。
  • 內容推薦:根據用戶過去的行為和偏好,對文章、產品或服務進行分類和推薦。

由于 fastText 的訓練和預測速度非???,它特別適合需要實時或接近實時處理的應用場景。此外,它的子詞嵌套特性使其在處理形態豐富的語言或存在大量未知詞匯的情況下表現出色。

四、fastText實例????

任務目標:基于書籍的一句話描述,來對書籍進行分類,一開始原本計劃自己從頭來訓練個模型,任務的實現過程如下:

1、數據收集:因為書籍數據來源于網絡,暫無分類標簽,所以隨機抽取300條數據,分為:訓練集100條、測試集100條(剔除標簽)。?????????????????

2、數據標注:針對書籍描述進行打標簽,目前標簽分為22個分類,200條數據,20分鐘搞定,打好的標簽如下:????????????????????????

這個格式fastText定義的,例如“__label__健康”,告訴fastText模型樣本標簽為“健康”,后面的文本是書籍的描述。

3、模型訓練:研究了一下fastText的接口,使用python寫了一個腳本,如下進行模型訓練:?????????

import fasttext

# 加載訓練數據
train_data_path?=?‘train_data.txt’

# 定義模型參數
model = fasttext.train_supervised(input=train_data_path, epoch=25, lr=1.0, wordNgrams=2, verbose=2)

#?保存模型
model.save_model(‘book_classification_model.bin’)

#?加載測試數據
test_data_path = ‘test_data.txt’

#?模型測試
result = model.test(test_data_path)print (‘測試集上數據量’, result[0])print (‘測試集上準確率’, result[1])print (‘測試集上召回率’, result[2])

  • train_data.txt:為訓練集;test_data.txt:為測試集。
  • 模型中的參數:epoch表示訓練論數、lr是學習率、wordNgrams是詞組的長度、verbose是訓練過程中的輸出信息級別。
  • book_classification_model.bin:為訓練后保存的模型(比較大,100條樣本訓練,竟然生成的模型有800M)

訓練速度很快,不到1分鐘就跑完了,輸出結果如下:

好像效果不是很理想,最后發現是因為不同標簽的樣本分布不均導致的,調整樣本分布后,效果還不錯。?????

4、模型效果評估與測試:使用準確率和召回率來進行模型的評估和測試,然后不斷地優化模型的訓練參數和樣本的質量,來提高模型的效果。????????????

5、模型的部署和調用:部署比較簡單,將訓練好的模型(book_classification_model.bin文件),直接放到服務器中,在模型調用時,先定義一個模型實例,然后調用predict方法即可進行分類,具體代碼如下:

import fasttext

#?加載訓練好的模型
model = fasttext.load_model(‘book_classification_model.bin’)

#?打開需要預測的文本文件

input_file?=?‘data.txt’with?open(input_file,?‘r’,?encoding=’utf-8′)?as?f:????
   lines?=?f.readlines()

# 預測文本內容的標簽并輸出
for?line?in?lines:????
   line?=?line.strip()??#?去除換行符    
   if?line:??#?確保行不為空        
       label, confidence = model.predict(line)????????
       label?=?label[0].replace(‘__label__’,?”)??#?去除預測結果中的?‘__label__’?前綴????????
       print(f”標簽:?{label}t置信度:?{confidence}t書籍描述:?{line}t”)

輸出結果如下:

從結果上看,好像有點兒問題,準確率較低,最后排查分析了一下訓練集,發現商業類的樣本占了60%,總共18個分類,商業類一個分類占了60%,其他17個分類占了40%,訓練集樣本數據分布極度不均衡,導致分類效果較差,調整樣本后效果就改善了很多。

五、總結

對于簡單任務,使用預訓練模型是一個比較好的選擇,在訓練過程中特別要注意2個地方:

  1. 樣本質量:要知道垃圾入、垃圾出,一定要確保樣本數據的質量,打的標簽一定要準確,另外就是樣本分布盡可能均衡(比例相同),不至于模型效果偏重于某個分類。????????????
  2. 模型參數:主要是學習率,它控制著模型訓練過程中的更新權重的速度,學習率越大模型訓練越快,但是準確率會有所影響。?常見的做法是開始時使用較大的學習率,以便快速接近最優解,然后隨著訓練的進行逐漸減小學習率,以便更精細地調整權重。

本文由人人都是產品經理作者【長弓PM】,微信公眾號:【AI產品經理社】,原創/授權 發布于人人都是產品經理,未經許可,禁止轉載。

題圖來自Unsplash,基于 CC0 協議。

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 目前還沒評論,等你發揮!