1. 程式人生 > >NLP成長計劃(二)

NLP成長計劃(二)

Setup

假設您已經完成了(一)所需的設定。

在本講座中,我們將使用 Gensim和NLTK,這兩個廣泛使用的Python自然語言處理庫。

如果我們想要能夠對文字進行分類,我們需要能夠根據文章、段落、句子和文字的其他主體所包含的資訊以及它們所表示的內容來生成它們的特徵。有很多方法可以做到這一點,我們將採用3種方法。

Term-Document

Bag-of-Words

從文字中提取特徵的一種最簡單的方法是隻計算一個單詞在正文中出現的次數。在這個模型中,單詞的順序並不重要,只考慮每個文件中每個唯一術語的出現次數。

清除文字資料

刪除停頓和標點符號,小寫

  • 有時在將檔案分解成令牌單位時放棄停用詞是有用的。停用詞是語料庫中經常出現的術語,它們對手頭的任務幾乎沒有任何資訊價值。常用的停用詞包括單詞、單詞、單詞和單詞。
  • 標點符號非常相似;雖然它們可以提供語言環境,但有時標點符號太常見,無法提供任何價值。

這些都是停頓或標點符號!

還好,有一種簡單的方法來移除它們:nltk和內建的字串模組有單獨的停頓詞和標點符號列表

Stemming and Lemmatizing

  • 我們也可以發現很多詞有相似的意思,但只有它們的詞性形式等不同。有時在索引之前將同一個單詞的不同形式歸一化給單個根標記是有意義的。有兩種方法可以做到這一點:

    • Stemming: 啟發式方法,切去不同形式單詞的結尾,試圖返回即使有各種變體也保持相同的詞根語素。

      • 比如:
        • I saw that movie and it was terrible →→ I saw that movi and it wa terribl
        • informative informational inform informing →→ inform inform inform inform
    • Lemmatizing: 返回派生的正規化或單詞的字典形式,稱為 lemma

      • 比如:
        • I saw that movie and it was terrible →→ I see that movie and it be terrible
        • am are is be →→ be be be be 

             

請注意,當我們使用這個模型來特徵化文字:

  • 每個特徵向量的長度將是語料庫中詞彙量的大小。
  • 因此,正文的每一個都有很多0。

TF-IDF

Term Frequency: Number of occurrences of a word in a document(文件中單詞的出現次數)
Inverse Document Frequency: Number of documents that contain a certain word scaled by a weight(包含按權重縮放的某個詞的文件數)
Term Frequency - Inverse Document Frequency: (ww這個詞在TT這個文件中出現的次數) * loglog(語料庫中的文件數/包含按權重縮放的ww這個詞的文件數)

讓我們看看我們之前審查的電影評論的TF IDF分數。

看起來更像是一個我們可以用來進行文字分類的特徵向量!

請注意,在TF IDF模型中:

  • 如果一個詞頻繁地出現在語料庫中(比如那些停用詞),這會讓這些詞的得分很低
  • 更罕見的術語通常會有更高的分數。它們往往更具資訊性和描述性
  • 在語料庫內的少量文件中經常出現的術語將具有最高的分數

              

Term-Context

NLP物件的絕大多數被認為是原子符號: king, queen, book, etc.

在向量空間項中,這個向量有一個1和許多0。
king=[1,0,0,0,0,0,0,0,0]
queen=[0,1,0,0,0,0,0,0,0]
book=[0,0,1,0,0,0,0,0,0]

這被稱為"one-hot"表示法。在模型中表示類別是一種常用的方法。然而,它非常稀疏(正如我們從BOW模型中看到的),每行主要是0。

你可以通過它相鄰的詞來代表一個詞,這樣就能獲得更多的資訊。我們可以使用小的上下文來代替整個文件。

  • 段落
  • 句子
  • 一個視窗大小的連續序列

這樣,在上下文單詞計數上定義單詞(假設在相似上下文中出現的兩個詞本身是相似的)

但是基於計數的模型有缺點:

  • 向量大小變大,等於詞彙量大小
    • 稀疏
    • 帶來維度災難
    • 計算代價很高

Word2Vec

Word2Vec是一個無監督神經網路模型,它最大化上下文鄰居之間的相似性,同時最小化不可見上下文的相似性。通過滑動視窗對模型在語料庫上進行訓練,隨機生成初始向量並收斂。在訓練過程開始時設定目標向量的大小,因此向量是密集的,不需要降維技術。

Continuous Bag of Words

                                                        

訓練目標是對於給出上下文詞wc1,wc2,...wcjwc1,wc2,...wcj最大化觀察到正確的目標詞wt的概率。

                                                                  

預測向量被設定為所有上下文字向量的平均值。

Skip-gram

                                                     

訓練目標是對於給出目標詞wt最大化觀察到正確的上下文詞wc1,wc2,...wcjwc1,wc2,...wcj的概率。

                                                                         

在這種情況下,預測向量是目標詞向量。

比如

現在讓我們試著訓練我們自己的單詞嵌入,看看我們能用它們做什麼。

Word2Vec

  • size: 字嵌入模型的維數
  • window: 在每個方向觀察的上下文詞彙的數目
  • min_count: 模型中包含的詞的最小頻率
  • sg (Skip-Gram): '0' 代表 CBOW 模型; '1' i表示 Skip-Gram
  • alpha: 學習率(初始值);防止模型過校正,使收斂更精確。
  • iterations: 通過資料集的次數
  • batch_words: 在每次通過時從資料中取樣的單詞數

                                                              

單詞向量是空間中的方向,可以對單詞之間的關係進行編碼。

詞彙之間的接近可以通過餘弦相似性來計算。

           

Doc2Vec

Doc2Vec, word2vec最強大的擴充套件

Doc2vec (又名 paragraph2vec 或者 sentence embeddings) 將word2vec演算法從詞向量擴張到更大的文字, 比如句子、段落或者整個檔案

                                               

每個段落都對映到一個唯一的向量,用矩陣D中的列來表示,每個單詞也對映到一個唯一的向量,用矩陣W中的列來表示。段落向量和字向量被平均或級聯以預測上下文中的下一個單詞。

每個附加上下文都不是固定長度(因為它被向量化並投影到同一空間)。

額外的引數,但更新是稀疏的,因此仍然有效。

Distrubted Memory (DM)分散記憶體

亮點:

  • 為每個DOC分配和隨機初始化段落向量
  • 使用上下文詞和段落向量預測下一個單詞
  • 在DOC上滑動上下文視窗,但保持段落向量固定(因此:分散記憶體)
  • 通過SGD和反向支柱更新權重

Distrubted Bag of Words (DBOW)

亮點:

  • 只使用段落向量(無詞向量)
  • 在段落中取一個單詞視窗,隨機抽取哪些段落用段落向量預測
  • 更簡單,更有效記憶

讓我們嘗試用Gensim建立自己的DOC2VEC模型

Doc2Vec引數

  • size: 嵌入模型的維數
  • window: 在文件中的每個方向上觀察的上下文字的數目
  • min_count: 包含在模型中的單詞的最小頻率
  • dm (distributed memory):“0”表示dBuy模型;“1”表示DM
  • alpha: Learning rate (initial); 學習速率(初始);防止模型過度校正,使收斂更精細
  • iter: 通過語料庫的迭代次數