文本索引化要通过词典建立单词与索引的关系 模型输出的向量也要通过索引转化为单词标签
补码·索引
词典有特征的有补码,开始标记,结束标记,特征符号等
但最需要特征注意的是补码
- 常用算法API中需要将补码的索引作为参数传入
- 编码算法要指出哪个索引是补码
- 矩阵对齐,要用补码填充
- transformer 中 mask标记单词/补码等
- 损失计算前,通常将补码位置的数据剔除
补码·0
补码索引不一定是0,可以是其他整数,模型通过学习也能识别
但0比较特殊,通常代表,消失,无,没有,不存在,没,不重要...
补上去的占位符,刚好符合了这个特征,所以经常使用0来作为补码的索引
单词列表生成
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]]