词典的重要性

 
文本索引化要通过词典建立单词与索引的关系

模型输出的向量也要通过索引转化为单词标签 

补码·索引

补码·索引

 
词典有特征的有补码,开始标记,结束标记,特征符号等

但最需要特征注意的是补码
- 常用算法API中需要将补码的索引作为参数传入
- 编码算法要指出哪个索引是补码
- 矩阵对齐,要用补码填充
- transformer 中 mask标记单词/补码等
- 损失计算前,通常将补码位置的数据剔除
    

补码·0

 
补码索引不一定是0,可以是其他整数,模型通过学习也能识别 

但0比较特殊,通常代表,消失,无,没有,不存在,没,不重要... 

补上去的占位符,刚好符合了这个特征,所以经常使用0来作为补码的索引
    
词典生成·例1

单词列表生成

 
import jieba

pad_flag="<PAD>"

seq1= "你现阶段的目标是?"
seq2=  "不上班还有钱花"
sentences = [seq1,seq2]

word_list = []

for sen in sentences:
    word_list.append(jieba.lcut(sen))
    
word_list
[['你', '现阶段', '的', '目标', '是', '?'], ['不', '上班', '还有', '钱花']]

根据单词列表生成词典

 
def word_dict(word_list, word2id={}, pad_flag=""):
    """词典生成及补充
    - 后续重复出现的key跳过,以第1次出现的索引为准 
    """
    word2id[pad_flag] = 0  
    for words in word_list:
        len_add = len(word2id)
        dk = list(word2id.keys())
        tmp = set(words)
        tmp = [x for x in tmp if x not in dk]  # 新增key 
        word2id.update({word:(index+len_add) for index,word in enumerate(tmp)}) 
    return word2id
    

 
word2id = word_dict(word_list)
word2id
{'<PAD>': 0,
    '现阶段': 1,
    '?': 2,
    '的': 3,
    '你': 4,
    '目标': 5,
    '是': 6,
    '钱花': 7,
    '还有': 8,
    '不': 9,
    '上班': 10}

单词列表根据词典转索引向量

 
sentence = []
for sen in word_list:
    sentence.append([ word2id[word]  for word in sen])

max_seq_len = 6 
index_mat = []
for word_index in sentence:
    word_index = word_index+[word2id[pad_flag]]*max_seq_len
    word_index = word_index[:6]
    index_mat.append(word_index)
    
print(index_mat)
[[4, 1, 3, 5, 6, 2], [9, 10, 8, 7, 0, 0]]

参考