【自然語言處理】Word2Vec 概述及中文語料實戰

2021-02-23 ACMfans Club
前言

計算機處理圖像的時候,本質上利用了圖像的像素數值信息。對自然語言來說,本身並沒有包含計算機擅長處理的數值信息,因此,需要通過一定的手段將「自然語言」量化,進而利用已有的機器學習方法對自然語言進行處理、分析和預測。

獨熱編碼

也稱One-hot編碼 (一位有效碼),其方法是使用N位狀態寄存器來對N個狀態進行編碼,每個狀態都有它獨立的寄存器位,並且在任意時候,其中只有一位有效。比如有下面的狀態表:


indicator-1indicator-2sample-111sample-222sample-323

轉化為獨熱編碼為(注意:這裡容易和數字電路中的真值表編號相混淆,請務必區分)


indicator-1indicator-2sample-10 10 0 1sample-21 00 1 0sample-31 01 0 0

如果上面的indicator不是數值量,而是文本,則可以表示為:


indicator-1indicator-2sample-1"male""from Europe"sample-2"female""from US"sample-3"female""from Russia"

對應的獨熱編碼可以編號為:


indicator-1indicator-2sample-10 10 0 1sample-21 00 1 0sample-31 01 0 0

這樣處理的優缺點在哪?

首先是優點,很顯然,將一個word映射為一個數學向量,這便於我們後續進行各種機器學習算法的輸入處理。

缺點也很明顯:

在線性代數中,有稀疏矩陣的概念——大部分矩陣元素都為0. 上面的獨熱編碼正是特殊的1 x n維的稀疏矩陣,這樣就非常浪費空間,並且容易造成維度災難。因此,我們急切需要一種可以降低維度的方法。

Dristributed representation

Dristributed representation 的思路是通過訓練,將每個詞都映射到一個較短的詞向量上來。所有的這些詞向量就構成了向量空間,用普通的統計學的方法來研究詞與詞之間的關係。詞向量維度一般在訓練時指定。下圖說明了一個簡單示例: 

詞彙表裡的詞用"Royalty","Masculinity", "Femininity"和"Age"4個維度來表示,King這個詞對應的詞向量可能是(0.99,0.99,0.05,0.7),此處,king這個詞從一個可能非常稀疏的向量空間,映射到現在這個四維向量所在的空間,這個過程就是詞嵌入(word embedding)

 

假如我們將詞的維度降低到2D,有研究表明: 

 

國王 - 男性 + 是女性 = 女王,挺有道理的 。

 

出現這種現象的原因是,我們得到最後的詞向量的訓練過程中引入了詞的上下文。

Word2Vec (一個神經網絡模型)

輸入是One-Hot Vector,Hidden Layer沒有激活函數,也就是線性的單元。Output Layer維度跟Input Layer的維度一樣,用的是Softmax回歸。當這個模型訓練好以後,我們並不會用這個訓練好的模型處理新的任務,真正需要的是這個模型通過訓練數據所學得的參數,如隱藏層的權重矩陣。

 這個模型是如何定義數據的輸入和輸出?一般分為CBOW(Continuous Bag-of-Words 與Skip-Gram兩種模型。

CBOW模型的訓練輸入是某一個特徵詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量。 Skip-Gram模型和CBOW的思路是反著來的,即輸入是特定一個詞的詞向量,而輸出是特定詞對應的上下文詞向量。CBOW對小型資料庫比較合適,而Skip-Gram在大型語料中表現更好。

通俗一點,CBOW解決的是這樣的問題: 

而Skip-gram解決的是這樣的問題: 

 

CBOW的訓練模型

 

處理步驟:

輸入:上下文單詞的onehot編碼,每個onehot編碼是1 x V的向量

每個onehot向量乘以V x N的權重矩陣

全部向量相加求平均得到隱藏層的特徵向量,這個向量是1 x N維的

隱藏層的特徵向量乘以N x V維的輸出權重矩陣,得到1 x V維的輸出向量

輸出向量通過激活函數處理,得到概率分布

概率最大的index所指示的單詞為預測出的中間詞

訓練完畢後,輸入層的每個單詞與矩陣W相乘得到的向量的就是我們想要的詞向量 (word embedding).

下面是一個簡單例子: 

 

Skip-Gram的訓練模型

假如有一個句子 「The dog barked at the mailman」。首先選句子中間的一個詞作為輸入詞,例如選取 「dog」 作為input word.

有了input word以後,再定義一個叫做skipwindow的參數,它代表著從當前input word的一側(左邊或右邊)選取詞的數量。如果設置skipwindow=2,那麼最終獲得窗口中的詞(包括input word在內)就是['The', 'dog', 'barked', 'at']。skipwindow=2代表著選取左input word左側2個詞和右側2個詞進入窗口,所以整個窗口大小span=2x2=4。

另一個參數叫numskips,它代表著從整個窗口中選取多少個不同的詞作為output word,當skipwindow=2,numskips=2時,將會得到兩組 (input word, output word) 形式的訓練數據,即 ('dog', 'barked'),('dog', 'the')。

神經網絡基於這些訓練數據將會輸出一個概率分布,這個概率代表詞典中的每個詞是output word的可能性。例如,先拿一組數據 ('dog', 'barked') 來訓練神經網絡,那麼模型通過學習這個訓練樣本,會告訴我們詞彙表中每個單詞是「barked」的概率大小。模型的輸出概率代表著到詞典中每個詞有多大可能性跟input word同時出現。

Word2Vec的優缺點優點缺點Word2Vec中文語料實戰環境

win10 + python3 依賴包:gensim與jieba (通過pip install 安裝)

語料庫

《誅仙》小說 (部分) 

文本預處理

去除文本中可能存在的空白等,防止對訓練造成幹擾。

# 文本預處理

file = open('text.txt', 'w', encoding='utf-8')

with open('誅仙.txt', 'r', encoding='utf-8') as origin_file:

for line in origin_file:

line = line.strip()

file.write(line + '\n')

file.close()

中文分詞

將停頓詞放在一個stop.txt文件中,這裡選取了部分停頓詞如下: 

調用jieba庫進行詞語劃分.

# 分詞

import jieba

stop_words_file = 'stop.txt'

stop_words = []

with open(stop_words_file, 'r', encoding='utf-8') as origin_stop_words_file:

text = origin_stop_words_file.readlines()

for line in text:

line = line.strip()

stop_words.append(line)

origin_txt_file = 'text.txt'

target_file = open('text_cut.txt', 'w', encoding='utf-8')

with open(origin_txt_file, 'r', encoding='utf-8') as origin_file:

text = origin_file.readlines()

for line in text:

line =line.strip()

out_str = ''

word_list = jieba.cut(line, cut_all=False)

for word in word_list:

if word not in stop_words:

if word != '\t':

out_str += word

out_str += ' '

target_file.write(out_str.rstrip() + '\n')

target_file.close()

分詞結果: 

訓練word2vec模型

#coding:utf8

import gensim.models.word2vec as w2v

model_file_name = 'model'

#模型訓練,生成詞向量

sentences = w2v.LineSentence('text_cut.txt')

# 訓練參數:輸出詞的向量維數為20,訓練窗口為5,截斷頻次在5次以下的詞,4個並行任務

model = w2v.Word2Vec(sentences, size=1000, window=5, min_count=5, workers=4)

model.save(model_file_name)

模型測試

import gensim

import warnings

warnings.filterwarnings(action='ignore', category=UserWarning,module='gensim')

model = gensim.models.Word2Vec.load("model")

word = '金瓶兒'

result = model.similar_by_word(word)

print("跟 "+word+" 最相近的詞:")

for i in result:

print(i)

模型結果

參考文獻

[1] Muwen. (2021). [NLP] Understanding the essence of Word2vec. Retrieved from https://zhuanlan.zhihu.com/p/26306795

[2] Wuyiji. (2017). Use python-gensim to train word2vec model and understanding of gensim API. Retrieved from https://blog.csdn.net/sinat_26917383/article/details/69803018

[3] Gensim. (2021). models.word2vec – Word2vec embeddings. Retrieved from https://radimrehurek.com/gensim/models/word2vec.html

相關焦點

  • 中文自然語言處理相關資料集合指南
    【導讀】crownpku維護了一個關於中文自然語言處理相關資料索引網站,包含中文NLP工具、中文語料、中文NLP學術組織、中文NLP商業服務等。
  • 深入理解word2vec
    word2vec是一種基於神經網絡的語言模型,也是一種詞彙表徵方法。word2vec包括兩種結構:skip-gram(跳字模型)和CBOW(連續詞袋模型),但本質上都是一種詞彙降維的操作。  我們將NLP的語言模型看作是一個監督學習問題:即給定上下文詞,輸出中間詞,或者給定中間詞,輸出上下文詞。基於輸入和輸出之間的映射便是語言模型。
  • 自然語言處理——圖解Word2vec
    如果你曾經使用Siri、Google Assistant、Alexa、Google翻譯,甚至智慧型手機鍵盤進行下一詞預測,那麼你很有可能從這個已經成為自然語言處理模型核心的想法中受益。在過去的幾十年中,嵌入技術用於神經網絡模型已有相當大的發展。尤其是最近,其發展包括導致BERT和GPT2等尖端模型的語境化嵌入。
  • Awesome-Chinese-NLP:中文自然語言處理相關資料
    Includes BERT and word2vec embedding.新聞語料(包含分類)@百度盤UDChinese (for training spaCy POS)中文word2vec模型上百種預訓練中文詞向量Tencent AI Lab Embedding Corpus for Chinese Words and PhrasesSynonyms:中文近義詞工具包 基於維基百科中文和word2vec
  • 【算法】word2vec與doc2vec模型
    2 word2vec與doc2vec有什麼差異?3 如何做word2vec和doc2vec?深度學習掀開了機器學習的新篇章,目前深度學習應用於圖像和語音已經產生了突破性的研究進展。  d)  Word2Vector 模型  最近幾年剛剛火起來的算法,通過神經網絡機器學習算法來訓練N-gram 語言模型,並在訓練過程中求出word所對應的vector的方法。本文將詳細闡述此方法的原理。4.word2vec算法思想  什麼是word2vec?
  • [NLP] 秒懂詞向量Word2vec的本質
    引子2. Word2vec參考資料總結3. 正文4. 實戰1.和 Ronan 11年那篇JMLR,看完對主題模型、用CNN處理NLP任務有所了解,但依然無法完全吃透 word2vec;這時候我開始大量閱讀中英文博客,其中 北漂浪子 的一篇閱讀量很多的博客吸引了我的注意,裡面非常系統地講解了 Word2vec 的前因後果,最難得的是深入剖析了代碼的實現細節,看完之後細節方面了解了很多,不過還是覺得有些迷霧;終於,我在 quora 上看到有人推薦 Xin Rong
  • Python自然語言處理實戰:兩篇文章相似度清晰透明
    Python自然語言處理實戰:兩篇文章相似度清晰透明 工程師譚軍 發表於 2018-07-09 09:22:58 此書專注於中文的自然語言處理,以Python及其相關框架為工具
  • 中文NLP福利!大規模中文自然語言處理語料
    新智元推薦來源:AINLP作者:徐亮【新智元導讀】本文介紹一個中文自然語言處理語料庫項目:nlp_chinese_corpus ,初步貢獻了幾個已經預處理好的中文語料,包括維基、新聞和百科語料,可直接下載使用。
  • 文本深度表示模型—word2vec&doc2vec詞向量模型
    Word2Vector 模型最近幾年剛剛火起來的算法,通過神經網絡機器學習算法來訓練N-gram 語言模型,並在訓練過程中求出word所對應的vector的方法。本文將詳細闡述此方法的原理。4.word2vec算法思想什麼是word2vec?
  • 文本深度表示模型——word2vec&doc2vec詞向量模型
    d)  Word2Vector 模型  最近幾年剛剛火起來的算法,通過神經網絡機器學習算法來訓練N-gram 語言模型,並在訓練過程中求出word所對應的vector的方法。本文將詳細闡述此方法的原理。4.word2vec算法思想  什麼是word2vec?
  • 深度學習筆記 | 第13講:word2vec詞向量
    在上一講中,小編將關注重點首次切到了自然語言處理領域。我們介紹了自然語言處理領域的基本知識體系,對 one-hot 和詞嵌入這兩種基本的詞彙表徵方法進行了詳細的介紹,對詞嵌入代表方法詞向量進行了闡述,並以 SVD 詞向量模型進行了演示。本節小編將繼續和大家一起學習基於神經網絡模型的詞向量表徵方法,其中的代表模型就是著名的 word2vec。
  • 韋編 | HanLP——面向中文的自然語言處理常用工具包
    上兩周上課時,計量學老師介紹了StanfordCoreNLP在命令行和Eclipse中的用法,好奇心驅使,想要尋找一款在Python中好用的自然語言處理工具。一款名為HanLP,中文友好、上手簡單的自然語言處理工具包映入眼前,特此分享給大家,新手友好~HanLP是一款由一系列模型與算法組成的Java工具包,目標是普及自然語言處理在生產環境中的應用。
  • 【Word2Vec】深入淺出Word2Vec原理解析
    背景知識Word2Vec是語言模型中的一種,它是從大量文本預料中以無監督方式學習語義知識的模型,被廣泛地應用於自然語言處理中。Word2Vec是用來生成詞向量的工具,而詞向量與語言模型有著密切的關係。因此,我們先來了解一些語言模型方面的知識。
  • 圖解Word2vec
    如果你曾經使用Siri、Google Assistant、Alexa、Google翻譯,甚至智慧型手機鍵盤進行下一詞預測,那麼你很有可能從這個已經成為自然語言處理模型核心的想法中受益。在過去的幾十年中,嵌入技術用於神經網絡模型已有相當大的發展。尤其是最近,其發展包括導致BERT和GPT2等尖端模型的語境化嵌入。
  • gensim:用Word2Vec進行文本分析
    文本分析我寫過一期gensim庫的,今天我想實現下word2vec,進行一些詞語相似性分析。
  • 乾貨 | 定製你的個性化詞向量:解讀+中文實戰
    由他從第一視角和我們分享他們改進 Word2Vec 的工作。高能提醒:文章內含大量實戰,不乏很多中文上的實踐!Word2Vec [1,2] 的出現讓我們看到詞向量可以有一些神奇的性質,比如:『中國-北京=日本-東京』。當然,這樣一個厲害的模型也給了我們大量的改進空間和發論文的機會。
  • R語言自然語言處理:文本向量化——詞嵌入(Word Embedding)
    希望與大家分享學習經驗,推廣並加深R語言在業界的應用。郵箱:huang.tian-yuan@qq.com前文推送:R語言自然語言處理:中文分詞R語言自然語言處理:詞性標註與命名實體識別R語言自然語言處理:關鍵詞提取(TF-IDF)R語言自然語言處理:關鍵詞提取與文本摘要(TextRank)我們之前講到的全部都是基於詞袋模型(
  • Word2Vec 與 GloVe 技術淺析與對比
    semantic analysis)為代表的global matrix factorization methods,也稱為 count-based methods; 以及以word2vec為代表的 prediction-based methods。
  • NLP Chinese Corpus項目:大規模中文自然語言處理語料
    NLP領域缺乏高質量的中文語料。作者徐亮(實在智能算法專家) 創建了一個中文自然語言處理語料庫項目:nlp_chinese_corpus ,初步貢獻了幾個已經預處理好的中文語料,包括維基、新聞和百科語料。
  • 預告 | 跟李沐一起動手學深度學習第十六課:詞向量(word2vec)
    本次課依舊是由沐哥的好基友、亞馬遜應用科學家Aston Zhang帶來~隨著深度學習的廣泛應用,詞向量(word embedding)已逐漸成為自然語言處理的基礎知識。本課將以word2vec為例,著重介紹兩套模型:跳字模型(Skip-gram)和連續詞袋模型(CBOW),以及兩套高效訓練法:負採樣(Negative sampling)和層序softmax(Hierarchical softmax)。