Wikitext 数据教程

在文本中使用 Datasets, Pipeline, TfmdListsTransform
from fastai.basics import *
from fastai.callback.all import *
from fastai.text.all import *

在本教程中,我们将探讨文本应用中数据收集的中层 API。我们将使用 Pets 教程中介绍的基础知识,因此你应该已经熟悉 TransformPipelineTfmdListsDatasets

数据

path = untar_data(URLs.WIKITEXT_TINY)

数据集以两个 CSV 文件提供文章,因此我们读取它们并将它们连接到一个数据框中。

df_train = pd.read_csv(path/'train.csv', header=None)
df_valid = pd.read_csv(path/'test.csv', header=None)
df_all = pd.concat([df_train, df_valid])
df_all.head()
0
0 \n = 2013 – 14 约克城足球俱乐部赛季 = \n \n 2013 – 14 赛季是约克城足球俱乐部在其英格兰北约克郡约克的 <unk> 个职业英式足球赛季,也是他们在英格兰足球联赛中的第 77 个赛季。他们在 2012 – 13 赛季获得第 17 名,这意味着这是他们连续第二个赛季参加英格兰足球乙级联赛。赛季从 2013 年 7 月 1 日持续到 2014 年 6 月 30 日。 \n 奈杰尔·沃辛顿 (Nigel Worthington) 作为约克队主教练开始了他在球队的第一个完整赛季,引进了八名夏季永久转会球员。到年末时,约克队仅高于降级区...
1 \n = Big Boy (歌曲) = \n \n 《Big Boy》<unk>《I 'm A Big Boy Now》是 Jackson 5 录制的第一首单曲,由 Steeltown Records 于 1968 年 1 月发行。乐队在他们的许多 Steeltown 作品中演奏了乐器,包括《Big Boy》。这首歌在评论界和商业上都没有成功,但 Jackson 一家对此结果仍然感到高兴。 \n Jackson 5 在与 Steeltown Records 合作发行第二首单曲后,转投 Motown Records。乐队在 Steeltown Records 的录音曾被认为丢失,但后来被重...
2 \n = The Remix (Lady Gaga 专辑) = \n \n 《The Remix》是美国录音艺术家 Lady Gaga 的一张混音专辑。专辑于 2010 年 3 月 3 日在日本发行,其中收录了她首张录音室专辑《The Fame》(2008 年) 和第三张迷你专辑《The Fame Monster》(2009 年) 中的歌曲混音版。为在更多市场发行,专辑曲目列表进行了修订,并于 2010 年 5 月 3 日在墨西哥率先发行。Pet Shop Boys、Passion Pit 和 The Sound of Arrows 等多位录音艺术家参与了歌曲制作。混音版本包含快节奏和 <unk> 的作品...
3 \n = 新年前夜 (整夜不睡) = \n \n 《新年前夜》是美国喜剧电视剧《整夜不睡》第一季的第十二集。该集最初于 2012 年 1 月 12 日在美国 NBC 电视台播出。由 Erica <unk> 编剧,Beth McCarthy @-@ Miller 执导。该集还邀请 Jason Lee 客串出演 Chris 和 Reagan 的邻居、Ava 的男友 Kevin。 \n 在 Reagan (Christina Applegate) 和 Chris (Will <unk>) 的第一个新年前夜游戏之夜,Reagan 的竞争心理显现出来,导致 C...
4 \n = Geopyxis carbonaria = \n \n Geopyxis carbonaria 是一种属于 Geopyxis 属、<unk> 科的真菌。该物种于 1805 年首次被科学描述,并于 1889 年获得当前名称,俗称炭爱精灵杯、矮 <unk> 杯、<unk> <unk> 杯或小精灵杯。这种真菌的果实小巧,呈 <unk> 状,呈红褐色,边缘带白色,直径可达 2 厘米 (0 @.@ 8 英寸)。它们有一个短而逐渐变细的柄。果实通常大量出现在最近灌木丛被烧毁的土壤上,有时数量庞大。...

我们可以基于空格进行分词(通常的做法),但这里我们将使用标准的 fastai 分词器。

splits = [list(range_of(df_train)), list(range(len(df_train), len(df_all)))]
tfms = [attrgetter("text"), Tokenizer.from_df(0), Numericalize()]
dsets = Datasets(df_all, [tfms], splits=splits, dl_type=LMDataLoader)
/home/jhoward/anaconda3/lib/python3.7/site-packages/numpy/core/_asarray.py:83: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray
  return array(a, dtype, copy=False, order=order)
bs,sl = 104,72
dls = dsets.dataloaders(bs=bs, seq_len=sl)
dls.show_batch(max_n=3)
文本 text_
0 xxbos = xxmaj 墨西哥 xxmaj 城 xxmaj 大 xxmaj 教堂 = \n \n xxmaj 圣母 xxmaj 升天 xxmaj 大 xxmaj 教堂 (xxmaj 西班牙语 : xxunk xxunk de la xxunk de la xxmaj santísima xxunk xxmaj maría a los xxunk ) 是 xxmaj 美洲 最大的教堂,也是 xxmaj 罗马 xxmaj 天主教会 = xxmaj 墨西哥 xxmaj 城 xxmaj 大 xxmaj 教堂 = \n \n xxmaj 圣母 xxmaj 升天 xxmaj 大 xxmaj 教堂 (xxmaj 西班牙语 : xxunk xxunk de la xxunk de la xxmaj santísima xxunk xxmaj maría a los xxunk ) 是 xxmaj 美洲 最大的教堂,也是 xxmaj 罗马 xxmaj 天主教会 xxmaj
1 ,他曾为与 xxmaj 纳粹 xxmaj 德国 和谈而奔走,被 xxmaj 英国 当局根据 xxmaj 防御 xxmaj 条例 xxunk 与 xxmaj 英国 大多数其他积极的法西斯分子一起拘留。 xxmaj 莫斯利夫人 一个月后也被监禁。 xxmaj 马克斯 和他的兄弟 xxmaj 亚历山大 未被列入此次拘留,因此与父母分离了 他曾为与 xxmaj 纳粹 xxmaj 德国 和谈而奔走,被 xxmaj 英国 当局根据 xxmaj 防御 xxmaj 条例 xxunk 与 xxmaj 英国 大多数其他积极的法西斯分子一起拘留。 xxmaj 莫斯利夫人 一个月后也被监禁。 xxmaj 马克斯 和他的兄弟 xxmaj 亚历山大 未被列入此次拘留,因此与父母分离了 the
2 xxmaj 犹太 xxmaj 问题 xxmaj 到 xxmaj 犹太 xxmaj 国度 : xxmaj 论 xxmaj 犹太复国主义 的 xxmaj 理论 (论文) , xxmaj 普林斯顿 xxmaj 大学 。 \n \n = = = xxmaj 文章和章节 = = = \n \n " xxunk 和 xxmaj 巴勒斯坦 xxmaj 问题 : xxmaj 琼 · xxmaj 彼得 的 ' xxmaj 从 xxmaj 时 xxmaj xxmaj 问题 xxmaj 到 xxmaj 犹太 xxmaj 国度 : xxmaj 论 xxmaj 犹太复国主义 的 xxmaj 理论 (论文) , xxmaj 普林斯顿 xxmaj 大学 。 \n \n = = = xxmaj 文章和章节 = = = \n \n " xxunk 和 xxmaj 巴勒斯坦 xxmaj 问题 : xxmaj 琼 · xxmaj 彼得 的 ' xxmaj 从 xxmaj 时 xxmaj immemorial

模型

config = awd_lstm_lm_config.copy()
config.update({'input_p': 0.6, 'output_p': 0.4, 'weight_p': 0.5, 'embed_p': 0.1, 'hidden_p': 0.2})
model = get_language_model(AWD_LSTM, len(dls.vocab), config=config)
opt_func = partial(Adam, wd=0.1, eps=1e-7)
cbs = [MixedPrecision(), GradientClip(0.1)] + rnn_cbs(alpha=2, beta=1)
learn = Learner(dls, model, loss_func=CrossEntropyLossFlat(), opt_func=opt_func, cbs=cbs, metrics=[accuracy, Perplexity()])
learn.fit_one_cycle(1, 5e-3, moms=(0.8,0.7,0.8), div=10)
轮次 训练损失 验证损失 准确率 困惑度 时间
0 5.503713 5.095897 0.237340 163.350342 02:07
#learn.fit_one_cycle(90, 5e-3, moms=(0.8,0.7,0.8), div=10)