【NLP】使用Google的T5提取文本特征
作者 | Mike Casale
編譯 | VK
來源 | Towards Data Science
下圖是文本到文本框架的示意圖。每個任務都使用文本作為模型的輸入,通過訓練生成一些目標文本。
這允許在不同的任務中使用相同的模型、損失函數和超參數,包括翻譯(綠色)、語言可接受性(紅色)、句子相似性(黃色)和文檔摘要(藍色)。
在本文中,我們將演示如何使用Google T5對表格數據中的文本進行特征化。你可以使用這個存儲庫中的Jupyter筆記本:
https://github.com/mikewcasale/nlp_primitives
當試圖在機器學習管道中利用真實世界的數據時,通常會遇到書面文本—例如,在預測房地產估價時,有許多數字特征,例如:
“臥室數量”
“浴室數量”
“面積(平方英尺)”
“緯度”
“經度”
等等…
但同時,也有大量的書面文本,比如在Zillow等網站的房地產上市描述中。這些文本數據可以包括許多其他方面沒有考慮到的有價值的信息,例如:
開放式廚房/平面圖
花崗巖個數
硬木地板
不銹鋼電器
最近的裝修
等等…
然而,令人驚訝的是,許多AutoML工具完全忽略了這些信息,因為諸如XGBoost之類的流行表格算法不能直接使用書面文本。
這就是Featuretools基本函數的用武之地。Featuretools旨在為不同類型的數據(包括文本)自動創建特征,然后表格機器學習模型可以使用這些數據。
在本文中,我們將展示如何擴展nlp Primitive庫,以便與Google最先進的T5模型一起使用,并在此過程中創建最重要的nlp特征,進而提高準確性。
關于T5
對于任何不熟悉T5的讀者來說,T5模型出現在谷歌的論文中,題目是Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer。
使用Hugging Face T5的一個機器學習demo
在NLP的背景下,Hugging Face Transformers是一個自然語言處理庫,對很多ML模型開放,并得到了像Flair、Asteroid、ESPnet、Pyannote等庫的支持。
為了擴展NLP庫以便與T5一起使用,我們將構建兩個自定義TransformPrimitive類。出于實驗目的,我們測試了兩種方法:
微調Hugging Face T5-base
Hugging Face T5-base的情感分析
首先,讓我們加載基本模型。
from?simpletransformers.t5?import?T5Modelmodel_args?=?{"max_seq_length":?196,"train_batch_size":?8,"eval_batch_size":?8,"num_train_epochs":?1,"evaluate_during_training":?True,"evaluate_during_training_steps":?15000,"evaluate_during_training_verbose":?True,"use_multiprocessing":?False,"fp16":?False,"save_steps":?-1,"save_eval_checkpoints":?False,"save_model_every_epoch":?False,"reprocess_input_data":?True,"overwrite_output_dir":?True,"wandb_project":?None, }model?=?T5Model("t5",?"t5-base",?args=model_args)第二,讓我們加載預訓練模型。
model_pretuned_sentiment?=?T5Model('t5','mrm8488/t5-base-finetuned-imdb-sentiment',use_cuda=True) model_pretuned_sentiment.args為了對t5模型進行微調,需要對訓練數據進行重組和格式化。
從Kaggle數據集,我們將review_text列映射到一個名為input_text的新列,我們將review_rating列映射到一個名為target_text的新列,這意味著review_rating就是我們試圖預測的內容。
這些更改符合Simpletransformers庫接口,用于微調t5,其中主要的附加要求是指定一個“前綴”,用于幫助進行多任務訓練(注意:在本例中,我們將重點放在單個任務上,因此前綴不必使用,但是,我們無論如何都會定義它,以便于使用)。
dft5?=?df[['review_text','review_rating'] ].rename({ 'review_text':'input_text', 'review_rating':'target_text' },axis=1)dft5['prefix']?=?['t5-encode'?for?x?in?range(len(dft5))]dft5['target_text']?=?dft5['target_text'].astype(str)dft5本例中的目標文本是消費者對給定餐廳的評分。我們可以通過以下方法輕松地微調T5模型
from?sklearn.model_selection?import?train_test_splittrain_df,?eval_df?=?train_test_split(dft5)model.train_model(train_df,?eval_data=eval_df)接下來,我們加載預訓練模型。
test?=?['Great?drinks?and?food',? list(np.array(model.predict(test)).astype(float))'Good?food?&?beer',Generating?outputs:?0%|?|?0/1?[00:00<?,??it/s]?Generating?outputs:?100%|██████████|?1/1?[00:00<00:00,?3.17it/s]?Generating?outputs:?100%|██████████|?1/1?[00:00<00:00,?3.16it/s]?Decoding?outputs:?0%|?|?0/3?[00:00<?,??it/s]?Decoding?outputs:?33%|███▎?|?1/3?[00:00<00:01,?1.14it/s]?Decoding?outputs:?100%|██████████|?3/3?[00:00<00:00,?3.43it/s]?Out[14]:?[4.0,?4.0,?4.0]?'Pretty?good?beers']我們可以看到,微調模型輸出了review_rankings列表[4.0,4.0,4.0],這是一個預測結果。
接下來,讓我們使用預訓練的模型進行測試。
test?=?['Great?drinks?and?food',?'Good?food?&?beer',?'Pretty?good?beers']list(np.where(np.array(model_pretuned_sentiment.predict(test))=='positive',?1.0,?0.0))Generating?outputs:???0%|??????????|?0/1?[00:00<?,??it/s]?Generating?outputs:?100%|██████████|?1/1?[00:00<00:00,??7.57it/s]?Generating?outputs:?100%|██████████|?1/1?[00:00<00:00,??7.56it/s]??Decoding?outputs:???0%|??????????|?0/3?[00:00<?,??it/s]?Decoding?outputs:??33%|███▎??????|?1/3?[00:00<00:01,??1.17it/s]?Decoding?outputs:?100%|██████████|?3/3?[00:00<00:00,??3.50it/s]?Out[15]:?[1.0,?1.0,?1.0]注意,預訓練模型輸出一個布爾真/假值列表,該列表指示語句是正還是負-我們將它們轉換為浮點值,以便更好地與表格建模集成。在這種情況下,所有值都為true,因此輸出變為[1.0、1.0、1.0]。
既然我們已經加載了兩個版本的T5,我們可以構建TransformPrimitive類,這些類將與NLP和Featuretools庫集成。
from?featuretools.primitives.base?import?TransformPrimitive from?featuretools.variable_types?import?Numeric,?Textclass?T5Encoder(TransformPrimitive):name?=?"t5_encoder"input_types?=?[Text]return_type?=?Numericdefault_value?=?0def?__init__(self,?model=model):self.model?=?model????def?get_function(self):?def?t5_encoder(x):model.args.use_multiprocessing?=?Truereturn?list(np.array(model.predict(x.tolist())).astype(float))return?t5_encoder以上代碼創建了一個名為T5編碼器的新類,該類將使用微調的T5模型,下面的代碼創建了一個名為T5SentimentEncoder的新類,該類將使用預訓練的T5模型。
class?T5SentimentEncoder(TransformPrimitive):name?=?"t5_sentiment_encoder"input_types?=?[Text]return_type?=?Numericdefault_value?=?0def?__init__(self,?model=model_pretuned_sentiment):self.model?=?modeldef?get_function(self):def?t5_sentiment_encoder(x):model.args.use_multiprocessing?=?Truereturn?list(np.where(np.array(model_pretuned_sentiment.predict(x.tolist()))=='positive',1.0,0.0))return?t5_sentiment_encoderFeaturetools現在知道如何使用T5來為文本列提供特征,它甚至會使用T5輸出計算聚合
定義了這些新類之后,我們只需將它們與默認類一起以所需的Featuretools格式包起來,這將使它們可用于自動化特征工程
trans?=?[T5Encoder,T5SentimentEncoder,DiversityScore,LSA,MeanCharactersPerWord,PartOfSpeechCount,PolarityScore,?PunctuationCount,StopwordCount,TitleWordCount,UniversalSentenceEncoder,UpperCaseCount]ignore?=?{'restaurants':?['rating'],'reviews':?['review_rating']}drop_contains?=?['(reviews.UNIVERSAL']features?=?ft.dfs(entityset=es,target_entity='reviews',trans_primitives=trans,verbose=True,features_only=True,ignore_variables=ignore,drop_contains=drop_contains,max_depth=4)正如你在下面的輸出中看到的,Featuretools庫非常強大!事實上,除了這里顯示的T5特征之外,它還使用指定的所有其他NLP Primitive創建了數百個特征,非常酷!
feature_matrix?=?ft.calculate_feature_matrix(features=features,entityset=es,verbose=True)features機器學習
現在我們使用包含新創建的T5 Primitive的特征矩陣從sklearn創建和測試各種機器學習模型。
作為提醒,我們將比較T5增強的精確度和Alteryx博客《自動特征工程的自然語言處理》中演示的精確度:https://innovation.alteryx.com/natural-language-processing-featuretools/
使用邏輯回歸:
請注意,上面的0.64邏輯回歸分數顯示了比Featuretools原生邏輯回歸分數0.63有0.01的改進。
使用隨機林分類器:
請注意,上面T5增強的0.65隨機林分類器分數顯示了比Featuretools本機隨機林分類器分數0.64有0.01的改進。
隨機森林分類器特征重要性
我們可以查看sklearn隨機森林分類器的特征重要性,可以看到改進的分數歸于新的T5特征。
從上表中我們可以看到,隨機林模型的最高特征重要性是新創建的特征
T5情感編碼器(標題)!
關鍵特征
T5模型是一個健壯、靈活的文本到文本轉換器,它可以增強幾乎任何NLP任務的結果,包括處理文本數據時NLP Primitive庫的結果。雖然額外的準確度在這里微不足道,但幾乎可以肯定的是,除了情緒分析之外,通過實施額外的預訓練模型,可以提高準確度。
此外,在這個例子中,我們微調的T5版本只在review_text上訓練,而不是在review_title數據上訓練,這似乎與Featuretools創建的特征不一致。糾正這個問題很可能意味著更高的整體性能。
擴展Featuretools框架非常簡單,可以使用Hugging Face transformers和Simpletransformers庫。再加上幾行代碼,精確度就提高了,代碼的復雜度也保持不變。
總結
以上是生活随笔為你收集整理的【NLP】使用Google的T5提取文本特征的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Edge浏览器网页怎么收藏 Edge浏览
- 下一篇: 钉钉密聊安不安全 钉钉密聊别人能看到吗