在NLP中,第一步基本上都是分词化(Tokenization)和数字化(Numericalization).分词化就是将一整段话切分成一个一个的分词,此处的分词并不是简单的一个单词,而数字化是将该单词转换为整数值,便于模型训练。
FastAI库中将这两个过程直接封装起来了,所以一般我们用TextDataBunch.from_csv(path, 'texts.csv')
加载文本数据时,根本就觉察不到这两个过程。
1. 分词化-Tokenization
lesson-3提供的数据集是imdb_sample,这是IMDB数据集的一个子集,全部位于一个csv文件中,这个csv文件的格式为:

第一列是label,表示该评论是正面还是负面,第二列text是评论本身文本,第三列is_valid表示该文本是不是val set。
当然,最简单的分词化就是用空格来分开一个一个的单词,这样一个单词就是一个分词,但是这样不太准确,标点符号怎么办?缩写怎么办,比如isn't, don't等?大小写怎么办?
FastAI在加载文本数据集之后,直接将文本进行分词化处理了,处理之后的分词可以用data.show_batch()
显示出来:

2. 数字化-Numericalization
FastAI在将文本进行分词化处理之后,马上对其进行了数字化处理,即用所有文本中的所有分词(默认下,只考虑出现2次及以上的分词,且分词总数为6万)来构建一个分词库,然后用整数来标注每一个分词,这样就将分词和整数一一对应起来。
这个分词库就是刚才加载的data.vocab,我们可以用这个分词库来将整数转换为分词,也可以将分词转换为整数。
data.vocab.itos[:10]
['xxunk',
'xxpad',
'xxbos',
'xxeos',
'xxfld',
'xxmaj',
'xxup',
'xxrep',
'xxwrep',
'the']
可以打印出第一个文本对应的整数值:
data.train_ds[0][0].data[:10]
array([ 2, 5, 66, 62, 34, 99, 72, 34, 42, 96], dtype=int64)
可以看出,对应的分词都已经转换为整数了。
其实,TextClasDataBunch.from_csv()
函数是一种高级的封装之后的API,所以它失去了一些灵活性,如果想要更多灵活性,可以用下面的方法,效果一样:
data = (TextList.from_csv(path, 'texts.csv', cols='text')
.split_from_df(col=2)
.label_from_df(cols=0)
.databunch())
使用NLP专用的TextList类的工厂方法可以满足各种定制化需求。比如上面指定文本来源于text列,使用col=2列来分割train set和val set,label来源于cols=0列。
网友评论