NLP 图解,第一部分:文本编码 📅 发布时间:2026/7/5 22:50:39 👁️ 浏览次数: 原文towardsdatascience.com/nlp-illustrated-part-1-text-encoding-41ba06c0f512https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5de16d507d802b50a228a1ebc20307a2.png今天我们开始一个新的系列关于自然语言处理NLP。这很令人兴奋因为 NLP 是我们随处可见的所有花哨的大型语言模型LLMs的支柱——想想 Claude、GPT 和 Llama。简而言之NLP 帮助机器理解人类语言——无论是理解它、分析它甚至生成它。如果你一直在跟随我们的**深度学习之旅**我们已经了解到在本质上神经网络遵循一个简单的原则它们接收一个输入施展数学魔法然后输出一个结果。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/510668ce6eb1a8adf3f3f798c0dc218b.png然而为了使神经网络能够做到这一点输入和输出都必须是它们理解的格式数字。这个规则适用于我们处理任何简单模型的情况…https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a55a71d67515e6402538c9e152084bb8.png…或者一个高度复杂的模型如 GPT。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/60b61b9687b79d97c4ac761ce3a4381d.png现在事情变得有趣了。我们通过文本与模型如 GPT 进行交互。例如我们可能会问它“印度的首都是哪里”模型能够理解这段文本并提供一个回答。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e55ec0da3f61713b75f69348ab537c31.png我们不能将文本输入到神经网络中但等等——我们不是刚刚说过神经网络不能直接处理文本而需要数字吗https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c451c705039dd6da13c53d465ed4df39.png欢迎回到互联网的角落我们在这里处理听起来复杂的机器学习概念并通过图解的方式展示它们——最终发现它们其实并不那么复杂向 ChatGPT 提问https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5de16d507d802b50a228a1ebc20307a2.png我们需要在将文本输入神经网络之前将其转换为数字这就是文本编码的作用在这篇文章中我们将探讨一些处理这种文本到数字转换的简单方法。独热编码编码文本最简单的方法之一是通过独热编码。让我们分解一下想象我们有一个包含 10,000 个词的词典。这个词典中的每个词都有一个独特的位置。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ae3b8bade0e4e3f1fa9bcd66b1a5b37a.png我们词典中的第一个词“about”位于位置 1而最后一个词“zoo”则位于位置 10,000。同样每个其他词都有其独特的位置在两者之间。现在让我们说我们想要编码单词“dogs”。首先我们在字典中查找它的位置…https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/949bb082b3b829b7887f10eff0c5c7d7.png…并且发现“dogs”在第 850 个位置。为了表示它我们创建一个包含 10,000 个零的向量然后将第 850 个位置设置为 1如下所示https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5a79e0a20d3187ecc0b0e939c2728b79.png这就像一个开关如果单词的位置匹配开关是开着的1如果不匹配开关是关着的0。现在假设我们想要编码这个句子https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ef4f2517ece76389c06816a5100d6e30.png除了“dogs”的词向量外我们还找到了“barks”的词向量…https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0d7324ba83b4730015548b634986cefc.png…以及“loudly”https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/88e90b2eb96a74ecd68ea31a46c7f2a5.png然后为了表示整个句子我们将这些单独的词向量堆叠成一个矩阵其中每一行对应一个单词的向量https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2cfc1535d883d15ad5aefd55f39b520d.png这形成了一个句子矩阵行对应于单词。虽然这很简单且直观但独热编码有一个很大的缺点低效。每个词向量都非常大大部分都是零。例如对于一个包含 10,000 个单词的字典每个向量包含 10,000 个元素其中 99.99%是零。如果我们扩展到更大的字典——比如拥有大约 170,000 个单词的剑桥英语词典——这种低效性变得更加明显。现在想象一下通过将这些 170,000 大小的词向量堆叠成句子矩阵来编码一个句子——它很快就会变得巨大且难以管理。为了解决这些问题我们转向一个更有效的方法词袋模型。词袋模型词袋模型BoW通过为整个句子创建一个单一向量而不是为每个单词创建单独的向量来简化文本表示。想象我们有这四个句子想要编码https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/cd72aed94c9039f3a0b77d62f1845b9f.png如果你知道这个引用的来源那你就赚到了。如果你不知道我们就假装这是人们常说的话。第一步是创建一个包含这四个句子中所有独特单词的字典。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/be7b2529540b1a14cd52eb60bf96c744.pngBoW 字典每个句子都表示为一个向量其长度等于我们字典中独特单词的数量。并且向量中的每个元素代表字典中的一个单词并设置为该单词在句子中出现的次数。例如如果我们取第一句话“onions have layers,”它的向量看起来是这样的https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a273e357db509422d8adb78293c19549.png句子 1 的 BoW 编码“onions”出现了一次“have”出现了一次“layers”出现了一次。所以这个句子的向量会在这些位置上有一个1。同样我们可以编码剩余的句子https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/bc11486bb94c57546990721a1c19f6cb.png句子的 BoW 编码让我们再编码一个例子https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9c3f7ad7335fd562e76a36c4bfbd8098.png对于这个句子单词“layers”和“have”重复了两次因此它们在向量中的对应位置将具有值2。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e168448ec21499e93eb08fef70248e37.png句子的 BoW 编码下面是如何在 Python 中实现 BoW 的示例fromsklearn.feature_extraction.textimportCountVectorizer sentences[Onions have layers,Ogres have layers,You get it?,We both have layers]bag_of_wordsCountVectorizer()Xbag_of_words.fit_transform(sentences)print(BoW dictionary:,bag_of_words.get_feature_names_out())print(BoW encoding:n,X.toarray())BoW dictionary:[bothgethaveitlayersogresonionsweyou]BoW encoding:[[001010100][001011000][010100001][101010010]]虽然 BoW 在计数单词方面简单有效但它无法捕捉单词的顺序或上下文。例如考虑以下两个句子中的单词“bark”https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3530657f70805fc4e6e8a28228d306db.png在“dogs bark loudly”中的单词“bark”与在“the tree’s bark”中的单词“bark”完全不同的意义。但 BoW 在这两种情况下都会将“bark”视为相同忽略了周围单词提供的意义差异。二元组这就是二元组发挥作用的地方。通过查看相邻的单词它们有助于捕捉更多的上下文。让我们用这两个句子来说明这一点https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3530657f70805fc4e6e8a28228d306db.png就像在 BoW 方法中一样我们首先创建一个字典https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/31ac8b23036d62771724b73dc5662bb5.png然而这次除了单个单词外我们还包括单词对二元组。这些二元组是通过查看每个句子中直接相邻的单词形成的。例如在句子“dogs bark loudly”中二元组将是https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/988ae32cf20068b950858d6ab35a14f0.png在“the tree’s bark”中这些是二元组https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/12914e7decf4b262c92a6365150023f4.png我们将其添加到我们的字典中以获得我们的二元组词典https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8f2d87f84332ec859ed2e1bfacf3b9b1.png二元组词典接下来我们将每个句子表示为一个向量。与 BoW 类似这个向量中的每个元素都对应于字典中的一个单词或二元组其值表示该单词或二元组在句子中出现的次数。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d618f5ba77ac44d591f5c0ab13a89d17.png二元组编码使用二元组允许我们通过捕捉相邻单词之间的关系来保留上下文。因此如果一个句子包含“tree’s bark”而另一个句子包含“dogs bark”这些二元组将以不同的方式表示从而保留它们的意义。下面是如何在 Python 中实现二元组的示例fromsklearn.feature_extraction.textimportCountVectorizer sentences[dogs bark loudly,the trees bark]bigramCountVectorizer(ngram_range(1,2))#(1, 2) specifies that we want single words and bigramsXbigram.fit_transform(sentences)print(Bigram dictionary:,bigram.get_feature_names_out())print(Bigram encoding:n,X.toarray())Bigram dictionary:[barkbark loudlydogsdogs barkloudlythethe treetreetree bark]Bigram encoding:[[111110000][100001111]]N-gram正如二元组将两个连续的单词分组一样我们可以将这个概念扩展到n-gram其中n代表一起分组的单词数量。例如当n3三元组时我们会将三个连续的单词分组例如“dogs bark loudly”。同样当n5时我们会将五个连续的单词分组从而从文本中捕捉到更多的上下文。这种方法使我们能够捕捉到文本数据中更丰富的关系和上下文但它也增加了字典的大小和计算复杂度。TF-IDF虽然“词袋模型”和“二元组”在计数单词和捕捉基本上下文方面很有效但它们没有考虑单词在句子或多个句子中的重要性或独特性。这就是**TF-IDF词频-逆文档频率**发挥作用的地方。它根据以下因素对单词进行加权词频 (TF):一个单词在句子中出现的频率逆文档频率 (IDF):一个单词在所有句子中的稀有程度或独特性这种加权系统使得 TF-IDF 在突出句子中的重要单词同时可以降低常见单词的影响。为了看到这个在实际中的应用让我们将 TF-IDF 应用于我们熟悉的四句话集合。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/cd72aed94c9039f3a0b77d62f1845b9f.png和之前一样我们创建了一个包含我们句子中所有唯一单词的字典。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/be7b2529540b1a14cd52eb60bf96c744.png词频 (TF)要计算一个单词的 TF我们使用以下公式https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/eb8058bbbaf1419d22ad4c081617e8a1.png例如对于第一句话中的单词“onions”…https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a932816ddeca7dbcf44dc931968111f3.png…TF 是https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/cb43fd529e8ba209ffc4dfab3ba06fa7.png同样让我们计算第一句话中“both”的 TFhttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8d666af75971c7be3bb7ac5ad9a70a29.png使用相同的逻辑我们可以得到所有四个句子中所有单词的 TF如下所示https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ea34605d30f2d2fa8aba69771b30e493.png每个句子中所有单词的 TF注意一个单词的 TF 可能在不同句子中有所不同。例如单词 “both” 在前三句中没有出现所以这些句子的 TF 为 0。然而在最后一句中它出现在四个单词中的其中一个其 TF 为 1/4。逆文档频率 (IDF)接下来我们计算每个单词的 IDF。IDF 会给出现在句子中较少的单词更高的值从而强调那些出现在较少句子中的单词。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/81c6cd34d90cd5c675e23597b8ce790c.png例如我们看到单词“both”只出现在四句话中的一句https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fa88445df7a1a16603c5e48b04e32809.png因此其 IDF 为https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/6075c0557da4b4daff635ba5f403313a.png同样我们可以得到字典中其他单词的 IDFhttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4c0efa3505eb82a716b966892f5e907f.png字典中所有单词的 IDF在这里单词“both”只出现在第 4 句话中这使得它的 IDF 得分比像“have”这样出现在多句中的常见单词要高。与 TF 不同一个单词的 IDF 在所有句子中保持一致。TF-IDF一个单词最终的 TF-IDF 分数是其 TF 和 IDF 的乘积https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/36d61736f9de29f36bfbe16639b2f61e.png这导致句子向量其中每个单词的得分反映了它在句子中的重要性TF以及它在所有句子中的独特性IDF。将 TF 和 IDF 项代入我们的公式我们得到最终的 TF-IDF 句子向量https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/31eb951acd9c335e074bbb6e1d384692.png所有句子的 TD-IDF 编码这是我们在 Python 中计算 TF-IDF 的方法fromsklearn.feature_extraction.textimportTfidfVectorizer sentences[Onions have layers,Ogres have layers,You get it?,We both have layers]tfidfTfidfVectorizer()Xtfidf.fit_transform(sentences)print(TF-IDF dictionary:,tfidf.get_feature_names_out())print(TF-IDF encoding:n,X.toarray())注意Python 的结果可能与手动计算略有不同因为1. L2 Normalization:Scikit-learn 的TfidfVectorizer默认将向量归一化到单位长度。2. 调整后的 IDF 公式:IDF 计算包括一个平滑项以防止对于出现在所有句子中的单词进行除零操作。在这里了解更多关于这个信息。虽然我们讨论的方法是 NLP 中的基本构建块但它们存在显著的局限性。1 – 这些方法缺乏语义理解。它们无法理解单词的意义也无法识别像“fast”快和“quick”迅速这样的同义词之间的关系。虽然双词组可以提供一些局部上下文但它们仍然错过了更深层次的联系和细微的意义差异。2 – 这些方法依赖于刚性表示将单词视为孤立实体。例如我们直观地理解“king”国王和“queen”王后是相关的但这些方法将“king”和“queen”表示为与“king”和“apple”苹果一样无关完全忽略了它们的相似性。3 – 他们面临可扩展性挑战。它们依赖于稀疏、高维向量随着词典大小的增加这些向量变得更加难以处理和效率低下。如果我们能够以捕捉单词的意义、相似性和关系的方式来表示单词这正是词嵌入所追求的。词嵌入通过创建密集、有意义的向量同时保留上下文和语义关系从而革新了文本编码。在下一篇文章中**NLP 图解第二部分词嵌入**我们将探讨这些嵌入如何超越基本的词频统计捕捉单词之间复杂、细微的关系NLP 图解第二部分词嵌入如果您有任何问题/评论请通过LinkedIn与我联系或给我发送电子邮件至[email protected]。备注除非另有说明所有插图均由作者绘制。
没有人能把 AI 逼进角落! 原文:towardsdatascience.com/nobody-puts-ai-in-a-corner-0118641bc319?sourcecollection_archive---------7-----------------------#2024-11-13 关于转型的两个简短故事,以及如果你想成为“AI 启用型”公司,应该做些什么 https://medium… 2026/7/5 2:20:22
不,您不需要新的微服务架构 原文:towardsdatascience.com/no-you-dont-need-a-new-microservices-architecture-f0dbda673bae 如果你感觉 AI 生成的文章图片实际上很好地捕捉了你公司的系统架构,那么这篇文章就是为你准备的。 毫无疑问,将复杂任务分解成更小的、可管理… 2026/5/17 3:20:37
寻音捉影·侠客行精彩案例:车载录音中成功识别‘红灯’‘斑马线’‘盲区’等安全关键词 寻音捉影侠客行精彩案例:车载录音中成功识别‘红灯’‘斑马线’‘盲区’等安全关键词 1. 什么是“寻音捉影侠客行”? 在车载场景中,一段长达47分钟的行车记录仪音频里,混杂着导航提示、乘客交谈、环境噪音,甚至还有收… 2026/5/17 3:20:36
FireRed-Image-Edit 1.0:深度学习驱动的图像语义编辑技术解析 1. 项目概述:FireRed-Image-Edit 1.0的技术革新春节前夕,小红书开源团队悄然扔出一枚"技术炸弹"——FireRed-Image-Edit 1.0图像编辑模型。这个看似突然的发布,实则是团队在AIGC领域长达18个月的持续深耕成果。作为一名长期跟踪AI图… 2026/7/5 22:48:57
从PWM信号到精准角度:舵机闭环控制原理深度解析 1. PWM信号与舵机控制的基础认知第一次接触舵机时,我盯着那根黄色信号线疑惑了很久——为什么改变脉冲宽度就能让机械臂精准停在我想要的角度?后来拆开几个报废舵机才明白,这背后藏着精妙的闭环控制思想。PWM(脉冲宽度调制&#x… 2026/7/5 22:46:56
CentOS 7源码编译OpenSSL 3.1.4与Python 3.12集成指南 1. 项目概述与背景最近在给一个老项目做技术栈升级,环境是经典的CentOS 7,需要将Python升级到最新的3.12版本。本以为是个常规操作,结果在安装一些依赖包时,系统反复报错,核心问题都指向了OpenSSL。系统自带的OpenSSL … 2026/7/5 22:46:56
Playwright UI自动化测试:悬停操作原理、实战与最佳实践 1. 项目概述:为什么UI自动化中的“悬停”操作如此关键?在UI自动化测试的日常工作中,点击、输入、断言这些基础操作大家都很熟悉了。但有一个操作,常常被新手忽略,却又在实际项目中频繁遇到,那就是“悬停”&… 2026/7/5 22:46:56
YOLOv8动态检测头技术解析与优化实践 1. 项目背景与核心价值在计算机视觉领域,目标检测一直是极具挑战性的研究方向。YOLOv8作为当前最先进的实时目标检测框架之一,其检测头的设计直接影响着模型性能。传统检测头在处理多尺度目标、复杂空间关系和多重检测任务时往往存在局限性,这… 2026/7/5 22:46:56
AI大模型核心概念解析:从参数、Token到Transformer与微调 1. 从“黑话”到“行话”:为什么你需要搞懂这些AI大模型名词?最近和几个不同行业的朋友聊天,发现一个挺有意思的现象:无论是做产品、搞运营、写代码,还是做市场,大家嘴里都开始时不时蹦出几个AI大模型相关的… 2026/7/5 22:42:55
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36