NLP實踐-Task6

任務鏈接:https://wx.zsxq.com/dweb/#/index/222248424811

1.one-hot

one-hot編碼(獨熱編碼)用來解決類別型數據的離散值問題

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import  OneHotEncoder

# one-hot方法一
print(pd.get_dummies(['bb', 'aa', 'cc', 'dd', 'bb', 'dd', 'aa', 'bb']))

# one-hot方法二
le = LabelEncoder()
ohe = OneHotEncoder(sparse=False)
data = [[1, 1, 2],
        [2, 2, 1],
        [4, 3, 2],
        [1, 4, 2]]
print(ohe.fit_transform(data))

2.word2vec

參考鏈接:https://blog.csdn.net/qq_24003917/article/details/80389976
word2vec是從大量文本語料中以無監督的方式學習語義知識的一種模型,通過學習文本來用詞向量的方式表徵詞的語義信息,即通過一個嵌入空間使得語義上相似的單詞在該空間內距離很近。word2vec模型實際上分爲了兩個部分,第一部分爲建立模型,第二部分是通過模型獲取嵌入詞向量。Word2Vec的整個建模過程實際上與自編碼器(auto-encoder)的思想很相似,即先基於訓練數據構建一個神經網絡,當這個模型訓練好以後,我們並不會用這個訓練好的模型處理新的任務,我們真正需要的是這個模型通過訓練數據所學得的參數,例如隱層的權重矩陣,而這些權重在word2vec中實際上就是我們試圖去學習的“詞向量”。

import pandas as pd
from gensim.models import Word2Vec

text = [['4', '3', '7', '6', '5', '7', '8', '1'],
        ['2', '2', '3', '9', '1', '8', '3', '7'],
        ['1', '4', '2', '4', '6', '5', '9', '8', '3'],
        ['5', '7', '9', '7', '5', '6', '3', '2', '6'],
        ['8', '2', '5', '8', '8', '1', '7', '8', '3'],
        ['1', '4', '1', '7', '2', '4', '6', '8', '4', '7'],
        ['4', '8', '6', '3', '3', '3', '4', '1', '9', '4'],
        ['7', '4', '2', '5', '1', '6', '4', '3', '1', '4']]
model = Word2Vec(text, size=5, min_count=1, window=10, iter=10)
print(model['3'])  # 輸出3的詞向量
print(pd.DataFrame(model[text[0]]).mean())  # 輸出text第1行詞向量均值

3.FastText

參考鏈接1:https://blog.csdn.net/qq_16633405/article/details/80578431
參考鏈接2:https://blog.csdn.net/sinat_26917383/article/details/54850933
參考鏈接3:https://blog.csdn.net/ymaini/article/details/81489599

3.1簡介

fastText是一種Facebook AI Research在16年開源的一個文本分類器。 其特點就是fast。相對於其它文本分類模型,如SVM,Logistic Regression和neural network等模型,fastText在保持分類效果的同時,大大縮短了訓練時間。

3.2原理

fastText 方法包含三部分:模型架構、層次 Softmax 和 N-gram 特徵。
fastText 模型輸入一個詞的序列(一段文本或者一句話),輸出這個詞序列屬於不同類別的概率。
序列中的詞和詞組組成特徵向量,特徵向量通過線性變換映射到中間層,中間層再映射到標籤。
fastText 在預測標籤時使用了非線性激活函數,但在中間層不使用非線性激活函數。
fastText 模型架構和 Word2Vec 中的 CBOW 模型很類似。不同之處在於,fastText 預測標籤,而 CBOW 模型預測中間詞。
第一部分:fastText的模型架構類似於CBOW,兩種模型都是基於Hierarchical Softmax,都是三層架構:輸入層、 隱藏層、輸出層。

CBOW模型又基於N-gram模型和BOW模型,此模型將W(t−N+1)……W(t−1)W(t−N+1)……W(t−1)作爲輸入,去預測W(t) 
fastText的模型則是將整個文本作爲特徵去預測文本的類別。

第二部分:層次之間的映射 
將輸入層中的詞和詞組構成特徵向量,再將特徵向量通過線性變換映射到隱藏層,隱藏層通過求解最大似然函數,然後根據每個類別的權重和模型參數構建Huffman樹,將Huffman樹作爲輸出。 

第三部分:fastText的N-gram特徵 
常用的特徵是詞袋模型(將輸入數據轉化爲對應的Bow形式)。但詞袋模型不能考慮詞之間的順序,因此 fastText 還加入了N-gram特徵。 

3.3fastText詞向量與word2vec對比

fastText = word2vec中cbow + h-softmax的靈活使用 
靈活體現在兩個方面:
模型的輸出層:word2vec的輸出層,對應的是每一個term,計算某term的概率最大;而fastText的輸出層對應的是 
分類的label,不過不管輸出層對應的是什麼內容,起對應的vector都不會被保留和使用。
模型的輸入層:word2vec的輸入層,是 context window 內的term;而fasttext 對應的整個sentence的內容,包括term,也包括 n-gram的內容;。
兩者本質的不同,體現在h-softmax的使用。
word2vec的目的是得到詞向量,該詞向量最終是在輸入層得到,輸出層對應的 h-softmax 也會生成一系列的向量,但最終都被拋棄,不會使用。 
fasttext則充分利用了h-softmax的分類功能,遍歷分類樹的所有葉節點,找到概率最大的label(一個或者N個)。

import fastText

# 參考鏈接1:https://blog.csdn.net/ymaini/article/details/81489599
# 參考鏈接2:https://www.cnblogs.com/gaofighting/p/9552821.html

# 訓練數據
# __label__1 6 8 5 7 1 9 7
# __label__0 4 5 1 7 2 8 4
# __label__1 6 8 8 3 2 0 7
# __label__0 3 3 1 4 2 9 1
# __label__1 6 7 5 6 9 8 6
# __label__0 1 5 2 3 4 1 4
# __label__0 3 5 1 2 0 2 1
# __label__1 6 7 5 7 8 4 9

# @param input: 訓練數據文件路徑
# @param lr: 學習率
# @param dim: 向量維度
# @param ws: cbow模型時使用
# @param epoch: 次數
# @param minCount: 詞頻閾值, 小於該值在初始化時會過濾掉
# @param minCountLabel: 類別閾值,類別小於該值初始化時會過濾掉
# @param minn: 構造subword時最小char個數
# @param maxn: 構造subword時最大char個數
# @param neg: 負採樣
# @param wordNgrams: n-gram個數
# @param loss: 損失函數類型, softmax, ns: 負採樣, hs: 分層softmax
# @param bucket: 詞擴充大小, [A, B]: A語料中包含的詞向量, B不在語料中的詞向量
# @param thread: 線程個數, 每個線程處理輸入數據的一段, 0號線程負責loss輸出
# @param lrUpdateRate: 學習率更新
# @param t: 負採樣閾值
# @param label:  類別前綴
# @param verbose:
# @param pretrainedVectors: 預訓練的詞向量文件路徑, 如果word出現在文件夾中初始化不再隨機
# @return model object

# 分類訓練
classifier = fastText.train_supervised('./data/fastText_train.txt')

# 模型預測,給定文本預測分類,返回預測標籤和概率
label, prob = classifier.predict('6 8 5 7 1 9 7')
print(label)
print(prob)

# 模型預測,根據給定的數據集對模型進行評價,返回樣本個數、準確率、召回率
n, accuracy, recall = classifier.test('./data/fastText_test.txt')
print(n, accuracy, recall)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章