【文本到上下文 #3】:文本表示技术

一、说明

欢迎回到“完整的 NLP 指南:文本到上下文”

        在上一篇文章中,我们对自然语言处理 (NLP) 中的基本数据预处理步骤进行了令人着迷的探索。我们剖析了标记化、文本清理、停用词删除、词干提取和词形还原、词性标记和命名实体识别 (NER) 的复杂性。这些步骤对于将原始文本转换为机器可以处理和理解的精致格式至关重要。如果您错过了,请务必在这里赶上。

        今天,在我们的第三部分中,我们深入研究文本表示技术。这一阶段至关重要,因为它弥合了预处理文本与机器解释、分析文本并从中获取含义的能力之间的差距。我们将探讨这些技术如何将文本转换为数字形式,使计算机能够执行复杂的 NLP 任务,例如情感分析、主题建模等。

        以下是这次详细探索中的预期结果:

  1. 词袋 (BoW) 方法:深入了解词袋方法的基本概念。了解它如何通过将内容视为单个单词的集合而不考虑顺序和上下文来简化文本分析。探索其在各种应用中的效率,同时承认其在捕捉语言细微差别方面的局限性。
  2. TF-IDF(词频-逆文档频率):探索更复杂的 TF-IDF 方法。了解它如何通过评估词频以及多个文档中单词的重要性来完善文本表示。本节将深入了解 TF-IDF 如何提供更详细、更有效的方式来理解集合中的文本。
  3. 词嵌入:Word2Vec:检查词嵌入领域,例如 Word2Vec。了解该技术如何捕获单词之间复杂的语义关系,从而促进对文本进行深入且上下文相关的分析。这一部分将强调词嵌入在从语言数据中提取含义方面的重要性。
  4. 3种技术对比分析:最后对这3种技术进行综合比较。我们将评估它们的优点和缺点,重点关注计算需求、语义表示的准确性以及它们对不同数据集大小的适应性等方面。这种比较将帮助您辨别哪种方法最适合您的特定 NLP 任务。

        读完本文后,您将彻底了解这些基本的文本表示技术、它们的比较优缺点以及它们在自然语言处理领域的实际应用。准备扩展您的 NLP 工具包并将这些见解应用到您的项目中!

二、词袋(BoW)方法

        词袋是一种强大的自然语言处理技术,用于文本建模,可以简单、灵活地提取数字特征,而无需考虑语法和词序。利用 Scikit-learn 中的 CountVectorizer,我们可以轻松创建词袋。

# Import libraries
from sklearn.feature_extraction.text import CountVectorizer

# Create sample documents
documents = ["This is the first document.",
              "This document is the second document.",
              "And this is the third one."]

# Create the Bag-of-Words model
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)

# Print the feature names and the document-term matrix
print("Feature Names:", vectorizer.get_feature_names_out())
print("Document-Term Matrix:\n", X.toarray())
Feature Names: ['and' 'document' 'first' 'is' 'one' 'second' 'the' 'third' 'this']
Document-Term Matrix:
 [[0 1 1 1 0 0 1 0 1]
 [0 2 0 1 0 1 1 0 1]
 [1 0 0 1 1 0 1 1 1]]

        我们可以通过调整 stop_words、ngram_range、max_features、lowercase 等参数来根据文本数据的独特要求和分析目标定制词袋模型。(更多信息)

三、什么是 N 元语法?

        N 元语法是文本或句子中 n 个项目的连续序列,对于捕获上下文信息至关重要。它们不仅考虑单个单词,还考虑组合,从而提供更丰富的上下文,从而增强模型的表示。

# Import libraries
from sklearn.feature_extraction.text import CountVectorizer

# Create sample documents
documents = ["This is the first document.",
              "This document is the second document.",
              "And this is the third one."]

# Create the Bag-of-Words model with unigrams, bigrams, and trigrams
vectorizer = CountVectorizer(ngram_range=(1, 3))
X = vectorizer.fit_transform(documents)

# Print the feature names and the document-term matrix
print("Feature Names:", vectorizer.get_feature_names_out())
print("Document-Term Matrix:\n", X.toarray())
Feature Names: ['and' 'and this' 'and this is' 'document' 'document is' 'document is the'
 'first' 'first document' 'is' 'is the' 'is the first' 'is the second'
 'is the third' 'one' 'second' 'second document' 'the' 'the first'
 'the first document' 'the second' 'the second document' 'the third'
 'the third one' 'third' 'third one' 'this' 'this document'
 'this document is' 'this is' 'this is the']
Document-Term Matrix:
 [[0 0 0 1 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 1]
 [0 0 0 2 1 1 0 0 1 1 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0]
 [1 1 1 0 0 0 0 0 1 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 1 1 0 0 1 1]]

        在此示例中,ngram_range=(1, 3)指定您要包含一元组、二元组和三元组。生成的特征名称和文档术语矩阵现在将包含这些 n 元语法。输出将显示文档中的单个单词以及两个和三个连续单词的组合。ngram_range根据您的具体要求进行调整。

        词袋模型捕获每个文档中单词的频率,为更先进的技术奠定了基础。然而,它的局限性,包括词序丢失、高维表示和稀疏性,给完全捕获语义关系带来了挑战,并可能导致计算效率低下。为了解决这些缺点,我们将探索 TF-IDF(词频-逆文档频率)和 Word2Vec 技术。

四、TF-IDF(词频-逆文档频率)

        在自然语言处理 (NLP) 中,词袋 (BoW) 模型(例如我们之前探讨的模型)对于表示文档中单词的频率非常有用。然而,它们也有局限性。BoW 不考虑文档中单词相对于整个语料库(文档集合)的重要性。有些词可能在许多文档中频繁出现,但可能不会携带太多有意义的信息。

        这就是 TF-IDF 发挥作用的地方。TF-IDF 通过根据单词在文档中相对于整个文档集合的重要性为单词分配权重来解决 BoW 的局限性。它帮助我们识别不仅在文档中频繁出现的单词,而且在整个语料库的上下文中对该文档具有独特性和信息性的单词。

4.1 TF-IDF 如何工作?

        词频 (TF):

TF = 没有。文档中术语出现的次数/文档中术语的总数

  • 测量术语在文档中出现的频率。
  • 计算为某个术语在文档中出现的次数与文档中术语总数的比率。
  • 对文档中频繁出现的术语给予高分。

        逆文档频率 (IDF):

IDF =log base e(文档总数/包含术语 t 的文档数量)

  • 衡量术语在整个文档集合(语料库)中的重要性。
  • 计算为语料库中文档总数与包含该术语的文档数之比的对数。
  • 它对语料库中罕见但出现在特定文档中的术语给出高分。

        TF-IDF 分数:

TF-IDF = TF * IDF

  • 通过将 TF 和 IDF 分数相乘获得。
  • 具有高 TF-IDF 分数的单词被认为对于整个语料库上下文中的文档很重要。

4.2 例子:

        考虑一个包含三个文档的语料库:

  1. “这是第一份文件。”
  2. “这份文件是第二份文件。”
  3. “这是第三个。”

        让我们计算第一个文档中术语的 TF-IDF 分数:

  • “这个”:在文档中频繁出现,但在整个语料库中也频繁出现,因此 TF-IDF 得分适中。
  • “first”:在文档中出现一次,并且在整个语料库中并不常见,因此 TF-IDF 得分较高。
  • “文档”:在文档和整个语料库中频繁出现,因此 TF-IDF 分数较低。

        TF-IDF 流程帮助我们识别文档特有的“第一”等术语,从而能够更细致地表示和理解内容。

        总之,TF-IDF 是 NLP 中的一个重要工具,用于为术语分配有意义的权重,捕获它们在文档中相对于整个语料库的重要性。它增强了我们从文本数据中提取有价值的见解的能力。

        以下是使用 Python 的 sci-kit-learn 库计算 TF-IDF 的示例代码片段(更多信息):

# Import libraries
from sklearn.feature_extraction.text import TfidfVectorizer

# Create sample documents
documents = ["This is the first document.",
              "This document is the second document.",
              "And this is the third one."]

# Create the TF-IDF model
tfidf_vectorizer = TfidfVectorizer()
X_tfidf = tfidf_vectorizer.fit_transform(documents)

# Print the feature names and the TF-IDF matrix
print("Feature Names:", tfidf_vectorizer.get_feature_names_out())
print("TF-IDF Matrix:\n", X_tfidf.toarray())
Feature Names: ['and' 'document' 'first' 'is' 'one' 'second' 'the' 'third' 'this']
TF-IDF Matrix:
 [[0.         0.46941728 0.61722732 0.3645444  0.         0.
  0.3645444  0.         0.3645444 ]
 [0.         0.7284449  0.         0.28285122 0.         0.47890875
  0.28285122 0.         0.28285122]
 [0.49711994 0.         0.         0.29360705 0.49711994 0.
  0.29360705 0.49711994 0.29360705]]

        TF-IDF 有效地捕捉术语重要性,通过根据术语频率和独特性分配权重来提供有价值的见解。它通过考虑整个语料库中术语的重要性来增强文档表示。但尽管有其优势,TF-IDF 也有局限性,例如生成固定大小的向量表示以及难以完全理解文本数据中的语义关系和上下文含义。为了解决这些限制并深入研究更细致的文本表示,我们过渡到 Word2Vec。这种先进的技术在连续向量空间中表示单词,保留语义并捕获单词之间复杂的关系。

五、词嵌入:Word2Vec

        在我们对文本表示技术的探索中,我们现在涉足词嵌入,重点关注 Word2Vec。词嵌入是一种先进的方法,它将单词映射到连续的向量空间,捕获语义关系和上下文的细微差别。

        Word2Vec 是一种流行的词嵌入技术,它将单词表示为密集向量,将它们定位在多维空间中。这使得具有相似含义的单词在向量空间中更加接近,从而使模型能够捕获语义关系。

        Word2Vec 的运行原理是相似上下文中出现的单词共享语义。它通过考虑给定上下文中目标单词周围的单词来学习向量表示。Word2Vec 有两种主要架构:连续词袋 (CBOW)Skip-Gram。CBOW 根据上下文预测目标单词,而 Skip-Gram 则根据给定目标单词预测上下文单词。

Word2Vec 是如何工作的?

        等式“国王 — 男人 + 女人 == 女王”是 Word2Vec 的一个著名演示,其中从“国王”中减去“男人”并添加“女人”预计会产生一个表示不分性别的皇室概念的向量。此操作利用词向量中编码的语义关系。然后使用余弦相似度来查找与结果相似的单词,希望“queen”具有较高的相似度。Word2Vec 捕获上下文含义,允许有意义的向量运算和语义关系。

        以下是使用 Gensim 库的示例代码片段 (更多信息)

# Install gensim library if not already installed
# pip install gensim
from gensim.models import Word2Vec
from nltk.tokenize import word_tokenize

# Create sample documents
documents = ["This is the first document.",
              "This document is the second document.",
              "And this is the third one."]

# Tokenize the documents
tokenized_documents = [word_tokenize(doc.lower()) for doc in documents]

# Train Word2Vec model
model = Word2Vec(sentences=tokenized_documents, vector_size=100, window=5, min_count=1, workers=4)

# Example: Get vector representation for the word 'document'
vector_representation = model.wv['document']
print("Vector Representation for 'document':", vector_representation)

        代码片段中参数说明:
        vector_size:
该参数定义了词向量的大小。它确定代表每个单词的向量的维数。较大的向量大小意味着更多的维度,可以捕获更细粒度的单词语义信息,但也需要更多的数据来有效学习,并增加计算复杂度。通常,向量大小选择在 50 到 300 之间。在您的示例中,vector_size=100意味着每个单词都由 100 维向量表示。

        window:window参数指定句子中当前词与预测词之间的最大距离。换句话说,它定义了目标单词周围的单词“窗口”,该目标单词将被视为其上下文。较小的窗口倾向于捕获更多的句法关系,而较大的窗口则捕获更多的语义关系。例如,window=5意味着算法将目标单词左侧的五个单词和右侧的五个单词视为其上下文。

        min_count:该参数定义单词的最小频率计数。出现次数少于此阈值的单词将被忽略。这有助于删除稀有单词,从而减少数据中的噪声并提高单词表示的质量。在您的示例中,min_count=1意味着模型会考虑所有单词,无论它们出现的频率如何。

        workers:workers参数指定训练模型时使用的工作线程数量,这会影响训练过程的速度。这与并行处理相关,可以加快多核机器上的训练速度。较多的工作线程可以显着加快训练速度,但这取决于机器的 CPU 功能。workers=4意味着该模型将使用四个工作线程。

六、3种技术对比分析:

        本节对比了Bag-of-Words (BoW)、TF-IDF和Word2Vec方法,重点介绍了它们的属性和适合的应用场景。

        计算效率:

  • BoW:以其简单和高效而闻名,非常适合在较小的数据集中快速处理。
  • TF-IDF:由于权重计算,比 BoW 要求更高,但复杂度平衡。
  • Word2Vec:高度计算,涉及深度学习,但提供丰富的上下文相关分析。

        语义表示:

  • BoW:提供基本的语义表示,缺乏上下文和词序。
  • TF-IDF:权衡文档中单词的重要性,但无法捕获完整的上下文。
  • Word2Vec:出色地捕捉语义和关系,提供细致入微的理解。

        不同数据集大小的适用性:

  • BoW 和 TF-IDF:对于有限的数据有效,提供简单性和效率。
  • Word2Vec:非常适合较大的数据集,使用大量数据来理解复杂的模式。

        易于实施:

  • BoW:简单,非常适合 NLP 初学者。
  • TF-IDF:需要适度的语言理解。
  • Word2Vec:涉及复杂的设置和神经网络的深入知识。

        应用场景:

  • BoW:适用于文档分类、垃圾邮件检测和情感分析,其中详细上下文不太重要。
  • TF-IDF:在信息检索、关键词提取和文档聚类方面有效,在简单性和上下文相关性之间提供平衡。
  • Word2Vec:非常适合需要深层语言上下文的任务,例如机器翻译、上下文搜索和高级情感分析。

每种技术都有独特的优势和理想场景。在计算受限或数据集较小的场景中,BoW 和 TF-IDF 因其简单性而受到青睐。相比之下,Word2Vec 被选择用于需要对文本进行深刻、上下文丰富的理解的任务,尽管它具有计算要求。

七、结论

        在这篇文章中,我们解开了 NLP 中的三种关键文本表示技术:词袋、TF-IDF 和 Word2Vec。每个都为各种 NLP 任务提供了独特的优势,从简单的分类到理解复杂的语义关系。当您应用这些方法时,请考虑项目的具体要求,以选择最有效的方法。

        展望未来,我们的下一篇博文将从理论转向应用。我们将深入研究 NLP 中的实践机器学习项目,为应用我们所学到的知识提供一个实际的舞台。请继续关注我们自然语言处理之旅中令人兴奋的下一步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/327951.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶轨迹规划之碰撞检测(二)

欢迎大家关注我的B站: 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 目录 1.基于凸优化 2.具身足迹 3. ESDF 自动驾驶轨迹规划之碰撞检测(一)-CSDN博客 大家可以先阅读之前的博客 1.基于…

探索数据的奥秘:一份深入浅出的数据分析入门指南

数据分析 书籍推荐 入门读物 深入浅出数据分析啤酒与尿布数据之美数学之美 数据分析 Scipy and NumpyPython for Data AnalysisBad Data Handbook集体智慧编程Machine Learning in Action机器学习实战Building Machine Learning Systems with Python数据挖掘导论Machine L…

循环神经网络-单变量序列预测详解(pytorch)

参考博客 文章目录 (1)导入所需要的包(2)读取数据并展示(3)数据预处理(4)划分训练集和测试集(5)构建RNN回归模型(6)构造训练函数&…

Vue3响应式系统(三)

Vue3响应式系统(二)https://blog.csdn.net/qq_55806761/article/details/135612738 七、无限递归循环。 响应式系统里无限递归也是需要考虑到的。 什么情况会出现无限递归循环? 代码示例: const data { foo: 1 } const obj new Proxy(/* * */) effe…

金融CRM系统是什么?有哪些功能和作用

今年市场经济下行,投资趋向于保守、人们消费降级,对于金融行业来说影响很大。受经济形式的影响加上行业的数字化转型升级,金融企业都在寻求客户管理的新策略,维护好忠实客户、吸引新客户投资。小编认为CRM系统是管理客户的不二之选…

LLM之RAG实战(十六)| 使用Llama-2、PgVector和LlamaIndex构建LLM Rag Pipeline

近年来,大型语言模型(LLM)取得了显著的进步,然而大模型缺点之一是幻觉问题,即“一本正经的胡说八道”。其中RAG(Retrieval Augmented Generation,检索增强生成)是解决幻觉比较有效的…

ROS第 6 课 编写简单的订阅器 Subscriber

文章目录 第 6 课 编写简单的订阅器 Subscriber1. 编写订阅者节点2. 测试发布者和订阅者 第 6 课 编写简单的订阅器 Subscriber 订阅器是基于编辑了发布器的基础上创建的,只有发布了消息,才有可能订阅。若未编辑发布器,可前往"ROS第5课 …

C语言练习day7

数包含9的数 包含数字9的数_牛客题霸_牛客网 题目: 思路:首先,我们得生成1~2019之间的数字,其次再通过各个位数来比较是否等于9,若等于,则记录一次,反之,不记录。 代码演示&…

MATLAB - 加载预定义的机器人模型

系列文章目录 前言 一、 要快速访问常见的机器人模型,可使用 loadrobot 功能,该功能可加载市售的机器人模型,如 Universal Robots™ UR10 cobot、Boston Dynamics™ Atlas 人形机器人和 KINOVA™ Gen 3 机械手。探索如何生成关节配置并与机器…

SAP银企直联报错排查方法与步骤-F110

银企直联的报错排查经常需要利用F110来查询。方法步骤如下: 1、首先要确定报错是哪天的,并且当天那一次跑的付款建议。需要通过表 REGUH来确认(跟据供应商编码、日期) 2、通过REGUH表的信息知道了是2024年1月16号第5个标识(也就是第五次跑付…

【QML COOK】- 010-动态创建组件

上节介绍了Component的概念,本节介绍一下如何使用javascript动态创建对象。 1. 创建工程,新建一个MyComponent.qml的qml import QtQuickRectangle {color: "red" }它很简单就是一个红色框 2. 编辑main.qml import QtQuickWindow {id: root…

刘知远LLM入门到实战——自然语言基础

文章目录 自然语言处理基础词表示语言模型N-gram ModelNeural Language Model: 为什么NLP等领域的模型越来越大? 大模型会带来哪些新的范式和挑战? 自然语言处理基础 让计算机理解人类语言,图灵测试就是基于对话的方式。 研究历史&#xff…

SpringBoot:详解依赖注入和使用配置文件

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、&#x1f3…

django后台手机号加密存储

需求: 1 :员工在填写用户的手机号时,直接填写,在django后台中输入 2:当员工在后台确认要存储到数据库时,后台将会把手机号进行加密存储,当数据库被黑之后,手机号字段为加密字符 3&am…

青少年的敏感心理

这几天的某个闲暇时刻,突然想起一个有意思的话题。关于青少年的心理,尤其是青春期的心理,这是敏感的一种心理状态。 依稀记得那大概是初一或者是更低年级的样子,当时父母外出务工,高中以前都是和奶奶一起长大。具体事…

数据科学与大数据导论期末复习笔记(大数据)

来自于深圳技术大学,此笔记涵盖了期末老师画的重点知识,分享给大家。 等深分箱和等宽分箱的区别:等宽分箱基于数据的范围来划分箱子,每个箱子的宽度相等。等深分箱基于数据的观测值数量来划分箱子,每个箱子包含相同数量…

跟着cherno手搓游戏引擎【8】按键和鼠标的KeyCode

自定义KeyCode 先把glfw3.h里的KeyCode的定义抄到咱这里来。 在YOTO下创建KeyCode.h: #pragma once#ifdef YT_PLATFORM_WINDOWS///从glfw3中拿的 #define YT_KEY_SPACE 32 #define YT_KEY_APOSTROPHE 39 /* */ #define YT_KEY_COMMA 44…

Video 不支持微信小程序的show-bottom-progress属性

原文地址:Video 不支持微信小程序的show-bottom-progress属性-鹭娃网络 相关平台 微信小程序 小程序基础库: 2.20.1使用框架: React 复现步骤 import { Video} from tarojs/components; 渲染一个Video播放视频,无法隐藏手机屏幕最底部的进度条&#…

springcloud Alibaba中gateway和sentinel联合使用

看到这个文章相信你有一定的sentinel和gateway基础了吧。 官网的gateway和sentinel联合使用有些过时了,于是有了这个哈哈,给你看看官网的: 才sentinel1.6,现在都几了啊,所以有些过时。 下面开始讲解: 首先…

day02_计算机常识丶第一个程序丶注释丶关键字丶标识符

计算机常识 计算机如何存储数据 计算机世界中只有二进制。那么在计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。 进制 进制也就是进位计数制,是人为定义的带进位的计数方法 实例: // 在java 中 可以使用不同…
最新文章