91精品国产综合久久四虎久久_国产成人午夜高潮毛片_99er视频精品免费观看_2020亚洲熟女在线观看_日本女优人体写真_国内黄色毛片_年轻的老师中文版在线_丰满女邻居做爰_久久久久久精品成人免费图片

用深度學(xué)習(xí)來獲取文本語義
詞向量應(yīng)用于自然語言處理

詞向量是一種把詞處理成向量的技術(shù),并且保證向量間的相對相似度和語義相似度是相關(guān)的。這個(gè)技術(shù)是在無監(jiān)督學(xué)習(xí)方面最成功的應(yīng)用之一。傳統(tǒng)上,自然語言處理(NLP)系統(tǒng)把詞編碼成字符串。這種方式是隨意確定的,且對于獲取詞之間可能存在的關(guān)系并沒有提供有用的信息。詞向量是NLP領(lǐng)域的一個(gè)替代方案。它把詞或短語映射成實(shí)數(shù)向量,把特征從詞匯表大小的高維度空間降低到一個(gè)相對低的維度空間。

例如,讓我們看看四個(gè)詞:“woman”(女人)、“man”(男人)、“queen”(女王)和“king”(國王)。我們把它們都向量化,再使用簡單的代數(shù)運(yùn)算來發(fā)現(xiàn)它們之間的語義相似度。計(jì)算向量間的相似度可以采用諸如余弦相似度的方法。當(dāng)我們把詞“woman”的向量減去詞“man”后,這個(gè)差值的余弦相似度應(yīng)該和詞“queen”的向量減去“king”的向量的差值比較接近(參見圖1)。

W(“woman”)?W(“man”) ? W(“queen”)?W(“king”)

GenderVecs_1400-1d86dc63b245ecd0719839bd87967292

圖1 性別的向量。來源:Lior Shkiller

有很多不同的模型可以被用來把詞轉(zhuǎn)換成實(shí)數(shù)性的向量,包括隱含語義分析(LSA)隱含狄利克雷分布(LDA)。這些模型背后的思路是:相關(guān)的詞匯一般都會在相同的文檔里同時(shí)出現(xiàn)。例如,backpack(背包)、school(學(xué)校)、notebook(筆記本)和teacher(教師)一般都會一起出現(xiàn)。而school(學(xué)校)、tiger(老虎)、apple(蘋果)和basketball(籃球)一般都不會持續(xù)同時(shí)出現(xiàn)?;谶@個(gè)相關(guān)的詞會在相關(guān)的文檔里出現(xiàn)的基本假設(shè),為了把詞轉(zhuǎn)化為向量,LSA會構(gòu)建一個(gè)矩陣。矩陣的行是(語料庫或數(shù)據(jù)里)所有出現(xiàn)過的詞,而列則是對應(yīng)于文檔里的一個(gè)段落。LSA使用奇異值分解(SVD)的方法,在保存列之間相似性的同時(shí)降低矩陣的行數(shù)。不過這些模型的主要問題是:在數(shù)據(jù)量非常大的時(shí)候,計(jì)算量也非常得大。

為了避免計(jì)算和存儲大量的數(shù)據(jù),我們試圖創(chuàng)造一個(gè)神經(jīng)網(wǎng)絡(luò)模型來計(jì)算詞間的關(guān)系,并提高效率。

Word2Vec

目前最流行的詞向量模型是由Mikolov等人在2013年提出的word2vec。這個(gè)模型的效果很好,且計(jì)算效率有了很大的提升。Mikolov等提出的負(fù)采樣方法是一個(gè)更有效的產(chǎn)生詞向量的方法。更多的信息可以在這里找到。

這一模型可以使用下述兩種架構(gòu)的任一種來生成詞的分布:連續(xù)詞袋(CBOW)連續(xù)跳躍元語法(skip-gram)

下面讓我們分別來看看這兩種架構(gòu)。

CBOW模型

在CBOW架構(gòu)里,模型根據(jù)目標(biāo)詞的上下文來預(yù)測目標(biāo)詞。因此,Mikolov等使用了目標(biāo)詞w的前n個(gè)詞和后n個(gè)詞。

一個(gè)序列的詞等同于一個(gè)物品集。因此,就可以把“詞”理解為“物品”。對于“物品”我們可以使用推薦系統(tǒng)以及協(xié)同過濾里的方法。CBOW模型的訓(xùn)練速度是跳躍元語法模型的七倍,而且預(yù)測準(zhǔn)確性也稍好(參見圖2)。

image00_1400-3825b20030f46e47a994645c04fe5216

圖2 基于上下文來預(yù)測詞。來源:Lior Shkiller

連續(xù)跳躍元語法模型

與使用目標(biāo)詞的上下文的方法不同,連續(xù)跳躍元語法模型是使用目標(biāo)詞去預(yù)測它的前后詞(參見圖3)。據(jù)Mikolov等的論文,在訓(xùn)練數(shù)據(jù)量比較小的時(shí)候,跳躍元語法模型比較好,且對于罕見的詞和短語的處理較好。

image02_1400-dffee04f74194ed216f5224997951785

圖3 用給定的詞來預(yù)測上下文。來源:Lior Shkiller

代碼

(你可以在這個(gè)GitHub庫里找到下面例子的代碼)

這個(gè)模型(word2vec)的一大好處就是,它可以用于很多種語言。

我們所要做的就是下載一個(gè)所要處理的語言的大數(shù)據(jù)集。

從維基百科上找一個(gè)大數(shù)據(jù)集

我們可以從維基百科里面找到很多語言的數(shù)據(jù)。用下面的步驟就可以獲得一個(gè)大數(shù)據(jù)集。

  • 找到你想處理的語言的ISO 639代碼:ISO 639代碼的列表
  • 登錄https://dumps.wikimedia.org/wiki/latest/ (譯者注:此鏈接已失效)
  • 下載wiki-latest-pages-articles.xml.bz2

接著,為了讓后續(xù)的事情變簡單,我們會安裝gensim。它是一個(gè)實(shí)現(xiàn)了word2vec的Python庫。

pip install –upgrade gensim

我們需要用維基百科的下載文件來創(chuàng)建語料庫,以用于后續(xù)的word2vec模型的訓(xùn)練。下面這段代碼的輸出就是一個(gè)“wiki..text”的文件。其中包括了維基百科的所有文章的所有詞匯,并按照語言分開。

from gensim.corpora import WikiCorpus

language_code = “he”

inp = language_code+”wiki-latest-pages-articles.xml.bz2″

outp = “wiki.{}.text”.format(language_code)

i = 0

print(“Starting to create wiki corpus”)

output = open(outp, ‘w’)

space = ” ”

wiki = WikiCorpus(inp, lemmatize=False, dictionary={})

for text in wiki.get_texts():

article = space.join([t.decode(“utf-8”) for t in text])

output.write(article + “\n”)

i = i + 1

if (i % 1000 == 0):

print(“Saved ” + str(i) + ” articles”)

output.close()

print(“Finished – Saved ” + str(i) + ” articles”)

訓(xùn)練模型

參數(shù)的說明如下:

  • size:向量的維度
    • 大的size值會要求更多的訓(xùn)練數(shù)據(jù),但能帶來更準(zhǔn)確的模型
  • window:在一個(gè)句子內(nèi),目標(biāo)詞與預(yù)測詞之間的最大距離
  • min_count:忽略所有總詞頻低于這個(gè)值的詞。

import multiprocessing

from gensim.models import Word2Vec

from gensim.models.word2vec import LineSentence

language_code = “he”

inp = “wiki.{}.text”.format(language_code)

out_model = “wiki.{}.word2vec.model”.format(language_code)

size = 100

window = 5

min_count = 5

start = time.time()

model = Word2Vec(LineSentence(inp), sg = 0, # 0=CBOW , 1= SkipGram

size=size, window=window, min_count=min_count, workers=multiprocessing.cpu_count())

# trim unneeded model memory = use (much) less RAM

model.init_sims(replace=True)

print(time.time()-start)

model.save(out_model)

整個(gè)word2vec訓(xùn)練過程用了18分鐘。

fastText

臉書的人工智能研究(FAIR)實(shí)驗(yàn)室最近發(fā)布了fastText庫。它是基于Bojanowski等的論文《Enriching Word Vectors with Subword Information》所開發(fā)的模型。與word2vec不同,fastText把詞表示成一個(gè)n元的字母袋。每個(gè)向量代表字符袋里的一個(gè)n元字母,而一個(gè)詞則是這些向量的和。

使用臉書的新庫很簡單。安裝命令:

pip install fasttext

訓(xùn)練模型的命令:

start = time.time()

language_code = “he”

inp = “wiki.{}.text”.format(language_code)

output = “wiki.{}.fasttext.model”.format(language_code)

model = fasttext.cbow(inp,output)

print(time.time()-start)

整個(gè)fastText模型訓(xùn)練用了13分鐘。

評估向量:類比性

下面讓我們用之前的那個(gè)例子來評估這兩個(gè)模型的準(zhǔn)確度。

W(“woman”) ? W(“man”)+ W(“queen”)? W(“king”)

下面的代碼首先計(jì)算正負(fù)詞的加權(quán)平均值。

隨后,代碼計(jì)算了所有的測試詞匯的向量與加權(quán)平均的點(diǎn)乘積。

我們的評估例子里,測試詞匯是整個(gè)詞匯表。代碼的最后是打印出和正詞與負(fù)詞的加權(quán)平均值的余弦相似度最高的詞。

import numpy as np

from gensim.matutils import unitvec

def test(model,positive,negative,test_words):

mean = []

for pos_word in positive:

mean.append(1.0 * np.array(model[pos_word]))

for neg_word in negative:

mean.append(-1.0 * np.array(model[neg_word]))

# compute the weighted average of all words

mean = unitvec(np.array(mean).mean(axis=0))

scores = {}

for word in test_words:

if word not in positive + negative:

test_word = unitvec(np.array(model[word]))

# Cosine Similarity

scores[word] = np.dot(test_word, mean)

print(sorted(scores, key=scores.get, reverse=True)[:1])

接著,用我們最初的那個(gè)例子來做測試。

用fastText和gensim的word2vec模型來預(yù)測:

positive_words = [“queen”,”man”]

negative_words = [“king”]

# Test Word2vec

print(“Testing Word2vec”)

model = word2vec.getModel()

test(model,positive_words,negative_words,model.vocab)

# Test Fasttext

print(“Testing Fasttext”)

model = fasttxt.getModel()

test(model,positive_words,negative_words,model.words)

結(jié)果

Testing Word2vec

[‘woman’]

Testing Fasttext

[‘woman’]

結(jié)果顯示fastText和gensim的word2vec都能正確預(yù)測。

W(“woman”) ? W(“man”)+ W(“queen”)? W(“king”)

可見,詞向量確實(shí)能找到詞匯之間的語義關(guān)系。

我們這里所介紹的模型的基本思路可以被運(yùn)用到很多的應(yīng)用場景。如預(yù)測商業(yè)機(jī)構(gòu)需要的下一個(gè)應(yīng)用、做情感分析、替換生物序列、做語義圖片搜索等。

Lior Shkiller

Lior Shkiller是Deep Solution的聯(lián)合創(chuàng)始人。作為一個(gè)機(jī)器學(xué)習(xí)的實(shí)踐者,他積極熱忱地投身于人工智能和認(rèn)知科學(xué)。Lior擁有以色列特拉維夫大學(xué)的計(jì)算機(jī)科學(xué)與心理學(xué)學(xué)位,并有超過10年的軟件開發(fā)經(jīng)驗(yàn)。Deep Solutions提供端到端的軟件解決方案,其中包括為計(jì)算機(jī)視覺、自然語言處理、異常檢測和推薦系統(tǒng)等應(yīng)用所開發(fā)的創(chuàng)新的深度學(xué)習(xí)的新算法。

Semantics.