NLP文本解析数据预处理的方法

假设我们现在有一个文本的多标签的分类任务。其数据集的格式为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。
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值