【NLP】Word2Vec原理和认识

news2024/11/26 4:34:16

一、介绍

        Word2Vec是NLP领域的最新突破。Tomas Mikolov是捷克计算机科学家,目前是CIIRC(捷克信息学,机器人和控制论研究所)的研究员,是word2vec研究和实施的主要贡献者之一。词嵌入是解决NLP中许多问题不可或缺的一部分。它们描绘了人类如何向机器理解语言。您可以将它们想象为文本的矢量化表示形式。Word2Vec是一种生成词嵌入的常用方法,具有多种应用,例如文本相似性,推荐系统,情感分析等。

二、什么是词嵌入?

        在我们进入word2vec之前,让我们了解什么是单词嵌入。了解这一点很重要,因为word2vec的总体结果和输出将是与通过算法传递的每个唯一单词相关联的嵌入。

        词嵌入是一种将单个单词转换为单词的数字表示(向量)的技术。其中每个单词映射到一个向量,然后以类似于神经网络的方式学习该向量。向量试图捕捉该词相对于整个文本的各种特征。这些特征可以包括单词的语义关系、定义、上下文等。使用这些数字表示形式,您可以做很多事情,例如识别单词之间的相似性或相似性。

        显然,这些是机器学习各个方面的不可或缺的输入。机器无法处理原始形式的文本,因此将文本转换为嵌入将允许用户将嵌入提供给经典的机器学习模型。最简单的嵌入是文本数据的一次热编码,其中每个向量将映射到一个类别。

For example: have = [1, 0, 0, 0, 0, 0, ... 0]
a    = [0, 1, 0, 0, 0, 0, ... 0]
good = [0, 0, 1, 0, 0, 0, ... 0]
day  = [0, 0, 0, 1, 0, 0, ... 0] ...

        但是,像这样的简单嵌入存在多种限制,因为它们不能捕获单词的特征,并且根据语料库的大小,它们可能非常大。

三、Word2Vec 架构

        Word2Vec的有效性来自于它能够将相似单词的向量组合在一起。给定足够大的数据集,Word2Vec可以根据单词在文本中的出现对单词的含义进行强有力的估计。这些估计值产生与语料库中其他单词的单词关联。例如,像“国王”和“女王”这样的词会非常相似。在对词嵌入进行代数运算时,您可以找到词相似性的近似值。例如,“国王”的二维嵌入向量 - “男人”的二维嵌入向量+“女人”的二维嵌入向量产生了一个非常接近“女王”嵌入向量的向量。请注意,以下值是任意选择的。

King    -    Man    +    Woman    =    Queen
[5,3]   -    [2,1]  +    [3, 2]   =    [6,4]  

你可以看到国王和王后这两个词在位置上彼此接近。(图片由作者提供)

有两种主要的架构可以带来word2vec的成功。skip-gram 和 CBOW 架构。

四、CBOW(连续词袋)

        这种架构与前馈神经网络非常相似。此模型体系结构实质上是尝试从上下文单词列表中预测目标单词。这个模型背后的直觉很简单:给定一个短语,我们将选择我们的目标词是“a”,我们的上下文词是[“有”,“很棒”,“日”]。该模型将要做的是采用上下文词的分布式表示来尝试预测目标词。"Have a great day"

        

CBOW建筑。图像取自向量空间中单词表示的有效估计

五、连续跳克模型

        skip-gram 模型是一个简单的神经网络,其中包含一个经过训练的隐藏层,以预测当输入单词存在时给定单词存在的概率。直观地,您可以想象 skip-gram 模型与 CBOW 模型相反。在此体系结构中,它将当前单词作为输入,并尝试准确预测当前单词之前和之后的单词。该模型本质上是尝试学习和预测指定输入词周围的上下文词。基于评估该模型准确性的实验,发现在大范围的词向量下,预测质量有所提高,但也增加了计算复杂性。该过程可以直观地描述,如下所示。

        

为跳克模型生成训练数据的示例。窗口大小为 3。图片由作者提供

如上所示,给定一些文本语料库,在某个滚动窗口中选择一个目标单词。训练数据由该目标单词和窗口中所有其他单词的成对组合组成。这是神经网络的结果训练数据。一旦模型被训练,我们基本上可以产生一个单词是给定目标的上下文单词的概率。下图显示了 skip-gram 模型的神经网络体系结构。

Skip-Gram 模型体系结构(图片由作者提供)

语料库可以表示为大小为 N 的向量,其中 N 中的每个元素对应于语料库中的一个单词。在训练过程中,我们有一对目标词和上下文词,输入数组在除目标词之外的所有元素中都将为 0。目标字将等于 1。隐藏层将学习每个单词的嵌入表示,产生 d 维嵌入空间。输出层是具有softmax激活功能的密集层。输出层基本上将产生与输入大小相同的向量,向量中的每个元素将包含一个概率。此概率表示语料库中目标词和关联词之间的相似性。

有关这两种模型的更详细概述,我强烈建议阅读此处概述这些结果的原始论文。

实现

我将展示如何使用word2vec生成词嵌入,并使用这些嵌入来查找相似的单词并通过PCA可视化嵌入。

数据

出于本教程的目的,我们将使用莎士比亚数据集。你可以在这里找到我用于本教程的文件,它包括莎士比亚为他的戏剧写的所有台词。

要求

<span style="background-color:#f2f2f2"><span style="color:#292929">nltk==3.6.1
node2vec==0.4.3
pandas==1.2.4
matplotlib==3.3.4
gensim==4.0.1
scikit-learn=0.24.1</span></span>

注意: 由于我们正在使用 NLTK,因此您可能需要下载以下语料库才能使用本教程的其余部分。这可以通过以下命令轻松完成:

import nltk
nltk.download('stopwords')
nltk.download('punkt') 

import pandas as pd
import nltk
import string
import matplotlib.pyplot as plt

from nltk.corpus import stopwords
from nltk import word_tokenize
from gensim.models import Word2Vec as w2v
from sklearn.decomposition import PCA

# constants
PATH = 'data/shakespeare.txt'
sw = stopwords.words('english')
plt.style.use('ggplot')
# nltk.download('punkt')
# nltk.download('stopwords')

# import data
lines = []
with open(PATH, 'r') as f:
    for l in f:
        lines.append(l)

注意:将变量更改为您正在使用的数据的路径。PATH

预处理数据

# remove new lines
lines = [line.rstrip('\n') for line in lines]

# make all characters lower
lines = [line.lower() for line in lines]

# remove punctuations from each line
lines = [line.translate(str.maketrans('', '', string.punctuation)) for line in lines]

# tokenize
lines = [word_tokenize(line) for line in lines]

def remove_stopwords(lines, sw = sw):
    '''
    The purpose of this function is to remove stopwords from a given array of 
    lines.
    
    params:
        lines (Array / List) : The list of lines you want to remove the stopwords from
        sw (Set) : The set of stopwords you want to remove
        
    example:
        lines = remove_stopwords(lines = lines, sw = sw)
    '''
    
    res = []
    for line in lines:
        original = line
        line = [w for w in line if w not in sw]
        if len(line) < 1:
            line = original
        res.append(line)
    return res
    
filtered_lines = remove_stopwords(lines = lines, sw = sw)

停用词过滤说明

  • 请注意,从这些行中删除的停用词是现代词汇。应用程序和数据对于清理单词所需的预处理策略类型具有高度重要性。
  • 在我们的场景中,像“你”或“你自己”这样的词会出现在停用词中并从行中删除,但是由于这是莎士比亚的文本数据,因此不会使用这些类型的词。相反,删除“你”或“你自己”可能是有用的。保持对这些类型的微型更改的热衷,因为它们会对好模型与差模型的性能产生巨大差异。
  • 出于此示例的目的,我不会在识别来自不同世纪的停用词时进行极端细节,但请注意您应该这样做。

嵌入

w = w2v(
    filtered_lines,
    min_count=3,  
    sg = 1,       
    window=7      
)       

print(w.wv.most_similar('thou'))

emb_df = (
    pd.DataFrame(
        [w.wv.get_vector(str(n)) for n in w.wv.key_to_index],
        index = w.wv.key_to_index
    )
)
print(emb_df.shape)
emb_df.head()

 嵌入上的 PCA

pca = PCA(n_components=2, random_state=7)
pca_mdl = pca.fit_transform(emb_df)

emb_df_PCA = (
    pd.DataFrame(
        pca_mdl,
        columns=['x','y'],
        index = emb_df.index
    )
)

plt.clf()
fig = plt.figure(figsize=(6,4))

plt.scatter(
    x = emb_df_PCA['x'],
    y = emb_df_PCA['y'],
    s = 0.4,
    color = 'maroon',
    alpha = 0.5
)

plt.xlabel('PCA-1')
plt.ylabel('PCA-2')
plt.title('PCA Visualization')
plt.plot()

         Tensorflow为word2vec模型做了一个非常漂亮,直观和用户友好的表示。我强烈建议您探索它,因为它允许您与word2vec的结果进行交互。

结束语

        词嵌入是解决NLP中许多问题的重要组成部分,它描述了人类如何向机器理解语言。给定一个大型文本语料库,word2vec 生成一个与语料库中每个单词关联的嵌入向量。这些嵌入的结构使得具有相似特征的单词彼此非常接近。CBOW(连续词袋)和skip-gram模型是与word2vec相关的两个主要架构。给定一个输入单词,skip-gram 将尝试预测输入上下文中的单词,而 CBOW 模型将采用各种单词并尝试预测缺失的单词。

     

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vscosde中写html的速写规则和快捷键

目录 vsCode速写规则! enter 生成html框架ctrl / 注释生成html元素&#xff1a;直接写html&#xff0c;enter直接生成 并且添加内容批量生成> 元素嵌套 同级生成每个元素都有的属性. class # id样式放入css中 link 连接快速使用样式优先级 vsCode速写规则 ! enter 生成h…

运输层:TCP的运输连接管理

1.运输层&#xff1a;TCP的运输连接管理 笔记来源&#xff1a; 湖科大教书匠&#xff1a;TCP的连接建立 湖科大教书匠&#xff1a;TCP的连接释放 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 TCP是面向连接的协议&#xff0c;它基于运输连接来传…

易查分怎么上传成绩?学会这个技巧,轻松搞定

当使用易查分制作查询系统时&#xff0c;许多老师可能对于如何上传成绩感到困惑。有时候&#xff0c;导入成绩到易查分系统后&#xff0c;信息可能无法完全显示&#xff0c;而且也很难找到错误的原因。因此&#xff0c;今天我将与老师们分享一下易查分上传成绩的方法。这个技巧…

word自动编号变黑块的亲测解决方案

具体问题如下&#xff1a; 出现这种情况就是word的自动编号字体出错&#xff0c;可以在word中运行脚本来解决&#xff1a; Sub repair()For Each templ In ActiveDocument.ListTemplates For Each lev In templ.ListLevels lev.Font.Reset Next lev Next templEnd Sub代码如上…

二十三种设计模式第十三篇--享元模式

享元模式&#xff0c;主要就是一种池化方案&#xff0c;主要用于创建对象的数量&#xff0c;以减少内存占用和提高性能。这种类型的设计模式属于结构型模式&#xff0c;它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式&#xff0c;尝试重用现有的同类对象&a…

ros2 c++实现JY_95T IMU解算三轴 加速度 角速度 欧拉角 磁力计 四元数

起因&#xff0c;机器人建图导航程序需要做里程计 imu数据融合&#xff0c;需要填充imu数据&#xff0c;但对imu填充的数据一直不是很了解&#xff0c;并且正在学习c的类与对象&#xff0c;新近入手了一款JY_95T IMU&#xff0c;没有ros2的c实现&#xff0c;所幸就拿它练练手&a…

Cocos2dx学习笔记:浅谈游戏内的适配方案

前言 本篇在讲什么 Cocos2dx中的适配方案 本篇适合什么 适合初学Cocos的小白 本篇需要什么 对Lua语法有简单认知 依赖Cocos2dx3.15环境 依赖Sublime Text编辑器 依赖VS 2015编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手…

vue基于SpringBoot的智慧城市社区生活分类信息管理系统的设计与实现_2p760

表名&#xff1a;dongwuzhonglei 功能&#xff1a;动物种类 字段名称 类型 长度 字段说明 主键 默认值 id bigint 主键 主键 addtime timestamp 创建时间 CURRENT_TIMESTAMP dongwuzhonglei varchar 200 动物种类 …

防止video视频被下载的几种处理办法

1&#xff0c;video禁用下载功能 <video controlslist"nodownload"></video>2&#xff0c;隐藏鼠标右键&#xff0c;禁止复制链接 document.oncontextmenu function () {return false; }3&#xff0c;使用云点播等第三方播放控件&#xff0c;最好的话…

图像增强算法Retinex原理与实现详解

文章目录 1. 引言2. Retinex算法原理2.1 单尺度Retinex示例代码 2.2 多尺度Retinex示例代码 2.3 颜色恢复示例代码 2.4 最终图像处理代码示例 3. Retinex算法的Python实现4. 完结 1. 引言 图像增强是图像处理中的重要技术之一&#xff0c;它可以改善图像的亮度、对比度和颜色等…

微信开发者工具模拟器中不显示鼠标问题

前言 在使用微信开发者工具开发微信小程序时&#xff0c;使用到了第二屏幕&#xff0c;在第一屏幕上&#xff0c;微信开发者工具模拟器中&#xff0c;可以正常显示鼠标&#xff0c;而在第二屏幕上不显示鼠标。 解决方案&#xff1a; 方案1&#xff1a;设置指针轨迹&#xff…

【JMeter分布式压测连接Jenkins生成测试报告报错:Data exporter “html“ is unable to export data】

An error occurred: Data exporter “html” is unable to export data. Build step “Execute shell” marked build as failure 发生了一个错误:数据导出器“html”无法导出数据。 构建步骤“执行shell”将构建标记为失败 查看JMeter-master日志jmeter.log 发现是由于没有r…

基于springboot+vue的文物收藏系统(源代码+数据库+13000字论文)082

基于springbootvue的文物收藏系统(源代码数据库13000字论文)082 一、系统介绍 本项目前后端分离(本项目有ssmvue版本) 本系统分为管理员、用户两种角色 用户角色包含以下功能&#xff1a; 登录、文物查看、文物资料下载、文物收藏管理、文物维护管理、文物封存管理、个人中…

赛效:电子书可以转换成TXT吗

1&#xff1a;在“其他功能”菜单里点击“电子书转TXT”。 2&#xff1a;点击页面中间的号或者拖拽电子书上传。常规格式的电子书&#xff0c;都可以上传。 3&#xff1a;文件添加成功后&#xff0c;点击右下角的“开始转换”。 4&#xff1a;文件转换成功后&#xff0c;点击下…

Vue element admin git安装失败-2023年7月6日

Vue element admin-2023年7月6日 Vue element admin官网安装失败&#xff0c;是由于依赖包&#xff0c;所nodejs要求版本很低&#xff0c;导致和新版的18、16版本不兼容&#xff0c;git下安装失败。解决办法 Vue element admin官网 https://panjiachen.gitee.io/vue-element-a…

大数据的薪资怎么样?是真的很高么

既然提到了数据的问题&#xff0c;其实不妨看一下各大招聘平台在不同城市给出的薪资&#xff0c;百闻不如一见&#xff0c;自己真正看到了就知道能拿多少了。当然&#xff0c;是否能高薪&#xff0c;很大一部分还是取决于自身的能力的 猎聘大数据研究院发布了《2022未来人才就…

【yolov5】训练自己的数据集-实践笔记

【yolov5】训练自己的数据集-实践笔记 使用yolov5训练自己的数据集&#xff0c;以RSOD数据集为例&#xff0c;图像数量976&#xff0c;一共四类。 yolov5源码&#xff1a;https://github.com/ultralytics/yolov5 官网的代码会一直更新&#xff0c;相关依赖环境也会变&#xf…

嵌套和递归使用模板类

嵌套和递归使用模板类 模板栈模板数组栈中嵌套数组数组中嵌套栈数组中嵌套数组 模板栈 #pragma once #include <iostream> // 包含头文件。 using namespace std; // 指定缺省的命名空间。template<class DataType> class mystack2 { private:Data…

Java面向对象程序开发——文件与流

文章目录 前言File类IO字符流与字节流字符流字节流打印流缓冲流 前言 File类 是文件和目录路径名的抽象表示&#xff0c;主要用于文件和目录的创建、查找和删除等操作。 方法有三类&#xff1a;1获取、2判断、3创建或删除 public String getAbsolutePath() &#xff1a;返回…

ELK部署安装

目录 一、环境准备 1.准备三台服务器&#xff08;带图形化的linuxCentOS7&#xff0c;最小化缺少很多环境&#xff09; 2.修改主机名 3.关闭防火墙 4.elk-node1、elk-node2 用系统自带的java 5.上传软件包到node1和node2 二、部署elasticsearch 1、node1、node2操作 2.no…