NLP数据预处理

前言

文本的常见格式是txt,我们需要把txt文件中的每一句话中的每一个单词提取出来建立词库。通常,建立三个字典:word->index, index->word, word->frequency.
此外,由于将来处理文本时会遇到不在词库中的单词,所以添加<unk>, <pad>, <EOS>, <BOS>等特殊词。


以下内容以建立一个处理文本的类为例。


from collections import defaultdict

UNK_TOKEN = '<unk>'
PAD_TOKEN = '<pad>'
BOS_TOKEN = '<s>'
EOS_TOKEN = '</s>'
DEFAULT_UNK_ID = lambda: 0


class Vocabulary:
	def __init__(self,file=None):
	'''
	file:预处理文件的路径
	'''
		#定义特殊字符
		self.specials = [UNK_TOKEN, PAD_TOKEN, BOS_TOKEN, EOS_TOKEN] 
		#初始化字典 word->index
		self.stoi = defaultdict(DEFAULT_UNK_ID)
		self.itos = [] #这里为了方便,直接保存为列表,需要知道index对应的word时,直接用切片
		self._from_file(file) #函数在后面定义

	def _from_list(self,tokens):
	'''
	tokens: 一个列表的单词
	'''
		self.add_tokens(token=self.sepcial+tokens) #add_token函数在后面定义
		assert len(self.stoi) == len(self.itos)
		
	def _from_file(self,file):
		tokens = []
		with open(file,"r",encoding="UTF-8") as open_file:
			for line in open_file:
			#每一行文字去掉换行符后,变成一个列表,再添加到tokens列表中
				tokens.append(line.strip("\n") 
		self._from_list(tokens) 
	
	def add_tokens(self,tokens):
		'''
		tokens:列表单词		
		'''
		for t in tokens:
			new_index = len(self.itos)
			if t not in self.itos:
			#注意两个变量的长度始终一样,已有的单词不在放入两个变量中
				self.itos.append(d)
				self.stoi[t] = new_index
		
	def is_unk(self,token):
	#检查词库里有没有某个单词
		return self.stoi[token] == DEFAULT_UNK_ID()

	def __len__(self):
		#检查词库大小
		return len(self.itos)
	
	def array_to_sentence(self,array,cut_at_eos=True, skip_pad=True):
	'''
	输入一个array,包含了单词的index,目的是将其转换为一个实际的句子
	'''
		sentence = []
		for i in array:
			s = self.itos[i]
			if cut_at_eos and s == EOS_TOKEN:
				break #在停句符号处停止
			if skip_pad and s == PAD_TOKEN:
				continue #添加补句符号
			sentence.append(s)
		return sentence

	def arrays_to_sentences(self, arrays, cut_at_eos=True, skip_pad=True):
		#对多个array进行转换
		sentences = []
		for array in arrays:
			sentences.append(
				self.array_to_sentence(array=array,, cut_at_eos=cut_at_eos, skip_pad=skip_pad))
		return sentences
		
#最后定义一个函数,将文件保存为vocabulary类
def build_vocab(vocab_file = None):
	vocab = Vocabulary(file=vocab_file)
	return vocab

#导入数据	
data = build_vocab("filepath")
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页