文字單詞one-hot編碼

不該相遇在秋天發表於2021-01-04

單詞->字母->向量

神經網路是建立在數學的基礎上進行計算的,因此對數字更敏感,不管是什麼樣的特徵資料都需要以向量的形式喂入神經網路,無論是圖片、文字、音訊、視訊都是一樣。

one-hot編碼,也就是獨熱編碼,是一種常用的編碼手段。在多分類識別的時候,喂入神經網路的標籤就是獨熱碼,比如手寫數字識別一共有10個分類,某張圖片標籤是6,則獨熱碼為:0 0 0 0 0 0 1 0 0 0

 

下面演示將一個單詞進行ont-hot編碼:

#字母表
word_id = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9,'k': 10, 'l': 11, 'm': 12, 'n': 13, 'o': 14,'p': 15, 'q': 16, 'r': 17, 's': 18, 't': 19,'u': 20, 'v': 21, 'w': 22, 'x': 23, 'y': 24, 'z': 25}

#進行編碼的單詞
word = 'china'

#ont-hot編碼
arr = np.zeros((len(word),len(word_id)))
for k,w in enumerate(word):
    arr[k][word_id[w]] = 1

print(arr)

列印結果:

[[0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

 

文字->單詞->向量

文字編碼則與單詞編碼不同,單詞編碼以26個字母為對映字典,文字編碼需要以單詞為單位進行字典對映,因為單詞是有語義的,在實際場景中往往捕捉的是文字所表達的意思,而不是文字本身的字母組成。

#要編碼的文字
text = 'I am Chinese, I love China'
total_num = len(text.replace(',',' ').split())

#對映字典
word_id = {}
sentences = text.split(',')
for line in sentences:
    for word in line.split():
        if word not in word_id:
            word_id[word] = len(word_id)

print(word_id)

#ont-hot編碼
arr = np.zeros((len(sentences),total_num,len(word_id)))
for k,v in enumerate(sentences):
    for kk,vv in enumerate(v.split()):
        arr[k][kk][word_id[vv]] = 1

print(arr)

列印結果:

{'I': 0, 'am': 1, 'Chinese': 2, 'love': 3, 'China': 4}
[[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]

[[1. 0. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]]

 

相關文章