文本索引化要通过词典建立单词与索引的关系 模型输出的向量也要通过索引转化为单词标签
补码·索引
词典有特征的有补码,开始标记,结束标记,特征符号等 但最需要特征注意的是补码 - 常用算法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]]