學(xué)了好久的向量和矩陣,有小伙伴問(wèn)我祝旷,這xx玩意學(xué)著有啥用奥陌摹?能吃嗎怀跛?不能吃不學(xué)了距贷!
好好好,同學(xué)先別激動(dòng)吻谋。今天咱們就先不講理論忠蝗,講點(diǎn)有趣的工程落地,來(lái)滿足你的好奇心漓拾,讓你爽一下再繼續(xù)前行阁最!
本文中的代碼看不懂也沒(méi)關(guān)系,只需要看懂人話就行了晦攒!那正式開(kāi)始了闽撤!
beijing:china, tokyo:?
首先提出問(wèn)題,beijing和china的關(guān)系脯颜,相當(dāng)于tokyo和誰(shuí)的關(guān)系哟旗?
就算不進(jìn)行任何計(jì)算你也會(huì)脫口而出,是japan栋操。這背后的邏輯可以通過(guò)深度學(xué)習(xí)闸餐,被人工智能所掌握到!
這又和我們之前學(xué)的向量有啥關(guān)系呢矾芙?聽(tīng)我慢慢道來(lái)舍沙!
加載詞向量
import torch
import torchtext
from torchtext import vocab
gv = torchtext.vocab.GloVe(name='6B', dim=50)
我們加載預(yù)先訓(xùn)練好的Glove詞向量。簡(jiǎn)單說(shuō)就是有人已經(jīng)把每個(gè)英文單詞對(duì)應(yīng)成一個(gè)向量了剔宪。這個(gè)過(guò)程有興趣我以后再細(xì)節(jié)給你講拂铡,今天你只需要加載壹无,拿過(guò)來(lái)用就可以了。
保證你的網(wǎng)速和磁盤空間感帅,這個(gè)詞向量有點(diǎn)大862M
len(gv.vectors), gv.vectors.shape
輸出:
(400000, torch.Size([400000, 50]))
這意味著我們的詞向量里面包含了400000個(gè)詞斗锭,每個(gè)詞用50個(gè)維度來(lái)表示。
使用詞向量
假設(shè)我們要看tokyo這個(gè)詞的詞向量是多少失球,就可以這樣操作
gv.stoi['tokyo']
輸出:
1363
這個(gè)1363就是tokyo在gv詞向量中的索引岖是,接下來(lái)就可以
gv.vectors[1363]
輸出:
tensor([-0.3117, 0.1947, 0.1908, 0.6841, 0.2916, -0.8988, 0.2263, 0.1783,
-1.4774, -0.0919, 0.0898, -0.9447, -0.1938, 0.5808, 0.2021, 0.9924,
-1.0311, 0.4247, -1.1420, 0.7197, 2.1561, -0.1420, -0.9298, -0.2810,
-0.0110, -1.6787, 0.4445, 0.5470, -0.7136, -0.6774, 2.3393, 0.2858,
1.4062, -0.0078, -0.1528, -1.1147, 0.2415, -0.6591, -0.0449, 0.0468,
-1.1396, -0.4484, 0.9181, -0.7405, 1.0508, 0.0527, 0.1343, 0.6226,
0.6138, -0.0973])
什么的詞向量就長(zhǎng)成這個(gè)樣子!真丑~
你還可以通過(guò)itos把坐標(biāo)映射回單詞
gv.itos[1363]
輸出:
'tokyo'
近似詞
怎么衡量?jī)蓚€(gè)向量是否相似实苞,你還記得嗎豺撑?
對(duì),距離和角度都可以黔牵。我們今天就是用距離聪轿,如果兩個(gè)向量距離越小,代表他們約相似猾浦,對(duì)吧屹电。同樣,如果兩個(gè)詞向量見(jiàn)的距離越小跃巡,那就代表某種意義上,他們意義相近牧愁。
def get_wv(word):
return gv.vectors[gv.stoi[word]]
get_wv('tokyo')
輸出:
tensor([-0.3117, 0.1947, 0.1908, 0.6841, 0.2916, -0.8988, 0.2263, 0.1783,
-1.4774, -0.0919, 0.0898, -0.9447, -0.1938, 0.5808, 0.2021, 0.9924,
-1.0311, 0.4247, -1.1420, 0.7197, 2.1561, -0.1420, -0.9298, -0.2810,
-0.0110, -1.6787, 0.4445, 0.5470, -0.7136, -0.6774, 2.3393, 0.2858,
1.4062, -0.0078, -0.1528, -1.1147, 0.2415, -0.6591, -0.0449, 0.0468,
-1.1396, -0.4484, 0.9181, -0.7405, 1.0508, 0.0527, 0.1343, 0.6226,
0.6138, -0.0973])
ok素邪,接下來(lái)我們就把tokyo轉(zhuǎn)化成詞向量,去遍歷所有的詞猪半,然后找到和它距離最近的10個(gè)
def sim_10(word, n=10):
all_dists = [(gv.itos[i], torch.dist(word, w) )for i, w in enumerate(gv.vectors)]
return sorted(all_dists, key=lambda t: t[1])[:n]
sim_10(get_wv('tokyo'))
輸出:
[('tokyo', tensor(0.)),
('osaka', tensor(3.2893)),
('seoul', tensor(3.3802)),
('shanghai', tensor(3.6196)),
('japan', tensor(3.6599)),
('japanese', tensor(4.0788)),
('singapore', tensor(4.1160)),
('beijing', tensor(4.2423)),
('taipei', tensor(4.2454)),
('bangkok', tensor(4.2459))]
和我們預(yù)想的差不多兔朦,都是一些大都市。另外tokyo自然和tokyo本身距離最近為0磨确,所以第一個(gè)輸出的是tokyo沽甥。
w2 - w1 = w4 - w3
ok,最后的一步就是用這個(gè)暴力的數(shù)學(xué)公式解決問(wèn)題乏奥,他的意義就是china - beijing = ? - tokyo:
有了這個(gè)公式接下來(lái)就是一個(gè)向量加減操作了
def analogy(w1, w2, w3, n=5, filter_given=True):
print('\n[%s : %s :: %s : ?]' % (w1, w2, w3))
# w2 - w1 + w3 = w4
closest_words = sim_10(get_wv(w2) - get_wv(w1) + get_wv(w3))
# 過(guò)濾防止輸入?yún)?shù)出現(xiàn)在結(jié)果中
if filter_given:
closest_words = [t for t in closest_words if t[0] not in [w1, w2, w3]]
print(closest_words[:2])
analogy('beijing', 'china', 'tokyo')
輸出:
[beijing : china :: tokyo : ?]
[('japan', tensor(2.7869)), ('japanese', tensor(3.6377))]
向量帶給你新的觀察世界的視角摆舟!
目錄:
人工智能必知必會(huì)-前言
人工智能必知必會(huì)-標(biāo)量,向量邓了,矩陣恨诱,張量
人工智能必知必會(huì)-向量的加減與縮放
人工智能必知必會(huì)-向量的內(nèi)積
人工智能必知必會(huì)-向量之間的距離
人工智能必知必會(huì)-初識(shí)矩陣
人工智能必知必會(huì)-矩陣與向量
人工智能必知必會(huì)-矩陣的加減法
人工智能必知必會(huì)-矩陣乘法
人工智能必知必會(huì)-矩陣與方程組
人工智能必知必會(huì)-再看矩陣與向量
人工智能必知必會(huì)-矩陣與向量乘法的物理意義
人工智能必知必會(huì)-詞向量(案例)
人工智能必知必會(huì)-矩陣相乘上
人工智能必知必會(huì)-矩陣相乘下