【NLP】基于GloVe词向量的迁移学习
??作者 | Kourosh Alizadeh
編譯 | VK
來源 | Towards Data Science
在過去,我在為我的一個(gè)項(xiàng)目訓(xùn)練詞向量,但我一直在碰壁。我在研究哲學(xué)史上的文本,試圖找到可以揭示作者如何使用一個(gè)詞的向量。但我一直得到這樣的結(jié)果:
如果你斜視得很厲害,也許這是有道理的。畢竟,愛確實(shí)與完美有關(guān),對(duì)吧?
但是相似性分?jǐn)?shù)很小,我們不想為了讓結(jié)果有意義而瞇著眼睛看。
為了解決這個(gè)問題,我試著調(diào)整超參數(shù),但結(jié)果甚至比這更差。
但后來我靈機(jī)一動(dòng)。我將使用GloVe預(yù)訓(xùn)練好的詞向量作為基線,而不是單獨(dú)在我的數(shù)據(jù)集上訓(xùn)練數(shù)據(jù)。這意味著基本上我的機(jī)器已經(jīng)知道基本的英語了,然后只需要微調(diào)以更準(zhǔn)確地匹配我的數(shù)據(jù)。
這個(gè)過程比我預(yù)期的要困難一些,而且我找不到任何完整的教程,所以我想我應(yīng)該寫一個(gè)。這個(gè)過程基本上有三個(gè)步驟,我將按順序介紹它們。如果你只想得到一個(gè)結(jié)果,可以跳到最后查看筆記本。
本教程需要Gensim Word2Vec庫。
步驟1:加載向量
要訓(xùn)練GloVe嵌入,你需要將嵌入加載到你的系統(tǒng)中。你可以在這里下載:https://nlp.stanford.edu/projects/glove/
一旦你有了一個(gè)文件,你可以用下面的代碼來加載它。
glove_file?=?datapath('YOUR_DATAPATH_HERE') tmp_file?=?get_tmpfile("test_word2vec.txt")_?=?glove2word2vec(glove_file,?tmp_file)glove_vectors?=?KeyedVectors.load_word2vec_format(tmp_file)這實(shí)際上是從GloVe網(wǎng)站獲取的.txt文件,并以Gensim Word2Vec庫的適當(dāng)格式加載它。此時(shí),你可以執(zhí)行通常的相似性搜索來測(cè)試是否所有內(nèi)容都正確加載。
正如你所看到的,GloVe嵌入比我們之前得到的更有意義。
步驟2:建立一個(gè)玩具模型來更新
在這一步中,你基本上不需要使用GloVe就可以從數(shù)據(jù)構(gòu)建Word2Vec模型。此模型使你能夠捕獲新詞,并構(gòu)建包含特定數(shù)據(jù)集的詞匯表,如果你處理的文本不僅僅是普通英語,這將非常有用。
#?為了讓它工作,輸入將是一個(gè)標(biāo)識(shí)的列表 #?因?yàn)槲业臄?shù)據(jù)是在一個(gè)數(shù)據(jù)幀中,我選擇了適當(dāng)?shù)膕eries documents?=?df[df['school']?==?'rationalism']['sent_tokenized']#?然后列進(jìn)列表 sentences?=?[sentence?for?sentence?in?documents]#?清理句子 stopwords?=?[YOUR_STOPWORDS_HERE] cleaned_sentences?=?[] for?sentence?in?sentences:cleaned?=?[word.lower()?for?word?in?sentence]cleaned?=?[word?for?word?in?cleaned?if?word?not?in?stopwords]cleaned_sentences.append(cleaned)#?在你的數(shù)據(jù)集中建立一個(gè)word2vec模型 base_model?=?Word2Vec(size=300,?min_count=5) base_model.build_vocab(cleaned_sentences) total_examples?=?base_model.corpus_count很好,現(xiàn)在你有了一個(gè)蹩腳的模型可以作為基礎(chǔ)。
步驟3:再訓(xùn)練
在這里,你將獲取現(xiàn)有模型,添加GloVe詞匯表和起始權(quán)重,并在數(shù)據(jù)集上重新訓(xùn)練它。
#?添加GloVe的詞匯和權(quán)重 base_model.build_vocab([list(glove_vectors.vocab.keys())],?update=True)#?訓(xùn)練你的數(shù)據(jù) base_model.train(cleaned_sentences,?total_examples=total_examples,?epochs=base_model.epochs) base_model_wv?=?base_model.wv結(jié)果將是一組新的單詞向量,它們使用GloVe的原始權(quán)重,但現(xiàn)在也在你自己的數(shù)據(jù)上調(diào)整了。下面是一個(gè)結(jié)果示例:
你可能不太了解理性主義哲學(xué),但相信我,這是非常有道理的。他們的主要焦點(diǎn)之一是上帝,我們可以看到,在討論上帝的愛時(shí),幾乎所有這些都是有意義的——上帝愛我們是因?yàn)樗呛萌?#xff0c;他的恩典是愛的表現(xiàn),他給我們自由是因?yàn)樗麗畚覀?#xff0c;等等。
另一個(gè)更好的測(cè)試方法是,在你的特定數(shù)據(jù)集中運(yùn)行。most_similar來檢驗(yàn)?zāi)愕男孪蛄亢驮瓉淼腉loVe向量。下面是我得到的結(jié)果的一個(gè)例子:
你可以看到,在哲學(xué)語料庫中,“哲學(xué)”與科學(xué)和形而上學(xué)相聯(lián)系,而在基本語料庫中,沒有這種聯(lián)系。
這很有道理。形而上學(xué)在英語口語中(與占星術(shù)和超自然有關(guān))和哲學(xué)(是一個(gè)主要的分支領(lǐng)域)有著截然不同的含義。
所以當(dāng)哲學(xué)家談?wù)撜軐W(xué)時(shí),形而上學(xué)總是在討論中,但是當(dāng)普通人談?wù)撜軐W(xué)時(shí),他們幾乎不會(huì)把它與形而上學(xué)聯(lián)系起來。哲學(xué)家也認(rèn)為自己是科學(xué)的,或者在與自然科學(xué)的對(duì)話中,一般公眾通常看不到哲學(xué)和科學(xué)之間的緊密聯(lián)系。
額外步驟:將所有內(nèi)容整合在一起
好,太好了!現(xiàn)在,你有了一個(gè)漂亮的詞嵌入,可以用它來生成對(duì)語料庫的見解,也可以用在深度學(xué)習(xí)或其他應(yīng)用程序中。
剩下的就是在一個(gè)單一的函數(shù)中把所有的函數(shù)集合起來:
def?train_glove(source,?glove_vectors,?threshold=10,?stopwords=[],min_count=20):#?隔離數(shù)據(jù)幀的相關(guān)部分documents?=?df[df['source']?==?source]['sent_tokenized']#?格式化要使用的系列sentences?=?[sentence?for?sentence?in?documents]#?如果需要,刪除停止詞stopwords?=?[]cleaned?=?[]for?sentence?in?sentences:cleaned_sentence?=?[word.lower()?for?word?in?sentence]cleaned_sentence?=?[word?for?word?in?sentence?if?word?not?in?stopwords]cleaned.append(cleaned_sentence)#?這些后續(xù)步驟不在我們最初的描述中,因?yàn)樗鼈儗?duì)任務(wù)來說不是必要的#?如果這些短語足夠常見的話,它們可以讓你得bigrams,甚至是trigrams#?獲取bigramsbigram?=?Phrases(cleaned,?min_count=min_count,?threshold=threshold,?delimiter=b'?')bigram_phraser?=?Phraser(bigram)bigramed_tokens?=?[]for?sent?in?cleaned:tokens?=?bigram_phraser[sent]bigramed_tokens.append(tokens)#?獲取trigramstrigram?=?Phrases(bigramed_tokens,?min_count=min_count,?threshold=threshold,?delimiter=b'?')trigram_phraser?=?Phraser(trigram)trigramed_tokens?=?[]for?sent?in?bigramed_tokens:tokens?=?trigram_phraser[sent]trigramed_tokens.append(tokens)#?創(chuàng)建一個(gè)玩具模型來更新model?=?Word2Vec(size=300,?min_count=5)model.build_vocab(trigramed_tokens)total_examples?=?model.corpus_count#?添加GloVe的詞匯和權(quán)重model.build_vocab([list(glove_vectors.vocab.keys())],?update=True)#?訓(xùn)練我們的數(shù)據(jù)model.train(trigramed_tokens,?total_examples=total_examples,?epochs=model.epochs)model_wv?=?model.wv#?刪除模型以節(jié)省內(nèi)存,并返回詞向量進(jìn)行分析del?modelreturn?model_wv如果你想看到實(shí)際的結(jié)果,你可以查看Philosophy數(shù)據(jù)項(xiàng)目的單詞使用分析頁面:http://philosophydata.com/w2v.html。
代碼地址:https://github.com/kcalizadeh/phil_nlp
感謝閱讀!
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯黃海廣老師《機(jī)器學(xué)習(xí)課程》課件合集 本站qq群851320808,加入微信群請(qǐng)掃碼:總結(jié)
以上是生活随笔為你收集整理的【NLP】基于GloVe词向量的迁移学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深度学习】深度学习的三个主要步骤!
- 下一篇: 如何实现RTSP/RTMP流接入到RTS