ARTICLE DETAIL

资讯详情

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

AI-For-Beginners 实战:如何将文本表示为张量——文本分类的基石(Bag-of-Words / TF-IDF / N-Gram)

AI-For-Beginners 实战:如何将文本表示为张量——文本分类的基石(Bag-of-Words / TF-IDF / N-Gram) 教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本指南基于 AI-For-Beginners 课程 NLP 章节的第 13 课聚焦文本如何转换为神经网络可消费的张量这一核心问题。你将掌握从 Token 化、词表构建到字符级/词级表示、N-Gram、Bag-of-Words 与 TF-IDF 的完整知识链并通过配套的 PyTorch 与 TensorFlow 双版本 Notebook 亲手训练一个 AG News 新闻分类器。读完本文你将具备独立完成任意文本分类任务的特征表示这一环节的工程能力。为什么先解决文本表示问题在 lessons/5-NLP/13-TextRep/README.md 中课程明确把文本分类Text Classification作为 NLP 章节的第一项任务。无论是垃圾邮件识别、新闻归类还是聊天机器人中的意图分类本质上都是对文本序列做分类——而神经网络只能吃数值张量因此我们首先需要一套把文本变成张量的标准流程。本课使用经典的AG News数据集作为实验场。该数据集包含新闻文章样本例如类别Sci/Tech科学/技术标题Ky. Company Wins Grant to Study Peptides (AP)正文AP - A company founded by a chemistry researcher at the University of Louisville won a grant to develop...目标就是根据正文文本把新闻归入 World、Sports、Business、Sci/Tech 四个类别之一。整个 NLP 章节的后续课程Embeddings、语言建模、RNN、Transformer都建立在本课打下的表示方法之上可从 lessons/5-NLP/README.md 查看完整课程地图。计算机眼中的文本字符、编码与张量计算机早已用数字表示文本字符——ASCII、UTF-8 等编码把字符映射为屏幕上渲染的字体。下图展示了字符到 ASCII 码再到二进制表示的映射关系关键区别在于人理解每个字母的含义以及字符如何组合成句子而计算机本身没有这种理解神经网络必须在训练过程中自己学会含义。这决定了我们如何设计文本的表示方案。两种基础表示字符级 vs 词级在 lesson README 中给出了两条基础路线字符级表示Character-level把每个字符当作一个数字。假设语料库中有C种不同字符那么单词Hello会被表示为一个 5×C的张量每个字母对应张量中一列的 One-Hot 编码。词级表示Word-level为文本中的所有单词构建一个词表Vocabulary再用 One-Hot 编码表示每个词。这种方式更好因为单个字母本身几乎不携带语义而使用单词这一更高层的语义概念能简化神经网络的学习任务但代价是词表规模大需要处理高维稀疏张量。无论采用哪种表示第一步都是把文本切分成Token 序列——一个 Token 可以是一个字符、一个单词甚至一个词的子串。随后把 Token 映射为数字典型做法是查词表再通过 One-Hot 编码喂入神经网络。这一流程在 Notebook 中有非常具体的落地PyTorch 版本TextRepresentationPyTorch.ipynb使用torchtext.data.utils.get_tokenizer(basic_english)做切分并用collections.Counter统计词频、torchtext.vocab.vocab构建词表随后用vocab.get_stoi()得到token → 索引字典完成编码。TensorFlow 版本TextRepresentationTF.ipynb则把 Token 化与词表构建合并到keras.layers.experimental.preprocessing.TextVectorization这一个层里通过adapt()方法扫描文本自动建表。限制词表规模一个必须做的工程决策真实的 AG News 数据词汇量超过 10 万。课程在两个 Notebook 中都强调了限制词表大小的重要性极低频词只出现在寥寥几句里模型无法从它们身上学到东西反而会拖慢训练、浪费内存。PyTorch 侧的做法是构建词表时设置min_freq阈值只保留出现次数达到一定标准的词counter collections.Counter() for (label, line) in train_dataset: counter.update(tokenizer(line)) vocab torchtext.vocab.vocab(counter, min_freq1)TensorFlow 侧则通过TextVectorization(max_tokensvocab_size)直接限定词表上限例如vocab_size 50000。Notebook 中特别提醒构建词表时只adapt了数据集的一个子集ds_train.take(500)以加快执行代价是有少量词未被收录进词表而被忽略若用全量数据建表最终准确率还会小幅提升。PyTorch Notebook 中还有一处非常直观的练习to_bow函数以全局vocab_size作为默认词表尺寸课程明确建议读者尝试调低该值观察准确率的变化——预期会出现一定程度的准确率下降但不会剧烈恶化换来的是更高的训练性能。N-Gram把上下文塞进词表自然语言中词义只能在语境中确定。neural network神经网络和fishing network渔网含义完全不同。一种朴素思路是基于词对构建模型把词对当作独立的词表 Token。比如句子I like to go fishing会被表示成I like、like to、to go、go fishing。这带来两个问题词表规模急剧膨胀且go fishing与go shopping明明共享动词go却被编码成毫无语义相似性的两个不同 Token。在部分场景下也可以进一步使用三元组tri-grams这类方法统称N-Gram。N-Gram 同样适用于字符级表示此时 N-Gram 大致对应不同的音节原文写为 syllabi此处指语音上的音节单位。Notebook 中用 Scikit-Learn 演示了二元组 BoW 的生成方式bigram_vectorizer CountVectorizer(ngram_range(1, 2), token_patternr\b\w\b, min_df1) bigram_vectorizer.fit_transform(corpus)从输出可以看到词表中既包含单个词i,like,hot,dogs…也包含词对i like,like hot,hot dogs…。而在 AG News 全量数据上构建二元组词表长度高达1,308,842个 Token——这正是 N-Gram 的核心缺陷。课程给出的缓解手段是调高min_freq丢弃低频 N-Gram 以显著降低维度同时预告了终极解法与下一课 Word Embeddings14-Embeddings 中的降维技术结合。Bag-of-Words把文本压成定长向量文本分类要求我们用固定长度的向量表示文本作为最终稠密分类器的输入。最简单的方式是把所有单词表示叠加例如相加把每个词的 One-Hot 编码相加就得到一个频次向量显示每个词在文本中出现的次数——这就是Bag-of-WordsBoW词袋。BoW 本质上回答了两个问题文本里出现了哪些词、各出现了多少次。这确实是判断文本主题的强线索——政治新闻大概率含president、country科学论文则会出现collider、discovered等词。PyTorch Notebook 给出了最简洁的 BoW 实现——本质上就是 One-Hot 向量求和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.reduce_sum(tf.one_hot(vectorizer(text), vocab_size), axis0)完成同样的求和。课程还额外演示了两种工程化捷径用sklearn.feature_extraction.text.CountVectorizer一行生成 BoW以及在 Keras 中直接给TextVectorization传output_modecount让框架自动完成词频统计。训练 BoW 分类器PyTorch 路线PyTorch Notebook 展示了完整的训练管线数据集转换编写bowify函数作为collate_fn传给DataLoader把所有样本批量转成 BoW 表示def bowify(b): return ( torch.LongTensor([t[0]-1 for t in b]), torch.stack([to_bow(t[1]) for t in b]) ) train_loader DataLoader(train_dataset, batch_size16, collate_fnbowify, shuffleTrue)定义模型一个线性层加LogSoftmax输入维度为vocab_size输出维度为类别数 4net torch.nn.Sequential(torch.nn.Linear(vocab_size, 4), torch.nn.LogSoftmax(dim1))标准训练循环使用NLLLoss Adam 优化器通过epoch_size参数限制训练量教学场景下只训练部分数据、report_freq控制准确率上报频率。Notebook 的实际运行输出显示在 15000 条样本内训练后准确率稳步上升到约 86%损失降至约 0.026。训练 BoW 分类器TensorFlow 路线TensorFlow Notebook 展示了两种构建方式方式一先用map把数据集批量转成 BoW 向量再喂给单层模型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)方式二由于TextVectorization本身也是 Keras 层可以直接把向量化 → One-Hot 求和 → 全连接分类串成一个端到端网络无需预先map数据集训练输出显示验证准确率约 87.4%。此外还有自动模式设置output_modecount后连 One-Hot 求和都省了准确率约 87.7%。四个类别下准确率超过 80% 即为良好结果两个框架都达到了约 87% 的量级。TF-IDF抑制高频噪声词的频次加权BoW 对每个词一视同仁地计数但a、in这类高频虚词几乎出现在所有文本里、频次最高反而盖过了真正重要的词。TF-IDF词频-逆文档频率正是为此而生用浮点权重替代 0/1 的出现标记该权重同时反映词在文档中的出现频率与在整个文档集中的分布。形式上词i在文档j中的权重定义为$$w_{ij} tf_{ij}\times\log({N\over df_i})$$其中$tf_{ij}$词i在文档j中的出现次数即 BoW 值$N$文档集合中的文档总数$df_i$整个集合中包含词i的文档数直观理解权重随词在文档内出现次数增加而增大同时又按含该词的文档数进行衰减补偿。极端情况是——如果某词在每一篇文档中都出现则 $df_iN$权重 $w_{ij}0$该词被完全忽略。Scikit-Learn 一行即可生成 TF-IDF 向量from sklearn.feature_extraction.text import TfidfVectorizer vectorizer TfidfVectorizer(ngram_range(1,2)) vectorizer.fit_transform(corpus) vectorizer.transform([My dog likes hot dogs on a hot day.]).toarray()Keras 中同样有自动模式TextVectorization(output_modetf-idf)。TensorFlow Notebook 的对比实验显示TF-IDF 模式训练后验证准确率约88.5%明显高于同结构的 BoW约 87%说明频次加权确实带来了收益。表示的极限频率能加权语义仍需语境小结本课的两个核心结论BoW 与 TF-IDF 能为不同词赋予频率权重但都无法表示语义与语序——BoW 丢掉了词的先后关系这是其袋之名的由来而语义高度依赖语境。正如语言学家 J. R. Firth 在 1935 年所言一个词的完整意义永远是语境性的脱离语境的语义研究不足为信。课程预告后续将借助语言建模Language Modeling从文本中捕捉语境信息这正是 Embeddings、RNN 与 Transformer 等章节要解决的问题。动手实验与练习课程为每种框架都配备了可直接运行的 NotebookPyTorch 版TextRepresentationPyTorch.ipynb内含数据集加载、Token 化、BoW 构建、分类器训练、N-Gram、TF-IDF 全流程TensorFlow 版TextRepresentationTF.ipynb含TextVectorization、端到端网络、output_modecount/tf-idf自动模式运行前可按 lessons/5-NLP/README.md 的指引安装依赖PyTorch 路线pip install -r lessons/5-NLP/requirements-pytorch.txt含 torch、torchtext 0.9.1、scikit-learn、nltk 等TensorFlow 路线pip install -r lessons/5-NLP/requirements-tf.txt含 TensorFlow、tensorflow_datasets、tensorflow_text 等两个 Notebook 开篇都包含了 GPU 内存管理代码tf.config.experimental.set_memory_growth若训练大模型时遇到显存不足可优先调小 minibatch 大小。挑战与作业方面课程建议用 BoW 配合不同的数据模型做更多练习正式作业assignment.md要求使用自己的数据集可选用 Kaggle 上带署名的数据集重跑 Notebook并改写以凸显自己的发现例如 UFO 目击事件数据集这类能带来意外结果的创新数据源。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI-For-Beginners 实战将文本表示为张量 —— 从 Bag-of-Words 到 TF/IDF 的 NLP 入门AI For Beginners 实战将文本表示为张量 —— 从 Bag of Words 到 TF/IDF 的 NLP 入门 在 AI For Beginn教程人工智能机器学习深度学习AI-For-Beginners 自然语言处理把文本表示为张量——one-hot、N-Grams 与 Bag-of-Words/TF-IDF 实战指南AI For Beginners 自然语言处理把文本表示为张量——one hot、N Grams 与 Bag of Words/TF IDF 实战指南 本文是教程人工智能机器学习深度学习AI-For-Beginners 文本表示实战将文本转为张量的字符级编码、N-gram、BoW 与 TF-IDF 全解析AI For Beginners 文本表示实战将文本转为张量的字符级编码、N gram、BoW 与 TF IDF 全解析 本文是 AI For Beginne教程人工智能机器学习深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表