作者|PURVA HUILGOL
編譯|VK
來源|Analytics Vidhya
機器理解文本的挑戰
“語言是一種極好的交流媒介”
你和我很快就會明白那句話。但機器根本無法處理原始形式的文本數據。他們需要我們將文本分解成一種易於機器閱讀的數字格式(自然語言處理背后的理念!)。
這就引入“詞袋”(BoW)和TF-IDF。BoW和TF-IDF都是幫助我們將文本句子轉換為向量的技術。
在這篇文章中,我將討論“詞袋”和TF-IDF。我們將使用一個直觀和一般的例子來詳細理解每個概念。
示例
我將用一個流行的例子來解釋本文中的Bag of Words(BoW)和TF-IDF。
我們都喜歡看電影(不同程度)。在我決定看一部電影之前,我總是先看它的影評。我知道你們很多人也這么做!所以,我在這里用這個例子。
以下是關於某部恐怖電影的評論示例:
-
點評一:This movie is very scary and long
-
點評二:This movie is not scary and is slow
-
點評三:This movie is spooky and good
你可以看到關於這部電影的一些對比評論,以及電影的長度和節奏。想象一下看一千篇這樣的評論是多么枯燥。顯然,我們可以從中汲取很多有趣的東西,並以此為基礎來衡量電影的表現。
然而,正如我們在上面看到的,我們不能簡單地把這些句子交給機器學習模型,讓它告訴我們一篇評論是正面的還是負面的。我們需要執行某些文本預處理步驟。
“詞袋”和TF-IDF就是兩個這樣做的例子。讓我們詳細了解一下。
從文本創建向量
你能想出一些我們可以在一開始就把一個句子向量化的技巧嗎?基本要求是:
-
它不應該導致稀疏矩陣,因為稀疏矩陣會導致高計算成本
-
我們應該能夠保留句子中的大部分語言信息
詞嵌入是一種利用向量表示文本的技術。還有2種單詞嵌入形式是:
-
Bow,代表詞袋
-
TF-IDF,代表詞頻-逆文本頻率
現在,讓我們看看如何將上述電影評論表示為嵌入,並為機器學習模型做好准備。
詞袋(BoW)模型
詞袋(BoW)模型是數字文本表示的最簡單形式。像單詞本身一樣,我們可以將一個句子表示為一個詞向量包(一個數字串)。
讓我們回顧一下我們之前看到的三種類型的電影評論:
- 點評一:This movie is very scary and long
- 點評二:This movie is not scary and is slow
- 點評三:This movie is spooky and good
我們將首先從以上三篇評論中所有的獨特詞匯中構建一個詞匯表。詞匯表由這11個單詞組成:“This”、“movie”、“is”、“very”、“stear”、“and”、“long”、“not”、“slow”、“spooky”、“good”。
現在,我們可以將這些單詞中的每一個用1和0標記在上面的三個電影評論中。這將為我們提供三個用於三個評論的向量:
點評向量1:[1 1 1 1 1 1 0 0 0 0]
點評向量2:[1 1 2 0 0 1 0 1 0 0 0]
點評向量3:[1 1 1 0 0 0 1 0 1 1 1 1]
這就是“詞袋”(BoW)模型背后的核心思想。
使用單詞包(BoW)模型的缺點
在上面的例子中,我們可以得到長度為11的向量。然而,當我們遇到新的句子時,我們開始面臨一些問題:
-
如果新句子包含新詞,那么我們的詞匯量就會增加,因此向量的長度也會增加。
-
此外,向量還包含許多0,從而產生稀疏矩陣(這是我們希望避免的)
-
我們沒有保留任何關於句子語法和文本中單詞順序的信息。
詞頻-逆文本頻率(TF-IDF)
我們先對TF-IDF下一個正式定義。百科是這樣說的:
“TF-IDF(term frequency–inverse document frequency)是一種用於信息檢索與數據挖掘的常用加權技術。TF是詞頻(Term Frequency),IDF是逆文本頻率指數(Inverse Document Frequency)”
術語頻率(TF)
首先讓我們理解術語頻繁(TF)。它是衡量一個術語t在文檔d中出現的頻率:
這里,在分子中,n是術語“t”出現在文檔“d”中的次數。因此,每個文檔和術語都有自己的TF值。
我們再次使用我們在詞袋模型中構建的相同詞匯表來演示如何計算電影點評2:
點評 2: This movie is not scary and is slow
這里
-
詞匯:“This”,“movie”,“is”,“very”,“stear”,“and”,“long”,“not”,“slow”,“spooky”,“good”
-
點評2的單詞數=8
-
單詞“this”的TF=(點評2中出現“this”的次數)/(點評2中的單詞數)=1/8
同樣地
- TF(‘movie’) = 1/8
- TF(‘is’) = 2/8 = 1/4
- TF(‘very’) = 0/8 = 0
- TF(‘scary’) = 1/8
- TF(‘and’) = 1/8
- TF(‘long’) = 0/8 = 0
- TF(‘not’) = 1/8
- TF(‘slow’) = 1/8
- TF( ‘spooky’) = 0/8 = 0
- TF(‘good’) = 0/8 = 0
我們可以這樣計算所有點評的詞頻:
逆文本頻率(IDF)
IDF是衡量一個術語有多重要的指標。我們需要IDF值,因為僅計算TF不足以理解單詞的重要性:
我們可以計算點評2中所有單詞的IDF值:
IDF('this')=log(文檔數/包含“this”一詞的文檔數)=log(3/3)=log(1)=0
同樣地,
- IDF(‘movie’, ) = log(3/3) = 0
- IDF(‘is’) = log(3/3) = 0
- IDF(‘not’) = log(3/1) = log(3) = 0.48
- IDF(‘scary’) = log(3/2) = 0.18
- IDF(‘and’) = log(3/3) = 0
- IDF(‘slow’) = log(3/1) = 0.48
我們可以計算每個單詞的IDF值。因此,整個詞匯表的IDF值為:
因此,我們看到“is”、“this”、“and”等詞被降為0,代表重要性很小;而“scary”、“long”、“good”等詞則更為重要,因而具有更高的權值。
我們現在可以計算語料庫中每個單詞的TF-IDF分數。分數越高的單詞越重要,分數越低的單詞越不重要:
現在,我們可以計算點評2中每個單詞的TF-IDF分數:
TF-IDF(‘this’, Review 2) = TF(‘this’, Review 2) * IDF(‘this’) = 1/8 * 0 = 0
同樣地
- TF-IDF(‘movie’, Review 2) = 1/8 * 0 = 0
- TF-IDF(‘is’, Review 2) = 1/4 * 0 = 0
- TF-IDF(‘not’, Review 2) = 1/8 * 0.48 = 0.06
- TF-IDF(‘scary’, Review 2) = 1/8 * 0.18 = 0.023
- TF-IDF(‘and’, Review 2) = 1/8 * 0 = 0
- TF-IDF(‘slow’, Review 2) = 1/8 * 0.48 = 0.06
同樣地,我們可以計算出對於所有評論的所有單詞的TF-IDF分數:
我們現在已經獲得了我們詞匯的TF-IDF分數。TF-IDF還為頻率較低的單詞提供較大的值,並且當IDF和TF值都較高時,該值較高。TF-IDF分值高代表該單詞在所有文檔中都很少見,但在單個文檔中很常見。
結尾
讓我總結一下我們在文章中所討論的內容:
-
詞袋只創建一組向量,其中包含文檔中的單詞出現次數,而TF-IDF模型還包含關於更重要的單詞和不重要的單詞的信息。
-
詞袋向量很容易解釋。然而,在機器學習模型中,TF-IDF通常表現得更好。
雖然“詞袋”和“TF-IDF”在各自方面都很受歡迎,但在理解文字背景方面仍然存在空白。檢測單詞“spooky”和“scary之間的相似性,或者將給定的文檔翻譯成另一種語言,需要更多關於文檔的信息。
這就有關於Word2Vec、CBOW、Skip-gram等詞嵌入技術的由來。
原文鏈接:https://www.analyticsvidhya.com/blog/2020/02/quick-introduction-bag-of-words-bow-tf-idf/
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/