NLP特征提取的惊人历史演变

NLP特征提取的惊人演变

  • 1.理解特征提取
  • 2. 文本表示的演变
    • 2.1.词袋的简单性
    • 2.2. N-Gram 模型的进步
    • 2.3. TF-IDF 的崛起
  • 3. 深入研究词嵌入
    • 3.1.探索 Word2Vec
    • 3.2.深入了解 GloVe
    • 3.3.深入研究 FastText
  • 4. 上下文嵌入的影响
    • 4.1 ELMo 的突破
    • 4.2 理解 BERT 的机制
    • 4.3 Transformer的出现
  • 结语

1.理解特征提取

特征提取是自然语言处理(NLP)中的一个关键过程。它将原始数据转换为结构化格式,使机器学习算法能够高效工作。词嵌入是一种复杂的特征提取形式,能够捕捉单词之间的语义关系。

让我们从基础开始。BoW(Bag-of-Words) 模型将文本表示为一个无序的单词集合,忽略语法和单词顺序。这种简单性既是它的优点也是它的局限。在此基础上改进的 n-gram 模型考虑了 ‘n’ 个单词的序列,捕捉更多的上下文信息。然而,它仍然无法完全反映单词的语义。TF-IDF(Term Frequency-Inverse Document Frequency ) 方法根据单词的重要性进行加权。它是基于一组文档计算的,反映了一个单词对于特定文档的相关性

现在,谈到词嵌入。它们是由实数构成的稠密向量,每个维度表示一个单词的潜在特征。流行的模型包括 Word2VecGloVe(Global Vectors for Word Representation)FastText。这些模型从大量文本数据中学习单词关联,能够捕捉复杂的单词关系,如同义词和反义词。

最后,像 ELMo(Embeddings from Language Models)BERT 这样的上下文嵌入考虑了上下文,每个单词的表示根据周围文本而变化,这导致了对语言细微差别的更深理解。


2. 文本表示的演变

文本表示经历了显著的变革,从简单模型发展到复杂结构。最初,NLP 中的特征提取依赖于词袋模型。这种模型将文本视为一个无序的单词集合,忽略语法和单词顺序但保留了多样性。

词袋模型虽然简单,但常常导致稀疏和高维数据。它对小型数据集有效,但难以处理语言的细微差别。为了解决这个问题,N-Gram 模型被开发出来,考虑了 ‘N’ 个单词的序列,从而捕捉了一些上下文。进一步的进展导致了 TF-IDF 模型。TF-IDF 根据单词的重要性进行加权,重要性与单词在整个文档集中的频率成反比。这有助于突出文档内容中更为独特的术语。然而,这些方法仍然缺乏语义理解。词嵌入的出现是特征提取的突破。词嵌入是单词的稠密向量表示,能够捕捉单词的意义、细微差别及其与其他单词的关系。它们在大型语料库上训练,能够理解上下文和语义相似性。

Word2VecGloVe 等模型在推动词嵌入方面发挥了重要作用。Word2Vec 使用神经网络从大数据集中学习单词关联,而 GloVe 结合了矩阵分解和基于上下文的学习。这两个模型显著改善了机器对人类语言的理解方式。

随着 NLP 的不断发展,我们见证了上下文嵌入的兴起。与传统嵌入不同,上下文模型如 ELMoBERTTransformer 架构考虑了句子或段落的整体上下文。这允许更细致的理解,并在语言建模中树立了新标准。

总之,NLP 中文本表示的演变对于该领域的进展至关重要。从简单的词袋模型到复杂的词嵌入及其更高形式,这些进步为机器更准确和更人性化的语言处理铺平了道路。

2.1.词袋的简单性

自然语言处理 (NLP) 中的特征提取对于将文本转换为算法可以处理的格式至关重要。词袋 (BoW) 模型是完成此任务的一种简单而强大的方法。它涉及以下步骤:

# 通过sklearn库创建一个 Bag-of-Words 模型
from sklearn.feature_extraction.text import CountVectorizer  
  
# 例文 
documents = ["Text analytics with Python", "Python for data science"]  
  
# 创建 BoW 模型  
vectorizer = CountVectorizer()  
bow_matrix = vectorizer.fit_transform(documents)  
  
# 查看 BoW   
print(bow_matrix.toarray())

词袋模型(BoW)将文本转换为一个词频矩阵。它忽略了语法和单词顺序,仅关注单词的出现频率。虽然这种简单性是它的优点,但也是它的局限,因为上下文和语义丢失了。

随着我们迈向更复杂的词嵌入,记住词袋模型为未来特征提取的进步奠定了基础是很重要的。

2.2. N-Gram 模型的进步

N-Gram 模型显著推动了自然语言处理(NLP)中特征提取的发展。这些模型将 n 个单词的序列视为一个单一特征,从而捕捉到了词袋模型中常常被忽视的上下文信息
请添加图片描述

以下是它们如何增强文本表示的方法:

首先,N-Gram 模型在一定程度上保留了单词顺序。例如,一个二元模型(n=2)会将“not good”与“good”区别对待。这个简单的变化允许对文本情感和意义的更细致理解。

其次,N-Gram 模型易于实现。以下是一个简单的 Python 示例,用于构建一个二元模型:

def generate_bigrams(text):  
	tokens = text.split()  
	bigrams = zip(tokens, tokens[1:])  
	return [" ".join(bigram) for bigram in bigrams]

最后,N-Gram 模型为更复杂的算法奠定了基础。它们是迈向更复杂词嵌入的垫脚石,我们将在接下来的部分中探讨这些嵌入。

虽然 N-Grams 增加了上下文,但它们也增加了特征空间的维度,这可能是一个缺点。然而,它们对文本表示演变的贡献是不可否认的,为 TF-IDF 和词嵌入等更先进的技术铺平了道路。

2.3. TF-IDF 的崛起

词频-逆文档频率(TF-IDF)作为一种统计测量方法出现,用于评估单词在文档集合或语料库中的重要性。它通过一种更精细的方法增强了词袋模型在 NLP 中的特征提取能力。

请添加图片描述

TF-IDF 由两个部分组成:

  • 词频(TF):一个单词在文档中出现的频率,表明其重要性。
  • 逆文档频率(IDF):缩减在多个文档中频繁出现的单词的权重。

结合起来,TF-IDF 突出了在单个文档中频繁出现但在多个文档中不常见的单词。这有助于区分文档中术语的重要性。

在 Python 中使用 scikit-learn 库实现 TF-IDF 非常简单。以下是一个基本的设置示例:

# 计算 TF-IDF  
from sklearn.feature_extraction.text import TfidfVectorizer  
documents = ['your document text here']  
vectorizer = TfidfVectorizer()  
tfidf_matrix = vectorizer.fit_transform(documents)

理解 TF-IDF 对于在 NLP 中的进步至关重要,它是迈向掌握语言模式细微差别的垫脚石,为更复杂的模型如词嵌入做好准备。


3. 深入研究词嵌入

词嵌入是自然语言处理(NLP)中特征提取的一种形式。它们将文本转换为机器可以理解的数值向量。与简单模型不同,词嵌入能够捕捉单词之间的语义关系。

让我们来探讨一些流行的模型:

Word2Vec 使用神经网络从大型数据集中学习单词关联。它有两种变体:CBOW(Continuous Bag of Words)Skip-Gram
CBOW根据 上下文预测一个单词
请添加图片描述

上图是CBOW

而 Skip-Gram 则相反,根据一个词来预测周围的词

请添加图片描述

上图是Skip-Gram
#  Word2Vec 的代码片段 
from gensim.models import Word2Vec  
sentences = [['word1', 'word2', 'word3'], ['word2', 'word3']]  
model = Word2Vec(sentences, min_count=1)

GloVe,全称为全球词向量,是另一种方法,侧重于整个语料库中的单词共现。其嵌入反映了两个单词一起出现的概率

#  GloVe  的代码片段  
import glove  
from glove import Corpus, Glove  
corpus = Corpus()  
corpus.fit(sentences, window=10)  
glove = Glove(no_components=100, learning_rate=0.05)  
glove.fit(corpus.matrix, epochs=30, no_threads=4, verbose=True)  
glove.add_dictionary(corpus.dictionary)

FastText 扩展了 Word2Vec考虑了子词信息。这有助于在形态丰富的语言或拼写错误的单词中捕捉意义。

# FastText 的代码片段    
from gensim.models import FastText  
model_ft = FastText(sentences, size=100, window=5, min_count=5, workers=4, sg=1)

这些模型革命性地改变了我们在计算系统中理解和处理语言的方式,带来了更细致和有效的 NLP 应用。

3.1.探索 Word2Vec

Word2Vec 是 NLP 特征提取中的关键一步。它将单词转换为数值形式,使机器能够理解我们的语言。让我们深入了解如何利用 Word2Vec 进行 NLP 任务。
请添加图片描述

首先,安装提供 Word2Vec 实现的 gensim 库

pip install gensim

接下来,导入 Word2Vec 并使用语料库训练模型:

from gensim.models import Word2Vec  
sentences = [['this', 'is', 'the', 'first', 'sentence'], ['this', 'is', 'the', 'second', 'sentence']]  
model = Word2Vec(sentences, min_count=1)

训练完成后,可以获得语料库中任何单词的词嵌入:

vector = model.wv['sentence']

Word2Vec 提供了两种架构:CBOW(连续词袋模型)和 Skip-Gram。

以下是指定架构的方法:

cbow_model = Word2Vec(sentences, min_count=1, sg=0)  
skipgram_model = Word2Vec(sentences, min_count=1, sg=1)

使用 Word2Vec,我们在特征提取方面迈出了重要的一步。这些词嵌入捕捉了语义关系,丰富了 NLP 应用。

3.2.深入了解 GloVe

GloVe,全称为全球词向量,是 NLP 领域中一种强大的特征提取方法。它结合了两大模型家族的优点:全局矩阵分解局部上下文窗口方法
请添加图片描述

以下是如何理解和利用 GloVe:

首先,GloVe 构建了一个大型矩阵,捕捉单词在上下文中共现的频率。这个矩阵提供了语料库中单词使用的全局统计信息。与词袋模型不同,词袋模型将每个文档独立对待,而 GloVe 在共享空间中捕捉单词之间的关系。

以下是加载预训练 GloVe 嵌入的简单 Python 代码示例:

import numpy as np  
  
def load_glove_embeddings(path):  
	with open(path, 'r', encoding='utf-8') as f:  
	words, embeddings = zip(*[line.strip().split(' ', 1) for line in f])  
	word_to_index = {word: idx for idx, word in enumerate(words)}  
	embeddings_matrix = np.array([np.fromstring(embed, sep=' ') for embed in embeddings])  
	return word_to_index, embeddings_matrix  
  
glove_path = 'path/to/glove.txt'  
word_to_index, embeddings_matrix = load_glove_embeddings(glove_path)

加载后,这些嵌入可以用于将文本数据转换为数值形式,使其准备好用于各种机器学习模型。像 GloVe 这样的词嵌入的优势在于它们能够捕捉语义意义,并在多维空间中关联单词。

请记住,虽然 GloVe 为特征提取提供了坚实的基础,但为优化性能,需要根据具体的 NLP 任务进行调整。。

3.3.深入研究 FastText

FastText 是 NLP 中一个强大的特征提取工具,它扩展了 Word2Vec 模型,考虑了子词信息。这种方法使 FastText 能够捕捉较短单词的意义,并理解词缀和前缀,使其在具有丰富形态的语言中尤其有用。

以下是使用 Python 的 FastText 的简单示例:

from gensim.models import FastText  
model = FastText(window=3, min_count=1)  
model.build_vocab(sentences=data)  
model.train(sentences=data, total_examples=len(data), epochs=10)

通过将每个单词看作是字符 n-gram 的集合,FastText 能为不常见的单词,甚至是训练过程中未见过的单词生成更好的词嵌入。这相对于传统模型而言是一个显著的优势,因为传统模型无法为词汇表外(OOV)的单词提供向量。

FastText 处理 OOV 单词的能力以及通过内部结构表示每个单词的稳健性,使其成为 NLP 特征提取工具包中的重要补充。


4. 上下文嵌入的影响

上下文嵌入(Contextual Embeddings)彻底改变了我们在自然语言处理(NLP)中理解单词的方式。与传统方法不同,上下文嵌入捕捉到语言的动态特性。这使得基于上下文更深入地理解单词的含义成为可能。

这一领域的关键进展之一是 ELMo(来自语言模型的嵌入)的开发。ELMo 考虑整个句子来确定单词的意义,它显著提高了各种 NLP 任务的性能。

继 ELMo 之后,BERT(双向编码器表示的转换器)更进一步。BERT 分析单词与句子中所有其他单词的关系,而不是孤立地看待单词。这导致了更细致的语言模型。

Transformer模型,如 BERT,使用注意力机制来衡量句子中所有单词的相关性。这对 NLP 中的特征提取来说是一个革命性的变化。它使得预测更加准确,并且更好地理解语言的细微差别。

这些进步为更复杂的 NLP 应用铺平了道路。它们改进了机器翻译、问答系统和文本摘要。词嵌入现在能够提供更丰富的文本数据表示。

在将这些技术整合到工作中时,请记住上下文的力量。单词的意义不仅在于它们本身,还在于它们的使用方式。

# 使用 BERT 提取特征
from transformers import BertModel, BertTokenizer  
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')  
model = BertModel.from_pretrained('bert-base-uncased')  
  
# 分词和特征提取 
inputs = tokenizer("Hello, how are you?", return_tensors="pt")  
outputs = model(**inputs)

通过利用这些模型,可以提取真正掌握语言本质的特征。这对于构建能够更有效地理解人类语言的健全 NLP 系统至关重要。

4.1 ELMo 的突破

ELMo代表了自然语言处理(NLP)中特征提取的一个重大进步。该技术利用深度上下文化的词嵌入来捕捉语法和语义,以及多义性——具有多重含义的单词。
请添加图片描述

与传统嵌入不同,ELMo 在分析单词时考虑了周围文本的上下文,从而实现了更丰富的理解。以下是 Python 中的一个简化示例:

from allennlp.modules.elmo import Elmo, batch_to_ids  
  
# 初始化 ELMo  
options_file = 'elmo_options.json'  
weight_file = 'elmo_weights.hdf5'  
elmo = Elmo(options_file, weight_file, num_output_representations=1)  
  
# 例句  
sentences = [['I', 'have', 'a', 'green', 'apple'], ['I', 'have', 'a', 'green', 'thumb']]  
  
# 转化为特征索引  
character_ids = batch_to_ids(sentences)  
  
# 得到 ELMo 编码  
embeddings = elmo(character_ids)

ELMo 的动态词嵌入是一个游戏规则改变者,提供了反映不同上下文中不同意义的细致词表示。这为更复杂的 NLP 应用铺平了道路,提升了特征提取及其他任务的性能。

4.2 理解 BERT 的机制

BERT在特征提取和词嵌入方面是一种突破性的方法。它彻底改变了机器理解人类语言的方式。通过在大规模语料库上进行预训练,BERT 捕捉到了复杂的模式和细微差别。

请添加图片描述

BERT 的核心机制依赖于Transformer架构。与之前的模型不同,它处理单词时考虑了句子中所有其他单词的关系,而不是逐个处理。这使得对上下文的理解更为深入。

#  BERT 分词器
from transformers import BertTokenizer  
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')  
tokens = tokenizer.tokenize("Hello, how are you?")  
print(tokens)

这种上下文词嵌入意味着单词“bank”在“river bank”和“savings bank”中的表示会有所不同。这种细微差别对于在复杂的 NLP 任务中进行准确的特征提取至关重要。

4.3 Transformer的出现

转换器模型彻底改变了自然语言处理(NLP)领域。它引入了一种完全依赖自注意力机制的新颖架构,消除了对循环层的需求。这一改变允许了前所未有的并行化,大大减少了训练时间,并改进了需要理解文本中长距离依赖的任务的性能。

请添加图片描述

特征提取和词嵌入通过转换器获得了新的维度。它们通过处理句子中所有其他单词的关系来捕捉上下文细微差别,而不是孤立地处理单词。这导致了反映语言多义性的嵌入,其中单词的意义可以根据上下文而变化。

以下是使用 Hugging Face 库提取嵌入的一个简单 Python 示例:

from transformers import BertModel, BertTokenizer  
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')  
model = BertModel.from_pretrained('bert-base-uncased')  
inputs = tokenizer("Hello, world!", return_tensors="pt")  
outputs = model(**inputs)

像 BERT 和 GPT 这样的转换器已经为 NLP 中的特征提取设定了新标准,使文本表示更为细致和有效。它们理解上下文的能力为众多应用的进步铺平了道路,从机器翻译到情感分析。

结语

特征提取技术在NLP中的演变,从词袋模型到现代的上下文嵌入,极大地提升了机器对语言的理解能力。通过利用如Word2Vec、GloVe和BERT等模型,NLP应用能够更准确地捕捉语义和上下文细节。这些进步为更复杂的语言处理任务铺平了道路,推动了NLP领域的持续发展!

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

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

相关文章

ctfshow-web入门-命令执行(web71-web74)

目录 1、web71 2、web72 3、web73 4、web74 1、web71 像上一题那样扫描但是输出全是问号 查看提示:我们可以结合 exit() 函数执行php代码让后面的匹配缓冲区不执行直接退出。 payload: cvar_export(scandir(/));exit(); 同理读取 flag.txt cinclud…

[数据集][目标检测]电缆钢丝绳线缆缺陷检测数据集VOC+YOLO格式1800张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1800 标注数量(xml文件个数):1800 标注数量(txt文件个数):1800 标注…

uniapp H5端使用百度地图

1、登录百度地图开放平台 https://lbsyun.baidu.com/(没有账号则先去创建一个百度账号) 2、进入百度地图开放平台控制台(导航栏“控制台”),点击“应用管理”-“我的应用” 3、选择“创建应用”,应用模块选…

[图解]企业应用架构模式2024新译本讲解19-数据映射器1

1 00:00:01,720 --> 00:00:03,950 下一个我们要讲的就是 2 00:00:04,660 --> 00:00:07,420 数据映射器这个模式 3 00:00:09,760 --> 00:00:13,420 这个也是在数据源模式里面 4 00:00:13,430 --> 00:00:14,820 用得最广泛的 5 00:00:16,250 --> 00:00:19,170…

一、Redis简介

一、Redis介绍与一般应用 1.1 基本了解 Redis全称Remote Dictionary Server(远程字典服务), 是一个开源的高性能键值存储系统,通常用作数据库、缓存和消息代理。使用ANSI C语言编写遵守BSD协议,是一个高性能的Key-Value数据库提供了丰富的数…

2024.07使用gradle上传maven组件到central.sonatype,非常简单

本文基于sonatypeUploader2.0版本 在1.0版本我们还需要手动去添加maven-publish和signing插件,在2.0版本他已经内置了,如果你仍然需要手动配置,你可以手动添加这两个插件及逻辑。 具体信息参考开源仓库: 插件仓库:h…

【Linux】部署NFS服务实现数据共享

👨‍🎓博主简介 🏅CSDN博客专家   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入&#xff01…

(四)Appdesigner-文件存在判断及对话框设计

目录 前言 一、文件存在判断 (一)基础知识 (二)实际操作 二、对话框设计 (一)基础知识 1.提示对话框 2.询问对话框 3.文件选择对话框 (二)实际操作 1.提示对话框 2.询问…

台灯哪个牌子好?学生专用台灯第一品牌推荐

台灯,作为人们生活中不可或缺的存在,每当夜幕缓缓降临,华灯初上,总预示着一个浪漫的夜晚即将揭幕。而灯的意义,远不止于驱散黑夜的阴影,它更擅长为我们的空间带来温暖与慰藉。在众多种类的灯具中&#xff0…

零基础STM32单片机编程入门(五)FreeRTOS实时操作系统详解及实战含源码视频

文章目录 一.概要二.什么是实时操作系统三.FreeRTOS的特性四.FreeRTOS的任务详解1.任务函数定义2.任务的创建3.任务的调度原理 五.CubeMX配置一个FreeRTOS例程1.硬件准备2.创建工程3.调试FreeRTOS任务调度 六.CubeMX工程源代码下载七.讲解视频链接地址八.小结 一.概要 FreeRTO…

Python | 计算位涡平流项

写在前面 最近忙着复习、考试…都没怎么空敲代码,还得再准备一周考试。。。等考完试再慢慢更新了,今天先来浅更一个简单但是使用的python code 在做动力机制分析时,我们常常需要借助收支方程来诊断不同过程的贡献,其中最常见的一…

使用Python绘制极坐标图

使用Python绘制极坐标图 极坐标图极坐标图的优点使用场景 效果代码 极坐标图 极坐标图(Polar Chart)是一种图表类型,用于显示在极坐标系中的数据。极坐标图使用圆形坐标系,角度表示一个变量的值,半径表示另一个变量的…

【Python】利用代理IP爬取当当网数据做数据分析

前言 在数字化浪潮的推动下,电商平台已经彻底改变了我们的购物方式。从简单的在线交易到复杂的用户交互,电商平台积累了海量的用户数据。这些数据,如同隐藏在深海中的宝藏,等待着被发掘和利用。通过分析用户的浏览、搜索、购买等行…

基于人脸68特征点识别的美颜算法(一) 大眼算法 C++

1、加载一张原图&#xff0c;并识别人脸的68个特征点 cv::Mat img cv::imread("5.jpg");// 人脸68特征点的识别函数vector<Point2f> points_vec dectectFace68(img);// 大眼效果函数Mat dst0 on_BigEye(800, img, points_vec);2、函数 vector<Point2f&g…

使用Perplexity打造产品的27种方式

ChatGPT和Perplexity等聊天机器人正迅速成为产品经理的首选助手。以下是一份全面的指南&#xff0c;介绍PM如何在日常工作中使用Perplexity&#xff0c;该指南基于300多份回复和30次电话后的总结。 理解并制定增长战略&#xff1a;例如&#xff0c;解释增长会计的基本原理&…

Docker的理解

Docker的理解 Docker为什么用Docker&#xff1f;1.提升系统资源利用率2.更快速的交付和部署3.高效的部署和扩容4.更简单的管理 Docker核心技术Docker镜像Docker容器Docker仓库 Docker实现原理Linux NamespaceCgroupUnion FS Docker的应用场景1.微服务架构2.持续集成3.快速部署和…

四.iOS核心动画 - 图层的视觉效果

引言 在前几篇博客中我们讨论了图层的frame,bounds,position以及让图层加载图片。但是图层事实上不仅可以显示图片&#xff0c;或者规则的矩形块&#xff0c;它还有一系列内建的特性来创建美丽优雅的页面元素。在这篇博客中我们就来探索一下CALayer的视觉效果。 视觉效果 图…

机器学习环境搭建

前言 个人笔记&#xff0c;记录框架和小问题&#xff0c;没有太详细记载。。 1、Anaconda安装 下载地址&#xff1a; Free Download | Anaconda &#xff08;慢&#xff09; ​ 国内镜像&#xff1a;https://link.csdn.net/?targethttp%3A%2F%2Fitcxy.xyz%2F241.html 下载…

五国如何实现关键基础设施保护方法的现代化

本叙述介绍了关键基础设施面临的不断演变的风险,并讨论了关键五国(澳大利亚、加拿大、新西兰、英国和美国)如何实现关键基础设施保护方法的现代化。它还确定了加强国内关键基础设施安全性和弹性的共同方法,同时认识到鉴于关键基础设施的相互关联性,国际社会需要采取合作和…

【H.264】五分钟入门H.264协议

<> 博客简介&#xff1a;Linux、rtos系统&#xff0c;arm、stm32等芯片&#xff0c;嵌入式高级工程师、面试官、架构师&#xff0c;日常技术干货、个人总结、职场经验分享   <> 公众号&#xff1a;嵌入式技术部落   <> 系列专栏&#xff1a;C/C、Linux、rt…