使用Facebook的FastText簡化文字分類

銀河1號發表於2019-03-23

使用FastText API分析亞馬遜產品評論情緒的分步教程

使用Facebook的FastText簡化文字分類
本部落格提供了詳細的分步教程,以便使用FastText進行文字分類。為此,我們選擇在Amazon.com上對客戶評論進行情緒分析,並詳細說明如何抓取特定產品的評論以便對他們進行情緒分析。

什麼是FastText?

文字分類已成為商業世界的重要組成部分; 是否用於垃圾郵件過濾或分析電子商務網站的推特客戶評論的情緒,這可能是最普遍的例子。
使用Facebook的FastText簡化文字分類
FastText是由Facebook AI Research(FAIR)開發的開源庫,專門用於簡化文字分類。FastText能夠在幾十分鐘內通過多核CPU在數百萬個示例文字資料上進行訓練,並使用訓練模型在不到五分鐘的時間內對超過300,000個類別中的未出現的文字進行預測。

預先標註的訓練資料集:

收集了從Kaggle.com獲得的包含數百萬條亞馬遜評論的手動註釋資料集,並在轉換為FastText格式後用於訓練模型。
FastText的資料格式如下:
__label__<X> __label__<Y> ... <Text>複製程式碼
其中X和Y代表類標籤。
在我們使用的資料集中,我們將評論標題新增到評論之前,用“:”和空格分隔。
下面給出了訓練資料檔案中的示例,可以在Kaggle.com網站上找到用於訓練和測試模型的資料集。
__label__2 Great CD: My lovely Pat has one of the GREAT voices of her generation. I have listened to this CD for YEARS and I still LOVE IT. When I'm in a good mood it makes me feel better. A bad mood just evaporates like sugar in the rain. This CD just oozes LIFE. Vocals are jusat STUUNNING and lyrics just kill. One of life's hidden gems. This is a desert isle CD in my book. Why she never made it big is just beyond me. Everytime I play this, no matter black, white, young, old, male, female EVERYBODY says one thing "Who was that singing ?"複製程式碼
在這裡,我們只有兩個類1和2,其中__label__1表示評論者為產品打1或2星,而__label__2表示4或5星評級。

訓練FastText進行文字分類:

預處理和清洗資料:

在規範化文字案例並刪除不需要的字元後,執行以下命令以生成預處理和清洗的訓練資料檔案。
cat <path to training file> | sed -e “s/\([.\!?,’/()]\)/ \1 /g” | tr “[:upper:]” “[:lower:]” > <path to pre-processed output file>複製程式碼

設定FastText:

讓我們從下載最新版本開始
$ git clone https://github.com/facebookresearch/fastText.git 
$ cd fastText 
$ make複製程式碼
不帶任何引數執行二進位制檔案將列印高階文件,顯示fastText支援的不同用例:
>> ./fasttext
usage: fasttext <command> <args>
The commands supported by fasttext are:
  supervised              train a supervised classifier
  quantize                quantize a model to reduce the memory usage
  test                    evaluate a supervised classifier
  predict                 predict most likely labels
  predict-prob            predict most likely labels with probabilities
  skipgram                train a skipgram model
  cbow                    train a cbow model
  print-word-vectors      print word vectors given a trained model
  print-sentence-vectors  print sentence vectors given a trained model
  nn                      query for nearest neighbors
  analogies               query for analogies複製程式碼
在本教程中,我們主要使用了supervised,test和predict子命令,對應於學習(和使用)的文字分類。

訓練模型:

以下命令用於訓練文字分類模型:
./fasttext supervised -input <path to pre-processed training file> -output <path to save model> -label __label__ 複製程式碼
該-input命令列選項指的是訓練檔案,而-output選項指的是該模型要儲存的位置。訓練完成後,將在給定位置建立包含訓練分類器的檔案model.bin。

用於改進模型的可選引數:

增加訓練迭代次數:
預設情況下,模型在每個示例上迭代5次,為了更好的訓練增加此引數,我們可以指定-epoch引數。
示例:
./fasttext supervised -input <path to pre-processed training file> -output <path to save model> -label __label__ -epoch 50複製程式碼
指定學習率:
改變學習率意味著改變我們模型的學習速度,是增加(或降低)演算法的學習率。這對應於處理每個示例後模型更改的程度。學習率為0意味著模型根本不會改變,因此不會學到任何東西。良好的學習率值在該範圍內0.1 - 1.0。
lr的預設值為0.1。這裡是如何指定此引數。
./fasttext supervised -input <path to pre-processed training file> -output <path to save model> -label __label__ -lr 0.5複製程式碼
使用n-gram作為特徵:
使用Facebook的FastText簡化文字分類
對於依賴於詞序,特別是情感分析的問題,這是一個有用的步驟。它是指定連續token在n的視窗內的詞都作為特徵來訓練。
我們指定-wordNgrams引數(理想情況下,值介於2到5之間):
./fasttext supervised -input <path to pre-processed training file> -output <path to save model> -label __label__ -wordNgrams 3複製程式碼

測試和評估模型:

以下命令用於在預先註釋的測試資料集上測試模型,並將原始標籤與每個評論的預測標籤進行比較,並以準確率和召回率的形式生成評估分數。
精度是fastText預測的標籤中正確標籤的數量。召回是成功預測的標籤數量。
./fasttext test <path to model> <path to test file> k複製程式碼
其中引數k表示模型用於預測每個評論的前k個標籤。
在400000評論的測試資料上評估我們訓練的模型所獲得的結果如下。如所觀察到的,精確度,召回率為91%,並且模型在很短的時間內得到訓練。
N 400000
P@1 0.913
R@1 0.913
Number of examples: 400000複製程式碼

分析在Amazon.com上產品的實時客戶評價的情緒:

使用Facebook的FastText簡化文字分類

抓取亞馬遜客戶評論:

我們使用現有的python庫來從頁面中抓取評論。
要安裝,請在命令提示符/終端中鍵入:
pip install amazon-review-scraper複製程式碼
以下是給定網址網頁的示例程式碼,用於抓取特定產品的評論:
from amazon_review_scraper import amazon_review_scraper
 
url = input("Enter URL: ")
 
start_page = input("Enter Start Page: ")
 
end_page = input("Enter End Page: ")
 
time_upper_limit = input("Enter upper limit of time range (Example: Entering the value 5 would mean the program will wait anywhere from 0 to 5 seconds before scraping a page. If you don't want the program to wait, enter 0): ")
 
file_name = "amazon_product_review"
 
scraper = amazon_review_scraper.amazon_review_scraper(url, start_page, end_page, time_upper_limit)
 
scraper.scrape()
 
scraper.write_csv(file_name)複製程式碼
注意:在輸入特定產品的客戶稽核頁面的URL時,請確保附加&pageNumber = 1(如果它不存在),以使scraper正常執行。
上面的程式碼從給定的URL中抓取了評論,並按以下格式建立了輸出csv檔案:
使用Facebook的FastText簡化文字分類
從上面的csv檔案中,我們提取標題和正文並將它們一起追加到一起,用訓練檔案中的':和空格分隔,並將它們儲存在一個單獨的txt檔案中以預測情緒。

資料的情緒預測:

./fasttext predict <path to model> <path to test file> k > <path to prediction file>複製程式碼
其中k表示模型將預測每個評論的前k個標籤。
上述評論預測的標籤如下:
__label__2
__label__1
__label__2
__label__2
__label__2
__label__2
__label__2
__label__2
__label__1
__label__2
__label__2複製程式碼
這是相當準確的,可手動驗證。預測檔案隨後可用於進一步的詳細分析和視覺化目的。
因此,在本部落格中,我們學習了使用FastText API進行文字分類,抓取給定產品的亞馬遜客戶評論,並使用經過培訓的分析模型預測他們的情緒。
更多文章歡迎訪問: http://www.apexyun.com
公眾號:銀河系1號
聯絡郵箱:public@space-explore.com
(未經同意,請勿轉載)  


相關文章