本文將討論如何通過矢量化、哈希、標記化和其他技術來準備文本,以便與機器學習( ML )和其他數值算法兼容。我將解釋并演示該過程。
自然語言處理( NLP )將 機器學習?( ML )和其他技術應用于語言。然而,機器學習和其他技術通常在被稱為向量的數字數組上工作,這些向量表示數據集中的每個實例(有時稱為觀察、實體、實例或行)。我們稱所有這些數組的集合為矩陣;矩陣中的每一行表示一個實例。按列查看矩陣,每列表示一個特征(或屬性)。
到目前為止,如果不習慣數學語言,這種語言可能看起來相當抽象。然而,在處理表格數據時,數據專業人員已經接觸過這種類型的數據結構,包括電子表格程序和關系數據庫。
畢竟,當人們將行視為實例,將列視為特征時,電子表格就是矩陣。例如,考慮包含過去和現在雇員的數據集,其中每行(或實例)具有表示雇員的年齡、任期、工資、資歷級別等的列(或特征)。
術語
NLP 必須解決的第一個問題是將文本實例集合轉換為矩陣形式,其中每一行都是文本實例的數值表示——向量。但是,為了開始學習 NLP ,有幾個術語很有用。讓我們來介紹一下。
在 NLP 中,單個實例稱為 document ,而 corpus 指的是實例的集合。根據手頭的問題,文檔可能簡單到一個短語或名稱,也可能復雜到整本書。
我們必須選擇如何將文檔分解為更小的部分,這一過程稱為 tokenizing 文檔。因此,這個過程產生 tokens 。令牌是算法可以考慮的意義單位。在整個語料庫中看到的所有標記集稱為 vocabulary 。
一種常見的代詞選擇是簡單地取單詞;在這種情況下,文檔表示為 字里行間(鞠躬) 。更準確地說, BoW 模型在單詞級別掃描整個語料庫中的詞匯,這意味著詞匯是語料庫中看到的所有單詞的集合。然后,對于每個文檔,算法計算語料庫中每個單詞的出現次數。
語料庫中的大多數單詞不會出現在大多數文檔中,因此在一個特定文檔中,許多標記的計數將為零。從概念上講,這基本上就是它,但是一個重要的實際考慮是,當我們從這些計數形成向量時,確保每行的列以相同的方式對齊。換句話說,對于任意兩行,給定任何索引 k ,每行的第 k 個元素表示相同的單詞是至關重要的。
一個例子
在深入了解如何確保行對齊的細節之前,讓我們快速查看一個手工完成的示例。我們將看到,作為一個簡短的例子,作為一個人,確保這種一致性是相當容易的。最后,我們還必須考慮算法的散列部分,以便徹底實現。
假設我們的語料庫是以下四個句子1:
“這是第一份文件。”
“此文檔是第二個文檔。”
“這是第三個。”
“這是第一份文件嗎? “
?
預處理
讓我們應用一些預處理來刪除大小寫和標點符號:
“這是第一個文檔”
“此文檔是第二個文檔”
“這是第三個”
“這是第一份文件嗎?”
符號化
讓我們通過將每個單詞指定為標記來標記預處理的文檔:
“這”、“是”、“第一”、“文件”
“這”、“文件”、“是”、“第二”、“文件”
“和”、“這”、“是”、“第三”、“一”
“是”、“這”、“第一”、“文件”
掌握詞匯
掃描語料庫并獲得每個獨特的單詞,我們可以形成我們的詞匯:
“這”、“是”、“第一”、“文件”、“第二”、“和”、“第三”、“一”
?
矢量化
讓我們計算每個文檔中每個單詞出現的次數。
“ this ”: 1 ,“ is ”: 1 ,“ the ”: 1 ,“ first ”: 1 ,“ document ”: 1 ,“ second ”: 0 ,“ and ”: 0 ,“ third ”: 0 ,“ one ”: 0
“ this ”: 1 ,“ is ”: 1 ,“ the ”: 1 ,“ first ”: 0 ,“ document ”: 2 ,“ second ”: 1 ,“ and ”: 0 ,“ third ”: 0 ,“ one ”: 0
“ this ”: 1 ,“ is ”: 1 ,“ the ”: 1 ,“ first ”: 0 ,“ document ”: 0 ,“ second ”: 0 ,“ and ”: 1 ,“ third ”: 1 ,“ one ”: 1
“ this ”: 1 ,“ is ”: 1 ,“ the ”: 1 ,“ first ”: 1 ,“ document ”: 1 ,“ second ”: 0 ,“ and ”: 0 ,“ third ”: 0 ,“ one ”: 0
?
讓我們把這個收集到一張桌子里。
This | is | the | first | document | second | and | third | one |
1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 0 | 2 | 1 | 0 | 0 | 0 |
1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
如果我們忽略標題,這就是我們要尋找的矩陣。
散列
值得注意的是,排列此矩陣的行和任何其他設計矩陣(將實例表示為行,將特征表示為列的矩陣)不會改變其含義。列置換也是如此。根據我們將標記映射到列索引的方式,我們將獲得不同的列順序,但表示形式沒有任何有意義的變化。
這種將令牌映射到索引的過程稱為散列,這樣就不會有兩個令牌映射到同一個索引2特定的實現稱為哈希、哈希函數或哈希函數。
基于詞匯的哈希
在手工進行矢量化時,我們隱式地創建了一個哈希函數。假設采用 0 索引系統,我們將第一個索引 0 分配給我們沒有看到的第一個單詞。然后我們增加索引并重復這個過程。我們的哈希函數將“ this ”映射到 0 索引列,“ is ”映射到 1 索引列,“ the ”映射到 3 索引列。基于詞匯表的哈希函數有一定的優點和缺點。
基于詞匯表的哈希的優點
將詞匯表用作散列函數,可以反轉散列。這意味著,給定特征(或列)的索引,我們可以確定相應的標記。一個有用的結果是,一旦我們訓練了一個模型,我們就可以看到某些標記(單詞、短語、字符、前綴、后綴或其他單詞部分)如何影響模型及其預測。因此,我們可以通過查看模型如何使用令牌進行預測來解釋、解釋、排除故障或微調模型。我們還可以檢查重要的標記,以辨別它們的包含是否給模型帶來了不適當的偏差。
讓我們考慮由一些機器學習模型產生的偽影。例如,如果我們使用邏輯回歸模型,我們可以將與每個特征相關的系數解釋為其對模型預測的影響。隨機林模型產生特征重要性,它告訴我們隨機林中的決策樹使用每個特征進行決策的頻率。類似地,樸素貝葉斯模型會產生特定類的特征不為零的概率。
基于詞匯表的矢量化的力量在于理解每個特征代表哪個標記。因此,相反,通過邏輯回歸模型,我們可以看到每個 token 對預測的影響有多大。對于隨機林,我們得到與每個 token 相關的特征重要性,這告訴我們隨機林中的決策樹使用每個 token 進行決策的頻率。使用樸素貝葉斯,我們可以提取某個 token 出現在每個類的文檔中的概率。
如果我們發現看似不相關或不恰當的偏見 tokens 對預測有可疑的影響,我們可以將其從詞匯表中刪除。如果我們觀察到某些標記對我們的預測的影響可以忽略不計,我們可以將它們從詞匯表中刪除,以獲得更小、更高效和更簡潔的模型。
基于詞匯表的哈希的缺點
基于詞匯表的哈希有一些缺點,在訓練和預測中使用的內存量相對較大,在分布式訓練中會造成瓶頸。
基于詞匯表的哈希的一個缺點是算法必須存儲詞匯表。對于較大的微粒,更多的文檔通常會產生更多的單詞,從而產生更多的標記。較長的文檔也會導致詞匯表的大小增加。
在單個線程上,可以編寫算法來創建詞匯表,并在單個過程中對標記進行散列。然而,有效地并行執行一次傳遞的算法是不現實的,因為每個線程必須等待其他線程檢查詞匯表(存儲在公共內存中)中是否添加了單詞。如果不將詞匯表存儲在公共內存中,每個線程的詞匯表將導致不同的散列,并且無法將它們收集到一個正確對齊的矩陣中。
并行化矢量化算法的一個更好的方法是在第一次遍歷中形成詞匯表,然后將詞匯表放入公共內存中,最后并行散列。然而,這種方法并沒有充分利用并行化的好處。此外,如前所述,詞匯表可以很快變大,特別是對于包含大型文檔的大型語料庫。
數學散列
幸運的是,還有另一種散列令牌的方法:使用非加密數學散列函數散列每個實例。這種類型的散列函數使用算術、模算術和代數的組合將對象(由其位表示)映射到已知范圍的整數或(位)。由于范圍已知,因此最大值確定矩陣中有多少列。通常,范圍相當大,但對于大多數行,大多數列將為 0 。因此,使用稀疏表示,存儲矩陣所需的內存將是最小的,并且算法可以有效地處理基于稀疏矩陣的操作。
此外,由于沒有詞匯表,使用數學哈希函數進行矢量化不需要詞匯表的任何存儲開銷。沒有詞匯表意味著并行化沒有任何限制,因此語料庫可以劃分為任意數量的過程,允許獨立地對每個部分進行矢量化。一旦每個過程完成對其所占微粒的矢量化,生成的矩陣就可以堆疊起來形成最終矩陣。這種并行化是通過使用數學哈希函數實現的,它可以通過消除瓶頸顯著加快訓練過程。
盡管使用數學散列函數可以減少生成特征向量所需的時間,但它確實是有代價的,即失去可解釋性和可解釋性。因為在使用散列函數時,不可能有效地從功能的索引映射回相應的標記,所以我們無法確定哪個標記對應于哪個功能。所以我們失去了這些信息,因此失去了可解釋性和可解釋性。
結論
在本文中,我們看到了計算機用來將文本轉換為向量的基本算法。我們已經解開了需要數字輸入的算法如何與文本輸入協同工作的謎團。
文本數據集通常非常大,因此我們需要注意速度。因此,我們考慮了一些改進,使我們能夠并行執行矢量化。我們還考慮了可解釋性、速度和內存使用之間的一些折衷。
通過將機器學習應用于這些向量,我們打開了自然語言處理領域。此外,矢量化還允許我們將相似性度量應用于文本,從而實現全文搜索和改進的模糊匹配應用程序。
1此示例來自 SciKit 學習文檔: sklearn.feature_extraction.text .CountVectorizer
2通常,哈希函數 can 將兩個實體映射到同一索引。這稱為沖突,對于散列函數來說應該是極為罕見的。碰撞是不可取的。
?