【NLP】Word2Vec原理和认识

一、介绍

        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建筑。图像取自向量空间中单词表示的有效估计

五、连续k-gram模型

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

为k-gram模型生成训练数据的示例

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

Skip-Gram 模型体系结构

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

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

六、具体实现

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

6.1 数据

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

6.2 要求(reqiement.txt)

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 

        注意: 由于我们正在使用 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

6.3 预处理数据

# 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)

6.4 停用词过滤说明

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

七、嵌入方式

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 模型将采用各种单词并尝试预测缺失的单词。

     

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

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

相关文章

基于B/S架构SaaS服务的实验室信息系统(LIS)

实验室信息系统LIS源码 实验室信息系统&#xff08;Laboratory Information System&#xff09;&#xff0c;简称LIS&#xff0c;是一个全面基于网络化应用&#xff0c;能够帮助用户按照规范内容和规范流程进行多角色、多层次检验信息及资源管理的系统。通过条码管理系统从HIS…

云计算的学习(三)

三、云计算中的网络基础知识 1.虚拟化中网络的架构 1.1虚拟化中网络的架构 二层交换机作为接入交换机使用&#xff0c;三层交换机可以作为汇聚交换机或核心交换机&#xff0c;在抛开网络安全设备时&#xff0c;路由器直接连接在互联网上。 1.2广播和单播 物理服务器内部主要…

Iceberg从入门到精通系列之十七:Apache InLong往Iceberg同步数据

Iceberg从入门到精通系列之十七&#xff1a;Apache InLong往Iceberg同步数据 一、概览二、版本支持三、依赖项四、SQL API 用法五、多表写入六、动态表名映射七、动态建库、建表八、动态schema变更九、Iceberg Load 节点参数十、数据类型映射 一、概览 Apache Iceberg是一种用…

Flutter系列文章-Flutter环境搭建和Dart基础

Flutter是Google推出的一个开源的、高性能的移动应用开发框架&#xff0c;可以用一套代码库开发Android和iOS应用。Dart则是Flutter所使用的编程语言。让我们来看看如何搭建Flutter开发环境&#xff0c;并了解Dart语言的基础知识。 一、Flutter环境搭建 1. 安装Flutter SDK …

springboot+ElasticSearch+Logstash+Kibana实现日志采集ELK

ElasticSearchLogstashKibana日志管理 一、什么是ELK? ELK是Elasticsearch、Logstash、Kibana的简称&#xff0c;这三者是核心套件&#xff0c;但并非全部。一般情况下我们可以把日志保存在日志文件当中&#xff0c;也可以把日志存入数据库当中。但随着业务量的增加&#xf…

搭建 Java 部署环境,部署 Web 项目到 Linux

为了进行部署&#xff0c;把写好的 java web 程序放到 Linux 上&#xff0c;需要先把对应的依赖的软件 (环境) 搭建好&#xff0c;安装一些必要的软件程序 JDKTomcatMySqL jdk 直接使用包管理器进行安装(基于yum安装) 一、yum 1、认识 yum yum (Yellow dog Updater, Modified…

6. Java + Selenium 环境搭建

前提&#xff1a;Java 版本最低要求为 8&#xff1b;推荐使用 chrome 浏览器 chrome Java 1. 下载 chrome 浏览器&#xff08;推荐&#xff09; 2. 查看 chrome 浏览器版本 重点记住前两位即可。 3. 下载 chrome 浏览器驱动 下载链接&#xff1a; https://chromedriver.…

我爱学QT-仿写智能家居界面 上 中 下

学习链接&#xff1a; 仿写一个智能家居界面&#xff08;上&#xff09;_哔哩哔哩_bilibili 上 给QT工程添加资源文件 在这里 然后选这个&#xff0c;choose后会有起名&#xff0c;之一千万不能是中文&#xff0c;要不就等报错吧 然后把你要添加的图片托到文件夹下&#xf…

云计算基础教程(第2版)笔记——基础篇与技术篇介绍

文章目录 前言 第一篇 基础篇 一 绪论 1.1 云计算的概念以及特征 1.1.1云计算的基本概念 1.1.2云计算的基本特征 1.2 云计算发展简史 1.3 三种业务模式介绍 1. 基础设施即服务&#xff08;IaaS&#xff09; 2. 平台即服务&#xff08;PaaS&#xff09; 3. 软…

F#奇妙游(12):并行编程与π

核越多&#xff0c;越快乐 多核CPU对于计算机程序的开发带来了很大的挑战&#xff0c;但是也带来了很大的机遇。在多核CPU上&#xff0c;程序的性能可以通过并行化来提升&#xff0c;但是并行化的难度也随之提升。本文将介绍多核CPU的基本概念&#xff0c;以及如何在多核CPU上…

OpenCv图像基本变换

目录 一、图像翻转 二、图像旋转 三、仿射变换之平移 四、仿射变换之获取变换矩阵 五、仿射变换之透视变换 一、图像翻转 图像翻转不等同于旋转&#xff0c;类似于一些视频的拍摄&#xff0c;拍摄后实际是左右颠倒的&#xff0c;通过图像翻转可进行还原 案例代码如下: …

Android之Intent

意图介绍 一个意图(Intent)对象包含了目标组件、动作、数据、类别、附加数据、标志六个部分。 目标组件 目标组件可以帮助应用发送显式意图调用请求。在创建Intent时&#xff0c;可以通过setComponent方法来设置一个组件&#xff0c;如&#xff1a; //设置组件 intent.setC…

Linux - CentOS 二进制安装 MySQL 8.0.31(非常实用)

一、下载 mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz 下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 具体如下图所示&#xff1a; 二、将 mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz 放入到服务器的 /usr/local &#xff08;路径可…

C++万字自学笔记

[TOC] 一、 C基础 C的IDE有CLion、Visual Studio、DEV C、eclipse等等&#xff0c;这里使用CLion进行学习。 0. C初识 0.1 第一个C程序 编写一个C程序总共分为4个步骤 创建项目创建文件编写代码运行程序 #include <iostream>int main() {using namespace std;cout…

SpringCloud Alibaba——Ribbon底层怎样实现不同服务的不同配置

目录 一、Ribbon底层怎样实现不同服务的不同配置二、源码角度分析 一、Ribbon底层怎样实现不同服务的不同配置 为不同服务创建不同的spring上下文&#xff0c;不同的spring上下文中存放对应这个服务所有的配置。 二、源码角度分析 SpringClientFactory中可以获取到所有ribbon…

基于MSP432P401R跟随小车(一)【2022年电赛】

文章目录 一、赛前准备1. 硬件清单2. 工程环境 二、赛题思考三、软件设计1. 路程、时间、速度计算2. 距离测量3. 双机通信4. 红外循迹 四、技术交流 一、赛前准备 1. 硬件清单 主控板&#xff1a; MSP432P401R测距模块&#xff1a; GY56数据显示&#xff1a; OLED电机&#x…

7.5 SpringBoot 拦截器Interceptor实战 统一角色权限校验

文章目录 前言一、定义注解annotation二、拦截角色注解1. 在拦截器哪里拦截&#xff1f;2. 如何拦截角色注解&#xff1f;3. 角色如何读取?4. 最后做角色校验 三、应用&#xff1a;给管理员操作接口加注解四、PostMan测试最后 前言 在【7.1】管理员图书录入和修改API&#xf…

原生js实现将图片内容复制到剪贴板

核心代码 /*复制图片*/ copyImg(dom) {/* 警告&#xff1a;dom不能是img标签&#xff0c;建议用DIV标签包裹img标签&#xff0c;否者会报错&#xff01;不支持复制背景图&#xff01; */dom.style.userSelect auto;let selection getSelection(), range document.createRan…

支持向量机(SVM)的超参数调整 C 和 Gamma 参数

作者:CSDN @ _养乐多_ 支持向量机(Support Vector Machine,SVM)是一种广泛应用的监督式机器学习算法。它主要用于分类任务,但也适用于回归任务。在本文中,我们将深入探讨支持向量机的两个重要参数:C和gamma。在阅读本文前,我假设您对该算法有基本的了解,并专注于这些…

从网络安全行业人才需求讲讲【个人规划】

如果你是一名正在找工作的网络安全方向大学生&#xff0c;或者是刚刚踏入网络安全领域的新手&#xff0c;这篇文章很适合你&#xff0c;如果你是一名老网安人&#xff0c;看看有哪些你中招了。 当你打开BOSS直聘、拉钩等招聘类网站后&#xff0c;在首页的快速导航页面很难找到关…