您現在的位置是:首頁 > 娛樂

乾貨!NLP使用手冊!快來收藏!

由 中原動力智慧機器人 發表于 娛樂2022-02-09
簡介思考如何將文字轉換為向量的一種自然方法是建立所有單詞的有序列表,例如:圖片由作者提供但是,如果您有較短或較大的條目,會發生什麼情況

灰狼演算法是什麼

乾貨!NLP使用手冊!快來收藏!

一個簡單的問題:怎麼把文字轉為特徵?

假設你的任務是為你的公司產品評論建立一個情緒分析工具。作為一個經驗豐富的資料科學家,你對未來的銷售預測建立了許多見解,甚至能夠根據客戶的購買行為對其進行分類。

但是現在,你很感興趣:你有這麼多的文字條目,並且必須將它們轉化為機器學習模型的特性。怎麼能做到?這是科學家首次遇到文字時的一個常見問題。

儘管尋找經驗豐富的NLP資料科學家可能很簡單,但對於該領域的新手來說,將文字轉換為特徵並非易事。本文的目的是提供一個將文字轉換為特性的指南,作為我在過去幾個月裡構建的NLP系列的延續。

之前,我已經討論了NLP預處理管道中的幾個步驟。現在,這是預處理管道的最後一步,當你精心策劃的文字最終變成機器學習模型可用的特性時(如果這是你的目的-可以有沒有機器學習的NLP,另一個時間的主題)。

與往常一樣,我將介紹三種最常用的建模技術:詞袋模型、基於TF-IDF演算法的模型和Word2Vec模型。

特徵

對於那些不習慣這個詞的人,讓我稍微跑一下題。特徵是被選擇或處理的資料的名稱,這些資料準備用作演算法(通常是機器學習演算法)的輸入。特徵可以是房子的價格,畫素的RGB值,或者在我們的例子中,一個單詞的表示。

乾貨!NLP使用手冊!快來收藏!

從谷歌開發人員機器學習速成課程拿到的圖片,完美描述了什麼是功能。

甚至還有一種叫做“特徵工程”的很酷的技能,即資料科學家對資料進行研究,從資料中獲取特徵。這些特徵在資料中甚至可能不顯式,但可以透過修改現有資料或新增新資料使其更完整來獲得,從而幫助實現更可靠的決策。

因此,最終,我們的目標是獲取原始資料(文字)並將其轉化為特徵(計算機演算法可以處理的東西)。

文字向量化

用於將文字轉換為特徵的技術可以稱為“文字向量化”技術,因為它們都是為了一個目的:將文字轉換為向量(或陣列,如果你希望它更簡單;或者張量,如果你希望它更復雜),然後可以用經典的方式輸入機器學習模型。

乾貨!NLP使用手冊!快來收藏!

文字向量化

旨在將文字轉換為整數(或布林值或浮點數)向量。圖片由作者提供。

把我們的預期結果作為一個向量來思考,這是一個很好的起點,可以讓我們形象化地將文字轉化為特徵。讓我們再考慮一下這個問題。考慮以下短語:

我要把文字轉為資料。

在簡單的計算術語中,向量是具有n個位置的列表。思考如何將文字轉換為向量的一種自然方法是建立所有單詞的有序列表,例如:

乾貨!NLP使用手冊!快來收藏!

圖片由作者提供

但是,如果您有較短或較大的條目,會發生什麼情況?還有,你的機器學習演算法(基本上是一系列的矩陣和向量計算)如何比較兩個詞——人類發明的具有特殊意義的符號?

既然你很聰明,你已經在想:讓我做一本字典或一些類似的結構(一般來說,一個詞彙表),用單詞索引代替單詞!

乾貨!NLP使用手冊!快來收藏!

一個假設的解決方案是為每個單詞建立一個對映……圖片由作者提供

乾貨!NLP使用手冊!快來收藏!

然後用單詞索引對向量進行編碼

你走的路是對的,但是讓我們考慮一下這裡的一些問題:“我的”這個詞比“想要”更重要嗎?這就是機器學習演算法的資料“告訴”的。機器學習演算法不關心這個數字是否是一個索引,只關心它是一個需要計算的值(當然,您可以有一個分類特性,但我們將進一步瞭解它)。

乾貨!NLP使用手冊!快來收藏!

別大喊大叫,詞彙不是值!圖片來自《海綿寶寶》,由作者編輯。

“歸一化,歸一化,歸一化!!!”可以思考一下。但是,請記住:這些不是值!它們是indices。

如果你在資料科學和機器學習方面玩得夠久的話,你可能會想到一個解決方案:使用“”。

獨熱編碼

是對分類特徵進行編碼的過程,其中該特徵的每個可能值都對映到一個新的“列”,如果存在,則將該列設定為1,否則設定為0。

讓我們使用前面提到的詞彙“map”和建議的短語(在本例中,詞彙表與短語中的單詞相同)。我們得到這個:

乾貨!NLP使用手冊!快來收藏!

用獨熱編碼分析“我想把我的文字變為資料”。圖片由作者提供。

現在,如果我們想編碼:“我想要我的資料”,我們會得到:

乾貨!NLP使用手冊!快來收藏!

用獨熱編碼分析“我想要資料”。圖片由作者提供。

太好了,我們找到了一種將資料編碼成機器學習方式的方法!但是有很多問題需要解決:讓我們考慮一下第一個單字頻率——這就是詞袋模型的用武之地!

詞袋模型

獨熱編碼只將值視為“present”和“not present”。這不適用於文字。在許多文字應用中,詞頻起著重要作用。考慮以下兩段:

狗是犬科的馴養食肉動物。它是類似狼的犬科動物的一部分,是分佈最廣的陸生食肉動物。狗和灰狼是姐妹類群,因為現代狼與最初被馴養的狼沒有密切的關係,這意味著狗的直系祖先已經滅絕。這隻狗是第一個被馴養的物種,幾千年來一直有選擇性地培育出各種各樣的行為、感覺能力和身體特徵。

今天我和我的狗出去玩,在公園裡發現了100美元。想到這些錢可以成為一個可憐的老太太一個星期的午餐錢,我很難過。

第一段是維基百科關於狗的文章的第一段,第二段是我寫的一篇偽部落格文章,目的是為了證明這個問題。問題:如果使用者正在搜尋一個帶有“dog”這個詞的假定引擎,你會推薦哪個網頁?

一個獨熱編碼會給兩個條目中的“dog”提供相同的值,因此這不是一個好的方法。

再來看詞袋模型!

乾貨!NLP使用手冊!快來收藏!

這個模型建議使用詞頻向量代替布林值向量。在上面的示例中,單詞“dog”的列在第一個文字中將接收到值“4”,在第二個文字中只接收到“1”。現在,可以規範化這些值,但不是必需的(只為了更快地處理)。

這個模型被稱為“袋”,因為它不符合“秩序”這個詞(就像我們媽媽90年代的包總是凌亂不堪一樣)。

乾貨!NLP使用手冊!快來收藏!

凌亂的包包。圖源自:Cocoon Innovations

,Pinterest

但是在討論單詞袋模型的缺點之前,讓我們看看如何使用Python和Numpy實現它。

這很簡單,但讓我們一步一步來看看。我決定讓它成為一個類,這樣我就可以在一個模型中例項化多個BoW。這是類建構函式:

乾貨!NLP使用手冊!快來收藏!

基本上,我們有一組單詞和兩個dict來儲存單詞索引。

下一步,我們準備好我們的詞袋,透過安裝它(一次新增所有文件,這樣它就可以“學習”我們可以使用哪些單詞)。

乾貨!NLP使用手冊!快來收藏!

最後,我們可以轉換新的輸入,返回整個詞彙表大小的陣列,並計算單詞出現的次數。為此,我使用了numpy,這是一個專門研究向量/矩陣代數的數學和代數庫。它是python當前用於此類任務的預設庫(並用作大多數機器學習庫的輸入格式)。

乾貨!NLP使用手冊!快來收藏!

以下是使用和輸出示例

乾貨!NLP使用手冊!快來收藏!

既然我們已經瞭解了它是如何實現的,我們可以談談模型中的問題:

第一:它完全忽略了語序。您可以透過檢視下圖瞭解這一點:

乾貨!NLP使用手冊!快來收藏!

圖由作者提供

第二:它傾向於非常高的維度。根據牛津英語語料庫,如果你的語料庫至少只佔90%最常見的英語單詞一次,那麼就會產生至少7000個維度的向量(其中大部分都是零,但卻是很多維度)!

但是詞袋很簡單,可以為簡單的問題帶來快速的結果。如果您不確定在構建NLP解決方案時從何處著手,請嘗試基本方法:使用詞袋模型。它是一個很好的基線評估器。

要指出的是,有一種變體在大資料情況下非常有用,特別是在需要比較字元庫中的文字(不考慮語義)的情況下。此方法使用文字木瓦(木瓦)。在這種情況下,不要將句子分解成單詞,而是在每個k個字元處或每個停止單詞處打斷。閱讀更多資訊:

TF-IDF Model

這實際上並不是一個模型,而是在計算一個單詞相對於文件的“相關性”方面的一個改進。為了簡單起見,我稱之為模型。

在TF-IDF模型中,我們不儲存單詞的頻率,而是將TF-IDF演算法的結果儲存在輸入資料上。TF表示術語頻率,IDF表示反向文件頻率。

簡而言之,TF-IDF計算特定文件中單詞的權重,同時考慮單詞的總體分佈情況。結果的呈現方式與單詞包相同:稀疏向量(0表示未出現的單詞,而有些則為float)。

當使用TF-IDF模型時,例如在情緒分析任務中,與單詞袋相比,TF-IDF模型可以返回更好的結果。

為了更好地理解該演算法,我們將該演算法分成兩部分:計算全域性逆

文件頻率,然後計算單個TF-IDF分數。

反向檔案頻率

第一部分是計算每個單詞的全域性IDF值。這個值表示每個單詞在所有文件中的權重(在整個語料庫中)。這意味著,非常普通的單詞總體上的權重較小,而稀有單詞的權重更大(這甚至消除了停止刪除單詞的必要性,因為它們非常常見,所以權重會更小)。

有很多不同的方法來計算TF和IDF(例如,看看Wikipedia的演算法頁面)。我選擇使用logscaleidf,它是用以下公式計算的:

乾貨!NLP使用手冊!快來收藏!

D=文件總數

F=出現該術語的文件數

為了方便開始,我們定義一個輔助方法:

將一個句子轉換成單詞和頻率的dict的簡單方法(可以使用Python collections“Counter”以獲得最佳效能,但為了簡單起見,我將使用舊的dict方法):

乾貨!NLP使用手冊!快來收藏!

然後我們初始化IDF類,類似於BoW類:

乾貨!NLP使用手冊!快來收藏!

為了進行擬合,我們計算了全域性項頻率,然後根據上面的公式計算每個詞的IDF。

乾貨!NLP使用手冊!快來收藏!

很好,我們的檔案有全域性IDF。現在,計算每個句子的TF-IDF,方法是找到每個句子中每個術語的詞頻得分,然後乘以全域性術語IDF。

計算術語頻率

簡而言之,我們用一個句子得到TF-IDF分數

1。 計算句子中術語的詞頻。

2。 將每個術語的詞頻乘以逆文件頻率。

下面是程式碼(請注意,我添加了一些條件和方法來解釋批處理轉換):

乾貨!NLP使用手冊!快來收藏!

我們的TF-IDF特技化器就這樣完成了!

現在,對於每個句子,我們得到一個數組,它是整個詞彙表的大小,以及每個單詞與該句子的相關性(如果缺失,則為0)。

下面是一個輸出示例:

乾貨!NLP使用手冊!快來收藏!

或者更“易讀”:

乾貨!NLP使用手冊!快來收藏!

您可以在這裡找到用於生成上述“解釋”的程式碼。

這是到目前為止實現的提交,請注意,程式碼中會有一些不同,因為我還將使用一些內建在工具集中的結構。

關於詞袋和TF-IDF的一些討論如我們所見,詞袋和TF-IDF方法為一個句子生成一個整個詞彙表大小的向量。這忽略了語序或位置,使得這些技術不利於對連續性敏感的應用程式(大多數NLP應用程式都是)。

一種可能的解決方法是對每個單詞使用BoW/TFIDF陣列,將它們堆疊並作為特徵傳遞,如下圖所示(示例為人工神經網路的輸入層):

乾貨!NLP使用手冊!快來收藏!

在上面的圖片中,你有一個10000*4的稀疏矩陣來表示一個由4個單片語成的句子(即使對每一個布林值使用一個位,每個句子每個單詞也會有大約1kb的空間!想象一下一個龐大的語料庫。用於訓練簡單情感分析模型的計算時間和儲存空間會使其過於昂貴或不可行(事實上,幾年前,由於缺乏足夠的記憶體和處理能力,當問題是機器學習時,文字幾乎是一個未觸及的話題)。

然而,這種方法允許我們保持詞序。如果我們能減少這個向量的維數呢?

下面,要進入單詞嵌入了!

單詞嵌入

我不會深入解釋單詞嵌入,因為有幾種計算方法,大多數都涉及深層神經網路,它們本身需要一段時間來解釋(這不是本文的重點)。

但我會給你最基本和最重要的資訊。

讓我們這樣說:

單詞嵌入是從語境訓練中學習到的單詞的向量表示。它不是每個單詞的分數,相反,它更像是單詞的“座標”。

因此,當訓練一個模型而不是一個詞彙表大小的熱編碼時,需要輸入一個表示輸入的單詞嵌入陣列。這個陣列有一個預定義的d維深度,它通常遠小於詞彙表的大小。

生成單詞嵌入的最著名的技術之一是Word2Vec,它起源於該方法。Word2Vec本身可以使用兩種不同的技術進行計算,但是細節在這裡並不那麼重要。

相反,您最好知道訓練/使用嵌入的方法有很多變化。以下是用於建立嵌入的技術摘要:

Word2vec (Google) - 2 techniques: Continuous Bag of Words (CBoW) and Skip-Gram;

Global Vectors or GloVe (Stanford);

fastText (Facebook) —interesting fact: accounts for out of vocabulary words。

因為單詞是用座標來表示的,所以要對它們進行比較(以比較相似性)。如果使用諸如主成分分析(PCA)等技術適當地縮小維度,則可以繪製單詞,並且繪圖通常會將具有相似含義的單詞顯示在一起,如下圖所示,圖片取自IBM Research Blog:

乾貨!NLP使用手冊!快來收藏!

詞嵌入能夠在一定程度上捕捉詞義。句子甚至可以與嵌入進行比較。圖片來自IBM研究編輯部。

座標通常以大量的維度給出,通常在8到1024之間。透過這種方式,我們得到了一個由8到1024個維度陣列組成的堆疊,這些維度陣列不是稀疏的(它們被大量的浮點填充)。這對計算機來說更好用。

下面是另一個很酷的例子,摘自David Rozado在《PLOS ONE》上的一篇文章:

乾貨!NLP使用手冊!快來收藏!

在考慮人們如何使用嵌入時,必須指出單詞嵌入可以透過兩種不同的方式生成:

1。 透過與正在進行的過程(如情緒分析任務)一起訓練,並根據具體任務捕捉單詞之間的關係。當您使用Keras、Pytorch或Trax等庫定義嵌入層時,會發生這種情況。這些層將單詞索引對映到嵌入值。

2。 透過在一個巨大的語料庫中預先訓練來捕捉語言中最常見的關係。這些經過預訓練的嵌入可以被載入到模型中,以幫助加快學習過程或獲得更好的結果。這就是fastText、Word2vec或GloVe的用武之地。像spaCy這樣的庫提供了這種嵌入使用。

我不想在這裡討論如何對嵌入進行預訓練,但我正在準備一篇專門針對這種做法的文章。我建議你訂閱我的帳戶,以便在它釋出時收到通知,或者留意這一段,因為當它準備好時,我會在它下面貼出一個連結。

乾貨!NLP使用手冊!快來收藏!

為了增加一點關於這個主題的內容,我們也可以在將文字轉換為特徵時進行特徵工程。換句話說,資料科學家可以應用自己的規則(通常透過預處理)來定義在將文字轉換為數字陣列之前應該提取什麼。

正如我們所看到的,將文字轉換為特徵可能是一件簡單而瑣碎的事情,但還有很多事情要考慮。

乾貨!NLP使用手冊!快來收藏!

在輸入到編碼器之前,單詞索引對映到它們各自的嵌入,這是訓練過程中使用的真實值。圖片取自Pythorch seq2seq模型教程。

目前,NLP中的大多數技術只使用單詞嵌入,因為它們更健壯,並且能夠以順序方式使用。

當然,每個演算法和問題都需要對輸入文字進行特定的操作。例如,seq2seq模型通常具有固定的序列長度。為了加強這個長度,使用填充或壓縮。但最終,填充和單詞都被轉換為嵌入。

既然我們已經完成了NLP預處理中最基本的主題,我們可以開始討論應用程式和技術。別忘了訂閱“保持關注”並收到有關下一個主題的通知!

推薦文章