赞
踩
假设我们现在有一个文本的多标签的分类任务。其数据集的格式为w9410 w305 w1893 w307 w3259 w4480 w1718 w5700 w18973 w346 w11 w855 w1038 w12475 w146978 w11 w1076 w25 w7512 w45368 w1718 w4668 w6 w11061 w111 c866 c28 c423 c1869 c1331 c431 c17 c204 c4 c274 c56 c1841 c1770 c3266 c17 c350 c4 c370 c116 c406 c734 c28 c423 c768 c769 c485 c11 c506 c734 c184 __label__807273409165680991 __label__8175048003539471998。可以看到这条数据有两个标签。其余的用字符表示(经过脱敏处理),所以我们需要自己来创建word_vocabulary。
具体如下:
- import codecs
- from collections import Counter
- #1.load raw data
- file_object = codecs.open(training_data_path,mode='r',encoding='utf-8')
- lines = file_object.readlines()
- #2.loop each line ,put to counter
- c_inputs = Counter()
- c_labels = Counter()
- for line in lines:
- raw_list = line.strip().split("__label__")
- input_list = raw_list[0].strip().split(" ")
- print (input_list)
- input_list = [x.strip().replace(" ","") for x in input_list if x!=" "]
- print(input_list)
- label_list = [l.strip().replace(" ","") for l in raw_list[1:] if l!=" "]
- print(label_list)
- c_inputs.update(input_list)
- print(c_inputs)
- c_labels.update(label_list)
- print(c_labels)
- #3 return most frequency words
- vocab_list = c_inputs.most_common(vocab_size)
- print(vocab_list)
- label_list = c_labels.most_common()
- print(label_list)
- #4 put those words to dict
- for i ,tuplee in enumerate(vocab_list):
- word,_= tuplee
- vocabulary_word2index[word] = i+2
- vocabulary_index2word[i+2] = word
- for i,tuplee in enumerate(label_list):
- label,_ = tuplee
- label = str(label)
- vocabulary_label2index[label] = i
- vocabulary_index2label[i] = label
- #save to file system if vocabulary of words not exists .
- if not os.path.exists(cache_path):
- with open(cache_path,'ab') as data_f:
- pickle.dump(vocabulary_word2index,vocabulary_index2word,vocabulary_label2index,vocabulary_index2label)
- return vocabulary_word2index,vocabulary_index2word,vocabulary_label2index,vocabulary_index2label
1。之所以使用codecs.open()方法是因为此方法读入数据时可以直接解码。
2. 定义Counter()
c_inputs = Counter() c_inputs.update(input_list)
其返回的是类似如下的格式:Counter({'c734': 2, 'w1718': 2, 'c28': 2, 'c4': 2, 'c17': 2, 'w11': 2, 'c423': 2, 'w3259': 1, 'w6': 1, 'w9410': 1, 'w18973': 1, 'c506': 1, 'c768': 1, 'c11': 1, 'w305': 1, 'c204': 1, 'c406': 1, 'c1869': 1, 'c485': 1, 'w1076': 1, 'w4668': 1, 'w146978': 1, 'w25': 1, 'c370': 1, 'c1841': 1, 'c1770': 1, 'w346': 1, 'c3266': 1, 'w111': 1, 'c274': 1, 'w45368': 1, 'w1893': 1, 'c1331': 1, 'w307': 1, 'w855': 1, 'c769': 1, 'w11061': 1, 'c350': 1, 'c116': 1, 'w7512': 1, 'c431': 1, 'w4480': 1, 'c56': 1, 'w1038': 1, 'w12475': 1, 'c866': 1, 'w5700': 1, 'c184': 1})
是一个字典,后面使其每个词出现的频率,从多到少排序。这个方法的好处,是直接就给出了,不需要我们自己写代码,来计数,排序。
3.c_inputs = Counter() c_inputs.most_common([n])
most_common()方法是:从多到少返回一个有前n多的元素的列表。如果没有n,则返回所有的元素。
4.把词汇列表、标签列表各转化为一个字典。
for i ,tuplee in enumerate(vocab_list):
用的enumerate()方法
总结:这样,我们就把数据提取为word2index的字典形式,然后再把数据data转化为index的形式,以使计算机能够处理。
5。将data、label转为index的形式便于计算机处理
x = [vocabulary_word2index.get(x,UNK_ID) for x in input_list]
通过get方法在字典中找到每个词的下标,如果该词没有在词汇表中出现,则用UNK_ID作为该词返回的下标
label_list = [vocabulary_label2index[label] for label in label_list]
得到标签所对应的下标。
6。y = transform_multilabel_as_multihot(label_list,label_size)
这部分的作用是 将标签对应的下标进一步变形转为multihot的形式,就是label_size的长度中,出现过的label其所对应的位置记为1,其余的为0。转为0 1 的形式。
7。X = pad_sequences(X, maxlen=sentence_len, value=0.) # padding to max length
该方法的作用将每个序列都通过填充pad转为长度为max length的序列,便于处理。其填充的pad字符对应的下标用0表示。
8. 将训练数据集划分为验证集和训练集两部分
- num_examples = len(lines)
- trainging_number = int(training_portion*num_examples)
- train = (X[0:trainging_number],Y[0:trainging_number])
- valid_number = min(1000,num_examples-trainging_number)
- test = (X[trainging_number+1:trainging_number+valid_number+1],Y[trainging_number+1:trainging_number+valid_number+1])
- return train,test
最终返回了训练集与验证集。其X为每个词对应的index的形式,是数字。label为每个标签对应的下标的位置为1,其余为0。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。