1. 程式人生 > >詞向量原始碼解析:(1)詞向量(詞表示)簡單介紹

詞向量原始碼解析:(1)詞向量(詞表示)簡單介紹

  在未來的一段時間內,我會全面細緻的解析包括word2vec, GloVe, hyperwords, context2vec, ngram2vec等一系列詞向量(詞表示)工具包。用合理的向量去表示單詞是自然語言處理(NLP)領域中很經典很基本的一個任務。 一份高質量的詞向量或是詞表示是很多工取得更好表現的關鍵。通過上面提到的工具包,我們可以得到高質量的詞向量(詞表示);也可以根據我們的需求,得到不同性質的詞向量(詞表示)。

  這篇文章中首先簡單介紹一下詞向量(詞表示)。在後面我會統一用詞向量來代替詞向量(詞表示)。這裡簡單給詞向量一個定義,詞向量就是要用某個固定維度的向量去表示單詞。舉一個簡單的例子,在字典用我們會用幾千個常用詞去解釋每個單詞的意思,而詞向量中,我們用(比如)100維的實數向量去表示字典中的單詞。換一種說法,我們要把字典中每一個單詞對映到某個維度(比如100維)的空間當中去,所以我們也可以把詞向量叫做空間向量模型(vector space model)。我們之所以要把單詞變成向量是因為我們需要把自然語言抽象成數學中的某個概念(這裡是向量),這樣才能對其進圖1,通過word2vec訓練的詞向量經過降維在二維空間中的狀況,圖片來源 http://www.cnblogs.com/Newsteinwell/p/6034747.html行建模。換一種更具體直白的說法,之所以要把單詞變成固定維度的向量,是因為絕大多數的機器學習(machine learning)模型需要固定維度的向量作為輸入。

  那究竟用什麼向量去表示單詞才是合理的呢?一個符合直覺的想法是,相似的單詞應該有相似的詞向量,比如dog和cat這兩個單詞,他們的意思很相近,那麼他們的詞向量也應該很相似,或者說他們的詞向量在空間中位置很接近,距離很短。再比如eat和train這兩個單詞,他們的詞向量應該距離比較遠。圖1展示了通過word2vec訓練的詞向量經過降維在二維空間中的狀況。可以看到相似的單詞在空間中的距離也很接近


圖1,通過word2vec訓練的詞向量經過降維在二維空間中的狀況,圖片來源 http://www.cnblogs.com/Newsteinwell/p/6034747.html


  我們應該怎樣做才能使得相似的單詞有相似的詞向量呢?幾乎有所的詞向量模型都利用了語言學中這樣的一個規律:相似的單詞有著相似的上下文

。這個規律叫distributional hypothesis。還是以dog和cat兩個單詞作為例子,他們是比較相似的單詞,他們在語料中的上下文也很相近。他們的上下文中一般都會出現關於動物,寵物的單詞或是短語。所以,目前主流的詞向量模型都是通過單詞在語料中的上下文來表示單詞。我們後面介紹的工具包中包括了各種各樣的詞向量模型。他們表面上千差萬別,但是本質都很相似,都是對單詞與其上下文的關係進行建模,從而得到高質量的單詞表示。

  在仔細分析各種詞向量工具包的原始碼之前,我們再看一下得到的詞向量能做什麼。上面已經提到,詞向量會把相似的單詞對映到相似的空間中去。所以我們可以用詞向量找到和某個單詞相近的單詞。比如輸入beijing,會返回shanghai等單詞。除此之外,用word2vec訓練得到的詞向量還有另一個比較優美的性質,詞類比(word analogy)。我們點開questions-words.txt,第一個例子就是Athens Greece Baghdad Iraq。在詞類比任務中,我們需要通過前三個單詞,例如Athens Greece Baghdad,推匯出第四個單詞Iraq。推導的過程就是雅典和希臘是首都的關係,巴格達和誰是首都的關係?答案是伊拉克。要做好這個任務,就要求我們還需要從詞向量中得到單詞之間關係的資訊,比如在上個例子中,這個關係就是‘首都’。當年word2vec出現以後受到大家廣泛關注,一個可能的原因就是大家驚訝於詞向量能在analogy資料集上取得這麼好的效果,原來詞向量還有這樣神奇的性質。

  那詞向量為何有能力做好analogy這個任務呢?很多人都問過我,在word2vec中用vec('wife') + vec('king') - vec('queen')去尋找husband這個單詞,這種加加減減的操作看上去沒有什麼道理呀。我這裡先給一個例子幫助大家直觀的理解,後面的文章還會再更仔細的去解釋。我們以king,queen這兩個單詞為例。假設語料中king周圍出現的單詞主要和‘皇室’這個主題以及‘男性’這個主題有關。queen周圍出現的單詞主要和‘皇室’這個主題和‘女性’這個主題有關。我們令vec('皇室')為所有有關皇室主題的單詞的詞向量的平均,vec('男性')和vec('女性')分別為所有有關男性,女性主題的詞向量的平均。我們在上一個文章中提到過,單詞的語義能通過它在語料中的上下文中的資訊體現出來。我們這裡就認為vec('king') =1/2( vec('皇室') + vec('男性') ); vec('queen') =1/2( vec('皇室') + vec('女性') )。所以vec('king') - vec('queen')就等於 1/2( vec('男性')-vec('女性') )。同理,對於husband,wife這兩個單詞,husband周圍的單詞是關於伴侶和男性的主題,wife周圍的單詞是關於伴侶和女性的主題。vec('husband') - vec('wife')同樣等於1/2( vec('男性')-vec('女性') )。這樣 vec('husband') - vec('wife')就等於vec('king') - vec('queen'),我們就能輕易的通過三個詞,去推斷出第四個詞。而vec('king') - vec('queen')也很好的反映了男女性別這樣一個關係。這樣看來analogy這樣看似神奇的性質是可以從distributional hypothesis中推匯出來的。


相關推薦

向量原始碼解析6.1fasttext原始碼解析

fasttext是word2vec的作者mikolov參與的製作的一個工具包,可以用來訓練詞向量和進行文字分類。目前已經引起了廣泛的關注。這個工具包在github上面的地址是 https://github.com/facebookresearch/fastText 這個專案

向量原始碼解析1向量表示簡單介紹

  在未來的一段時間內,我會全面細緻的解析包括word2vec, GloVe, hyperwords, context2vec, ngram2vec等一系列詞向量(詞表示)工具包。用合理的向量去表示單詞是自然語言處理(NLP)領域中很經典很基本的一個任務。 一份高質量的詞向

向量原始碼解析6.7fasttext原始碼解析向量1

下面我們看一下怎麼用fasttext生成詞向量。我們執行word-vector-example.sh檔案可以得到考慮了subword的詞向量。首先看一下這個指令碼。首先是下載語料和測試集,下載語料的以後解壓並且用wikifil.pl對語料進行預處理,得到純文字 if [ !

Spark2.3.2原始碼解析 6. SparkContext原始碼分析 SparkEnv

    SparkContext 是通往 Spark 叢集的唯一入口,可以用來在 Spark 叢集中建立 RDDs 、 累加器( Accumulators )和廣播變數( Broadcast Variables ) 。 SparkContext 也是整個 Spark 應用程式(

caffe原始碼解析layer的註冊與管理

caffe中所有的layer都是類的結構,它們的構造相關的函式都註冊在一個全域性變數g_registry_ 中。 首先這個變數的型別 CreatorRegistry是一個map定義, public: typedef shared_ptr<Layer<Dt

Spark2.3.2原始碼解析 7. SparkContext原始碼分析 TaskScheduler

    程式碼部分:   啟動指令碼 --name spark-test --class WordCount --master yarn --deploy-mode cluster /A/spark-test.jar /

Spark2.3.2原始碼解析 10. 排程系統 Task任務提交 TaskScheduler : Executor 任務提交

架構圖:     程式碼提交時序圖 Standalone模式提交執行流程圖:     首先寫一個WordCount程式碼(這個程式碼,為了觀察多個stage操作,我寫了兩個reducebykey

Spark2.3.2原始碼解析 10. 排程系統 Task任務提交 TaskScheduler : 本地化計算

  架構圖:   Standalone模式提交執行流程圖:   首先寫一個WordCount程式碼(這個程式碼,為了觀察多個stage操作,我寫了兩個reducebykey 函式) 原始碼:  

Spark2.3.2原始碼解析 10. 排程系統 Task任務提交 DAGScheduler 之 stage 提交

  一個Spark Application分為stage級別和task級別的排程,  task來源於stage,所有本文先從stage提交開始講解task任務提交。   架構圖: Standalone模式提交執行流程圖: 首先寫一個W

Spark2.3.2原始碼解析 8. RDD 原始碼解析 textFile 返回的RDD例項是什麼

  本文主要目標是分析RDD的例項物件,到底放了什麼。 從程式碼val textFile = sc.textFile(args(0)) 開始: 直接看textFile 原始碼: 你會發現呼叫的是hadoop的api,通過 hadoopFile 讀取資料,返回一個hadoop

RocketMQ原始碼解析Message拉取&消費

title: RocketMQ 原始碼分析 —— Message 拉取與消費(下) date: 2017-05-11 tags: categories: RocketMQ permalink: RocketMQ/message-pull-and-cons

Android原始碼解析之應用程式資源管理器Asset Manager的建立過程分析

轉載自:https://blog.csdn.net/luoshengyang/article/details/8791064 我們分析了Android應用程式資源的編譯和打包過程,最終得到的應用程式資源就與應用程式程式碼一起打包在一個APK檔案中。Android應用程式在執行的過程中,是通過一個

libgo 原始碼剖析1. libgo簡介與排程淺談

閒談 協程是一個很早的概念了,早些年的遊戲行業中已經大規模地在使用,像lua、go這些語言中的協程原語已經相對比較完善了,一般來說直接使用就好,但是在系統後臺開發上,出現的時間並不長。我是做C++方向的後臺開發,目前國內一些公司也開源了一些C++協程庫,但目前來說,還是在逐步完善的階段。最早接觸的C++協程

Java原始碼解析之可重入鎖ReentrantLock

上文接Java原始碼解析之可重入鎖ReentrantLock(一)。 接下來是tryLock方法。程式碼如下。從註釋中我們可以理解到,只有當呼叫tryLock時鎖沒有被別的執行緒佔用,tryLock才會獲取鎖。如果鎖沒有被另一個執行緒佔用,那麼就獲取鎖,並立刻返回true,並把鎖計數設定為1.

Java原始碼解析之可重入鎖ReentrantLock

本文基於jdk1.8進行分析。 ReentrantLock是一個可重入鎖,在ConcurrentHashMap中使用了ReentrantLock。 首先看一下原始碼中對ReentrantLock的介紹。如下圖。ReentrantLock是一個可重入的排他鎖,它和synchronized的方法

編譯原理LL(1)文法 語法分析器預測分析表法

設計要求:對於任意輸入的一個LL(1)文法,構造其預測分析表,並對指定輸入串分析其是否為該文法的句子。思路:首先實現集合FIRST(X)構造演算法和集合FOLLOW(A)構造演算法,再根據FIRST和F

HashMap原始碼解析、ConcurrentHashMap、ConcurrentSkipListMap 初步熟悉 JDK1.7之一

    兜兜轉轉開發java有些時間,可是每次都是用到採取學習,用過又回到原點,反反覆覆,究其緣由還是沒有合理的整理總結,只是個不斷重複搬磚、運磚的中高階工種,沒有不可替代的核心競爭力。    why?因為你30min——1h能完成的東西,不熟悉的人多花點時間也是可以完成的,

MVC系列——MVC原始碼學習打造自己的MVC框架瞭解神奇的檢視引擎

前言:通過之前的三篇介紹,我們基本上完成了從請求發出到路由匹配、再到控制器的啟用,再到Action的執行這些個過程。今天還是趁熱打鐵,將我們的View也來完善下,也讓整個系列相對完整,博主不希望爛尾。對於這個系列,通過學習原始碼,博主也學到了很多東西,在此還是把博主知道的先發出來,供大家參考。 MVC原

MVC系列——MVC原始碼學習打造自己的MVC框架核心原理

前言:最近一段時間在學習MVC原始碼,說實話,研讀原始碼真是一個痛苦的過程,好多晦澀的語法搞得人暈暈乎乎。這兩天算是理解了一小部分,這裡先記錄下來,也給需要的園友一個參考,奈何博主技術有限,如有理解不妥之處,還希望大家斧正,博主感激不盡! MVC原始碼學習系列文章目錄: 一、MVC原理解析  最

MVC系列——MVC原始碼學習打造自己的MVC框架原始碼

前言:上篇介紹了下 MVC5 的核心原理,整篇文章比較偏理論,所以相對比較枯燥。今天就來根據上篇的理論一步一步進行實踐,通過自己寫的一個簡易MVC框架逐步理解,相信通過這一篇的實踐,你會對MVC有一個更加清晰的認識。 MVC原始碼學習系列文章目錄: 這篇博主打算從零開始一步一步來加上MVC裡面用到