ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI-For-Beginners NLP 文本表示 Notebook 实战指南:用自定义数据集重跑并改造 PyTorch / TensorFlow 版本

AI-For-Beginners NLP 文本表示 Notebook 实战指南:用自定义数据集重跑并改造 PyTorch / TensorFlow 版本 教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本指南面向 AI-For-Beginners 课程 NLP 章节的13-TextRep单元围绕其课后任务Assignment: Notebooks展开任务要求学习者基于本课附带的 TextRepresentationPyTorch.ipynb 或 TextRepresentationTF.ipynb换成自己的数据集重新运行改写 Notebook 以突出自己的发现并尝试一些可能带来意外洞察的新颖数据集。读完本文你将掌握文本表示Token 化、词表构建、Bag-of-Words、N-Gram、TF-IDF在 PyTorch 与 TensorFlow 两条技术路线下的完整实现并能独立完成换数据集重跑 改造记录发现的完整实战闭环。1. 任务解读这一课后作业到底要求什么原作业lessons/5-NLP/13-TextRep/assignment.md的要求非常明确可以拆解为四个动作用本课附带的两份 Notebook 之一PyTorch 版或 TensorFlow 版作为起点用自己的数据集重新运行——数据集可以来自 Kaggle 等平台但必须正确标注来源proper attribution改写 Notebook把重点落在展示你个人的观察与结论上而不是简单复现原示例尝试创新数据集例如 NUFORC 的 UFO 目击事件记录数据集这类非典型文本往往能暴露常规新闻分类管线之外的盲点。换句话说这个作业不是照着跑一遍的体力活而是要求你把本课讲义中讲到的文本表示技术栈字符级/词级表示、词袋、N-Gram、TF-IDF真正迁移到新数据上并用实验结果说话。课程讲义背景可参考 13-TextRep 单元主页本单元聚焦文本分类text classification默认数据集是 AG News 新闻标题四分类World / Sports / Business / Sci/Tech。作业正是要求你脱离这个默认数据集检验同一套方法在新数据上的泛化表现。2. 动手前的准备环境与依赖2.1 安装依赖NLP 章节提供了两份依赖清单按你选择的框架安装其一即可PyTorch 路线lessons/5-NLP/requirements-pytorch.txt包含torch、torchtext、torchvision、scikit-learn、nltk、gensim等TensorFlow 路线lessons/5-NLP/requirements-tf.txt包含TensorFlow、TensorFlow_datasets、TensorFlow_text、scikit-learn等。# PyTorch 版 pip install -r lessons/5-NLP/requirements-pytorch.txt # 或 TensorFlow 版 pip install -r lessons/5-NLP/requirements-tf.txt2.2 GPU 注意事项lessons/5-NLP/README.md 明确给出了本章节的 GPU 使用建议训练较大模型时建议使用 GPU 环境以减少等待若遇显存不足优先减小 minibatch 大小旧版 TensorFlow 在同一 Python 内核中训练多个模型时可能不释放显存可显式开启按需增长physical_devices tf.config.list_physical_devices(GPU) if len(physical_devices)0: tf.config.experimental.set_memory_growth(physical_devices[0], True)这一段代码同样出现在 TextRepresentationTF.ipynb 的开头属于官方推荐的标准配置。3. 原 Notebook 的技术管线换数据前先吃透骨架无论选 PyTorch 还是 TensorFlow 版本两份 Notebook 都遵循同一套六段式管线。先把它吃透换数据时才不会盲目。3.1 数据加载与格式认知PyTorch 版使用torchtext内置的AG_NEWS数据集返回(label, text)二元组import torch, torchtext, os, collections os.makedirs(./data, exist_okTrue) train_dataset, test_dataset torchtext.datasets.AG_NEWS(root./data) classes [World, Sports, Business, Sci/Tech]注意torchtext数据集对象是迭代器想要重复使用必须先转成 listNotebook 中专门强调了这一点train_dataset, test_dataset torchtext.datasets.AG_NEWS(root./data) train_dataset list(train_dataset) test_dataset list(test_dataset)TensorFlow 版使用 TensorFlow Datasets 的ag_news_subsetimport tensorflow as tf from tensorflow import keras import tensorflow_datasets as tfds dataset tfds.load(ag_news_subset) ds_train dataset[train] # 120000 条 ds_test dataset[test] # 7600 条TF 版的样本是字典结构title、description、label打印前 5 条可以看到3 (Sci/Tech)、1 (Sports)等标签。换数据的关键启示这一步决定了你要做多少适配工作——如果自定义数据集的结构与上述两种格式不一致例如是 CSV、JSON字段名不同标签不是整数就需要额外写一个解析器把它转成(label, text)或字典结构。3.2 Token 化与词表构建文本要喂给神经网络必须先从字符序列变成数字。两步走用tokenizer把文本切成 token用vocabulary词表把 token 映射为整数下标。PyTorch 版tokenizer torchtext.data.utils.get_tokenizer(basic_english) tokenizer(He said: hello) # [he, said, hello] counter collections.Counter() for (label, line) in train_dataset: counter.update(tokenizer(line)) vocab torchtext.vocab.vocab(counter, min_freq1) stoi vocab.get_stoi() # token - index def encode(x): return [stoi[s] for s in tokenizer(x)]在这个实现里AG News 词表大小约为 95810Notebook 实际打印为Vocab size if 95810。TensorFlow 版用TextVectorization层一步完成vocab_size 50000 vectorizer keras.layers.experimental.preprocessing.TextVectorization(max_tokensvocab_size) vectorizer.adapt(ds_train.take(500).map(lambda x: x[title] x[description]))注意 TF 版的两处工程细节词表大小上限AG News 原始词表超过 10 万词但低频词模型学不到东西因此用max_tokens截断到 5 万只取 500 条子集做adapt为了加快运行Notebook 刻意只用部分数据建词表代价是部分词会落入[UNK]Notebook 明确指出用全量数据跑adapt会提高最终准确率但提升并不显著。这给了换数据时的两条实用经验词表要截断、建词表可以只抽样。3.3 Bag-of-Words词袋表示词袋的核心思想词序不重要词的出现频率才是内容信号。一份文档的 BoW 向量 词表中每个词在该文档中出现的次数也可以理解为所有单词 one-hot 向量之和。先用 scikit-learn 快速体验TextRepresentationPyTorch.ipynb 与 TF 版都包含这段from sklearn.feature_extraction.text import CountVectorizer vectorizer CountVectorizer() corpus [I like hot dogs., The dog ran fast., Its hot outside.] vectorizer.fit_transform(corpus) vectorizer.transform([My dog likes hot dogs on a hot day.]).toarray() # array([[1, 1, 0, 2, 0, 0, 0, 0, 0]])在 PyTorch 中手工实现 BoW 向量def to_bow(text, bow_vocab_sizevocab_size): res torch.zeros(bow_vocab_size, dtypetorch.float32) for i in encode(text): if i bow_vocab_size: res[i] 1 return resTensorFlow 版则用tf.one_hottf.reduce_sum实现同样的逻辑def to_bow(text): return tf.reduce_sum(tf.one_hot(vectorizer(text), vocab_size), axis0)更现代的做法是直接让TextVectorization输出计数向量keras.layers.experimental.preprocessing.TextVectorization( max_tokensvocab_size, output_modecount)值得注意的差异TF 版 Notebook 特意对比了 scikit-learn 与 Keras 两种 BoW 结果不一致的原因——前者词表来自当前示例语料后者词表来自整个 AG News 数据集向量维度完全不同。这说明BoW 向量高度依赖词表来源换数据集时词表必须重建。3.4 在 BoW 上训练分类器PyTorch 版把bowify作为collate_fn传给标准DataLoader即可把 batch 里的每条文本实时转成 BoW 向量from torch.utils.data import DataLoader def bowify(b): return ( torch.LongTensor([t[0]-1 for t in b]), # 标签AG News 标签从 1 开始故减 1 torch.stack([to_bow(t[1]) for t in b]) # BoW 特征 ) train_loader DataLoader(train_dataset, batch_size16, collate_fnbowify, shuffleTrue) test_loader DataLoader(test_dataset, batch_size16, collate_fnbowify, shuffleTrue) net torch.nn.Sequential(torch.nn.Linear(vocab_size, 4), torch.nn.LogSoftmax(dim1))训练循环使用标准 PyTorch 写法Adam 优化器 NLLLoss 按report_freq频率打印累计准确率Notebook 用epoch_size15000只训练了不到一个 epoch训练侧准确率即可到 86% 左右。TensorFlow 版用map把数据集批量转成 BoW再定义一个单线性层模型batch_size 128 ds_train_bow ds_train.map(lambda x: (to_bow(x[title]x[description]), x[label])).batch(batch_size) ds_test_bow ds_test.map(lambda x: (to_bow(x[title]x[description]), x[label])).batch(batch_size) model keras.models.Sequential([ keras.layers.Dense(4, activationsoftmax, input_shape(vocab_size,)) ]) model.compile(losssparse_categorical_crossentropy, optimizeradam, metrics[acc]) model.fit(ds_train_bow, validation_datads_test_bow)TF 版运行结果中BoW 单层 Dense 在验证集上达到约 87% 的准确率。Notebook 评价四分类问题达到 80% 以上即算不错的结果。TF 版还展示了一个进阶技巧因为TextVectorization本身也是 Keras 层可以把它和分类头一起放进同一个keras.Model端到端训练省掉map预转换inp keras.Input(shape(1,), dtypetf.string) x vectorizer(inp) x tf.reduce_sum(tf.one_hot(x, vocab_size), axis1) out keras.layers.Dense(4, activationsoftmax)(x) model keras.models.Model(inp, out) model.compile(losssparse_categorical_crossentropy, optimizeradam, metrics[acc])3.5 N-Gram为多词表达建模BoW 的局限在于像hot dog这类多词表达拆成hot和dog两个独立词会丢失语义。解法是把相邻词对bigram甚至三词组合trigram也纳入词表bigram_vectorizer CountVectorizer(ngram_range(1, 2), token_patternr\b\w\b, min_df1)PyTorch 版用torchtext的ngrams_iterator构建 bigram 词表counter collections.Counter() for (label, line) in train_dataset: l tokenizer(line) counter.update(torchtext.data.utils.ngrams_iterator(l, ngrams2)) bi_vocab torchtext.vocab.vocab(counter, min_freq1)实验数据点AG News 的 bigram 词表长度高达1308842约 131 万——这揭示了 N-Gram 路线的核心痛点词表爆炸。两份 Notebook 都给出了实操建议用min_freq过滤掉出现次数过少的 n-gram显著降低维度N-Gram 表示必须配合后续课程讲到的嵌入embeddings降维才有实用价值在 TF 版中可给TextVectorization传ngrams参数并用max_tokens限制 bigram 数量。3.6 TF-IDF压制高频泛词BoW 对每个词一视同仁导致a、in这类几乎出现在所有文档里的词占满权重。**TF-IDF词频-逆文档频率**用浮点权重替代 0/1 计数词 $i$ 在文档 $j$ 中的权重定义为$$w_{ij} tf_{ij}\times\log\left({N \over df_i}\right)$$其中 $tf_{ij}$ 是词 $i$ 在文档 $j$ 中出现的次数即 BoW 值$N$ 是文档总数$df_i$ 是包含词 $i$ 的文档数。直观理解一个词出现在所有文档里时 $df_iN$权重归零被完全忽略。scikit-learn 一行搞定from sklearn.feature_extraction.text import TfidfVectorizer vectorizer TfidfVectorizer(ngram_range(1, 2))Keras 版直接改output_modetf-idfkeras.layers.experimental.preprocessing.TextVectorization( max_tokensvocab_size, output_modetf-idf)TF 版给出了可对比的实测结果在相同配置下BoWoutput_modecount验证准确率约 87.7%TF-IDF 提升到约88.5%——这正是换数据时可以复现的关键对照实验。3.7 理论边界无论是 BoW 还是 TF-IDF都只刻画了频率无法表达语义与顺序。Notebook 结尾引用了语言学家 J. R. Firth 1935 年的名言一个词的完整意义永远是语境化的脱离语境研究意义是不可取的。 这正是后续语言建模、嵌入章节要解决的问题。4. 换用自定义数据集分步改造指南这是作业的核心动作。下面给出从拿到新数据到跑通改造版 Notebook的完整路径。4.1 选数据与合规来源标注作业明确要求数据来自 Kaggle 等平台时必须正确标注来源attribution在 Notebook 的 markdown 单元格里写明数据集名称、作者与下载地址推荐方向作业点名 NUFORC 的 UFO 目击记录sightings数据集。这类数据集的特点恰恰是反常规——文本是目击者的非结构化描述长短差异极大、拼写随意、大量地名与日期、类别维度与新闻四分类完全不同能暴露出文本表示管线的真实短板自备数据任何文本 标签结构的 CSV/JSON 都可以例如邮件垃圾分类、商品评论情感分类、客服工单意图分类。4.2 数据格式适配PyTorch 路线把自定义数据集整理成(label, text)二元组列表替换掉torchtext.datasets.AG_NEWS(...)这一行import csv rows [] with open(my_dataset.csv, encodingutf-8) as f: reader csv.reader(f) next(reader) # 跳过表头 for label, text in reader: rows.append((int(label), text)) # 划分训练/测试 split int(len(rows) * 0.8) train_dataset, test_dataset rows[:split], rows[split:]后续tokenizer、vocab、encode、to_bow、bowify、DataLoader全部原样复用——这段管线对数据格式不敏感是标准化的。4.3 数据格式适配TensorFlow 路线把tfds.load(ag_news_subset)换成从文本构建tf.data.Datasetimport tensorflow as tf def load_csv(path): ds tf.data.experimental.CsvDataset( path, [tf.int32, tf.string], headerTrue ) return ds.map(lambda label, text: {label: label, text: text}) ds_train load_csv(train.csv).shuffle(10000) ds_test load_csv(test.csv)然后把原 Notebook 中的字段访问从x[title] x[description]改为x[text]其余TextVectorization、to_bow、model.fit逻辑不变。4.4 词表与向量的必改项换数据后以下参数几乎必然需要调整这是最容易踩坑的地方参数原默认值AG News换数据后的处理策略max_tokens/vocab_size5 万TF/ 约 9.6 万PT先打印新词表长度再设一个合理截断值min_freq1文本量大可提高到 2~3压制噪声 tokenngrams1若数据集多词表达多可试(1,2)并观察词表膨胀output_mode无对比countBoW与tf-idf的准确率差标签编码4 类整数新分类任务的类别数要同步改Dense/Linear输出维度PyTorch 版 Notebook 给出了一个非常值得换数据时复现的对照实验降低vocab_size只用最高频词会带来轻微准确率下降但显著提升性能——你可以在新数据集上画出词表大小 vs 准确率的曲线。5. 改写 Notebook把发现变成文章的骨架作业要求rewrite the notebook to underline your own findings。建议按以下结构重构 markdown 单元格数据卡片数据集名称、来源、规模、类别分布用collections.Counter统计标签观察 1词表画像——打印新数据集的词表大小、top 10 高频词与 AG News 对比。UFO 数据集大概率会出现大量地名、日期、数字 token观察 2BoW 分类基线——记录 BoW 准确率并指出哪些高频词其实是噪声观察 3N-Gram 实验——bigram 词表膨胀到什么程度min_freq提上去后维度降了多少观察 4TF-IDF 增益——对比output_modecount与tf-idf的准确率差异能否复现约 1 个百分点的提升观察 5失败案例——从测试集挑 2~3 条分类错误的样本分析 BoW/TF-IDF 为什么搞不定它们例如否定句、罕见表达、词序敏感句子自然引出需要语义建模的结论。每一节实验都要给出数字与代码输出这正是highlight your own findings的含义。6. 作业自检清单完成改造后对照以下清单确认交付质量数据来源已在 Notebook 中明确标注attributionNotebook 可在新数据上端到端跑通从加载到评估词表、类别数、max_tokens等参数已按新数据调整至少完成 BoW 与 TF-IDF 的准确率对比记录了 N-Gram 词表膨胀与min_freq截断的效果有 2~3 条对失败案例的分析指出了频率式表示的局限没有简单照抄原 Notebook 结论而是用自己的实验数据说话。完成这组实验你不仅完成了 assignment.md 的要求也彻底掌握了文本表示这层地基——它是后续 14-Embeddings嵌入降维、15-LanguageModeling语言建模等课程继续深入的直接前提。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐用自定义数据集重跑 AI-For-Beginners 文本表示 Notebook从 BoW 到 TF-IDF 的完整实战指南用自定义数据集重跑 AI For Beginners 文本表示 Notebook从 BoW 到 TF IDF 的完整实战指南 本指南对应 AI For Beg教程人工智能机器学习深度学习SuperAgent 单元测试代码覆盖率 Istanbul 与 Codecov 集成SuperAgent 单元测试代码覆盖率 Istanbul 与 Codecov 集成 引言为什么代码覆盖率至关重要 在现代软件开发中单元测试是保证代码质量教程人工智能机器学习深度学习AI-For-Beginners 文本表示实战用 PyTorch/TensorFlow 笔记本复跑自定义数据集完成 UFO 目击文本分类AI For Beginners 文本表示实战用 PyTorch/TensorFlow 笔记本复跑自定义数据集完成 UFO 目击文本分类 本文对应课程 13教程人工智能机器学习深度学习上一篇Baserow数据导出格式PDF、Excel、HTML报告生成指南下一篇Unsloth Studio 在 RDNA2 APUSteam Deck / gfx1033上的 ROCm 实测结论为何推理走 Vulkan、训练走 CPU创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表