前言
文本的常见格式是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")