Keras深度學習——使用fastText構建單詞向量

語言: CN / TW / HK

theme: hydrogen

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第30天,點選檢視活動詳情

使用fastText構建單詞向量

fastTextFacebook 研究團隊提出的演算法模型,用於有效學習單詞表示和句子分類。fastTextword2vec 的不同之處在於 word2vec 將每個單詞視為最小單位,學習其向量表示形式,但是 fastText 假定一個單詞由 n-gram 組成。例如,sunny[sun, sunn, sunny][sunny, unny, nny] 等組成,在其中我們看到了大小為 n 的原始單詞的子集,其中 n 的範圍可以從 1 到原始單詞的長度。

使用 fastText 的另一個原因是,可以解決單詞不符合 skip-gramCBOW 模型中的最小頻率截止值的情況。例如,appended 一詞與 append 本質上具有相同的意義。但是,如果 append 頻率較高,但在新句子中使用了 append 這個單詞而不是 append,那麼我們就無法獲取準確的 appended 向量。在這種情況下,fastTextn-gram 就會派上用場了。

實際上,fastText 後續同樣使用 skip-gram/CBOW 模型,但是,它增加了輸入資料集,因此可以將沒有見過的單詞也考慮在內。

fastText 提取單詞向量

我們基於 fastText 提取單詞向量的策略如下: - 在gensim庫中使用fastText方法 - 預處理輸入資料 - 將每個輸入句子分解單詞列表 - 根據上一步得到的分解結果構建詞彙表 - 使用先前的輸入資料訓練模型 - 計算單詞之間的相似度

使用 Keras 實現 fastText 生成單詞向量

本節中,我們利用 Keras 實現使用 fastText 生成單詞向量。 首先,匯入相關包,並載入資料集: ```python from gensim.models.fasttext import FastText import pandas as pd

data = pd.read_csv('archive/Tweets.csv') print(data.head()) 預處理資料集並將其轉換為列表,其中每個元素是每個句子中的列表,此過程與我們在 `word2vec` 模型所進行的預處理和轉換步驟相同:python stop = set(stopwords.words('english')) def preprocess(text): text=text.lower() text=re.sub('[^0-9a-zA-Z]+',' ',text) words = text.split() words2 = [i for i in words if i not in stop] words3=' '.join(words2) return(words3) data['text'] = data['text'].apply(preprocess)

list_words=[] for i in range(len(data)): list_words.append(data['text'][i].split()) 定義模型,使用引數 `vector_size` 指定每個單詞的向量維度,並構建詞彙表:python ft_model = FastText(vector_size=50) ft_model.build_vocab(list_words) 訓練模型:python ft_model.train(list_words, total_examples=ft_model.corpus_count,epochs=100) 檢查模型詞彙表中不存在的單詞的單詞向量。例如,詞彙中出現了單詞 `first`;但是,詞彙中沒有 `firstly` 這個詞,在這種情況下,我們檢查 `first` 和 `firstly` 的詞向量之間的相似性:python print(ft_model.wv.similarity('first','firstly')) 計算的輸出結果為 `0.90`,表明兩個單詞之間的相似度非常高:shell 0.90227515 `` 因此,我們可以看到fastText` 模型得到的單詞向量可以幫助我們為詞彙表中不存在的單詞生成單詞向量。

我們也可以使用該方法也來糾正資料集內的拼寫錯誤,因為拼寫錯誤的單詞很可能很少出現,而出現頻率較高的最相似的單詞更可能是拼寫錯誤單詞的正確版本。因此,我們可以使用向量演算法執行拼寫校正,如下所示: python result = ft_model.wv.most_similar(positive=['exprience', 'prmise'], negative=['experience'], topn=1) print(result) 在前面的程式碼中,positive 中有單詞拼寫錯誤,而 negative 中沒有拼寫錯誤,程式碼的輸出是 promise。因此,可以使用此方式糾正拼寫錯誤: shell [('promise', 0.6496826410293579)] 此外,還可以使用 most_similar 方法達到相同的效果: ```python print(ft_model.wv.most_similar('exprience', topn=1))

[('experience',0.9027844071388245)]

``` 但是,需要注意的是,當資料集中拼寫錯誤頻率較高時,該方法並不能得到預期結果。