詞向量技術原理及應用詳解(一)

2022-09-13 15:57:14 字數 3099 閱讀 2504

文字表示是自然語言處理中的基礎工作,文字表示的好壞直接影響到整個自然語言處理系統的效能。在自然語言處理研究領域,文字向量化是文字表示的一種重要方式。

顧名思義,文字向量化就是將文字表示成一系列能夠表達文字語義的向量。無論中文還是英文,詞語都是表達文字處理的最基本單元。

當前階段,對文字向量化都是通過詞向量化實現的。當然也有將文章或者句子作為文字處理的基本單元,像doc2vec和str2vec技術。

接下來主要是討論以詞語作為基本單元的word2vec技術,將先從onehot編碼到word2vec,再從glove詞向量到fasttext

one-hot編碼,又稱獨熱編碼、一位有效編碼。其方法是使用n位狀態暫存器來對n個狀態進行編碼,每個狀態都有它獨立的暫存器位,並且在任意時候,其中只有一位有效。舉個例子,假設我們有四個樣本(行),每個樣本有三個特徵(列),如下圖:

上圖中我們已經對每個特徵進行了普通的數字編碼:我們的feature_1有兩種可能的取值,比如是男/女,這裡男用1表示,女用2表示。那麼one-hot編碼是怎麼搞的呢?

我們再拿feature_2來說明:這裡feature_2 有4種取值(狀態),我們就用4個狀態位來表示這個特徵,one-hot編碼就是保證每個樣本中的單個特徵只有1位處於狀態1,其他的都是0。

one-hot編碼將每個狀態位都看成乙個特徵。對於前兩個樣本我們可以得到它的特徵向量分別為:

sample1  ->[0,1,1,0,0,0,1,0,0]               sample2  ->[1,0,0,1,0,0,0,1,0]

one hot在特徵提取上屬於詞袋模型(bag of words)。關於如何使用one-hot抽取文字特徵向量我們通過以下例子來說明。假設我們的語料庫中有三段話:

我們首先對上面語料進行分詞,並獲取其中的所有的詞,然後對每個詞進行編號:

1 我;    2 愛;   3 爸爸;   4 媽媽;   5 中國

然後使用one-hot對每段話提取特徵向量:

因此我們得到了最終的特徵向量為:

我愛中國 -> ( 1,1,0,0,1 )

爸爸媽媽愛我 ->( 1,1,1,1,0 )

爸爸媽媽愛中國 ->( 0,1,1,1,1 )

在實際應用過程中,我們對多篇文字進行分詞,並統計詞頻,生成的詞典中詞數有幾萬,十幾萬,甚至更多,如果都進行one-hot進行編碼肯定是行不通的,這時一般會根據詞頻選取前5k或50k的詞進行向量化,摒棄寫低頻詞,提高效率。當然5k或50k對於one-hot編碼已經很大了,後面會用word2vec對其進行處理。

優缺點分析:

優點:一是解決了分類器不好處理離散資料的問題;

二是在一定程度上也起到了擴充特徵的作用(上面樣本特徵數從3擴充套件到了9)。

缺點:1.它是乙個詞袋模型,不考慮詞與詞之間的順序,無法保留詞序資訊;

2.  它假設詞與詞相互獨立,存在語義鴻溝問題(在大多數情況下,詞與詞是相互影響的);

3.  它得到的特徵是離散稀疏的;

4.  維度災難:很顯然,如果上述例子詞典中包含10k個單詞,那麼每個需要用10000維的向量表示,採用one-hot編碼,對角線元素均設為1,其餘為0,也就是說除了文字**現的詞語位置不為0,其餘9000多的位置均為0,如此高緯度的向量會嚴重影響計算速度。

1

import

numpy as np

23 contents = ['

我 畢業 於 **大學

','我 就職 於 **公司']

4 word_dict ={}56

for content in

contents:

7for word in

content.split():

8if word not

inword_dict:

9 word_dict[word] =len(word_dict)

10print

(word_dict)

1112 res =np.zeros((len(contents), len(word_dict)))

1314

for i, content in

enumerate(contents):

15for word in

content.split():

16 j =word_dict.get(word)

17 res[i, j] = 1

1819

print(res)

2、keras中one-hot編碼的實現

1

from keras.preprocessing.text import

tokenizer

2 contents = ['

我 畢業 於 **大學

','我 就職 於 **公司']

34#構建單詞索引

56 tokenizer =tokenizer()

7tokenizer.fit_on_texts(contents)

89 word_index =tokenizer.word_index

10print

(word_index)11#

print(len(word_index))

1213 sequences =tokenizer.texts_to_sequences(contents)14#

print(sequences)

1516 one_hot_result =tokenizer.texts_to_matrix(contents)

17print(one_hot_result)

NAT穿透技術原理及應用

相信很多人都聽說過nat技術。我們國家的公網ip太少了不夠用,促使了nat技術的興起。但是nat穿透技術又是什麼呢?nat123是如何實現穿透的?相似應用有花生殼,nat123,金萬維,等。以下分析了nat穿透技術的原理及應用及各種相關介紹。nat技術的定義 nat是一種網路位址翻譯技術,將內部私有...

AJAX技術的詳解及應用

以下原貼 老鷹 一 方法 一 建立 xmlhttprequest 物件 定義 根據瀏覽器的不同,建立xmlhttprequest的方法也不相同,但大致可分為兩類 1 microsft ie瀏覽器 和xmlhttp new activexobject microsoft.xmlhttp 2 處理 mo...

微機原理及應用實驗 加法指令詳解

帶進製位的加法指令adc 加1指令inc 減法運算指令 考慮借位的減法指令sbb 減1指令dec 控制暫存器 ip,flags 加法指令詳解 格式add oprd1,oprd2 操作oprd1 oprd2並把結果賦給oprd1 add指令的執行對全部6個狀態標誌位都產生影響 格式adc oprd1,...