1. 程式人生 > >python實現基於單詞級one-hot編碼和字元級的one-hot編碼

python實現基於單詞級one-hot編碼和字元級的one-hot編碼

one-hot編碼是將標記轉換為向量的最常用、最基本的方法。它將每個單詞與一個唯一的整數索引相關聯,然後將這個整數索引 i 轉換為長度為N的二進位制向量(N是詞表大小),這個向量只有第i個元素是1,其餘元素都為0.

單詞級的one-hot編碼

import numpy as np

samples = ['This is a dog','The is a cat']

all_token_index = {} #構建一個字典來儲存資料中的所有標記的索引

for sample in samples:
    for word in sample.split():   #拆分每一個單詞
        if word not in all_token_index:  #為每一個單詞指定一個索引
            all_token_index[word] = len(all_token_index) + 1

max_length = 10
result = np.zeros(shape=(len(samples), max_length, max(all_token_index.values()) + 1 )) 

for i, sample in enumerate(samples):  # 獲取sample中的索引和值
    for j, word in list(enumerate(sample.split()))[:max_length]: # 獲取單詞的索引和值
        index = all_token_index.get(word)
        result[i,j,index] = 1

結果:

字元級的one-hot編碼:

import string
import numpy as np
samples = ['This is a dog', 'The is a cat']
characters = string.printable # 包含所有可列印的ASCII字元
# 把所有可列印字元都裝進字典中,從1開始索引
all_token_index = dict(zip(range(1, len(characters)+1), characters))

max_length = 50
result = np.zeros(shape=(len(samples), max_length, max(all_token_index.keys()) + 1))

for i, sample in enumerate(samples):  # 獲取sample中的索引和值
    for j, character in enumerate(sample):
        index = all_token_index.get(character)
        result[i,j,index] = 1

上述程式碼均參考《python深度學習》,感覺書講的挺好的,推薦一波。