深度学习从入门到精通——词向量介绍及应用

词向量介绍

  • 词向量(Word embedding),即把词语表示成实数向量。“好”的词向量能体现词语直接的相近关系。词向量已经被证明可以提高NLP任务的性能,例如语法分析和情感分析。
  • 词向量与词嵌入技术的提出是为了解决onehot的缺陷。它把每个词表示成连续稠密的向量,能较好地表达不同词之间的关联关系。
  • 如果两个词是关联的,那么这两个词分别对应的词向量的余弦相似度越接近于1。如果两个词关联关系比较小,那么这两个词分别对应的词向量的余弦相似度越接近于0.
    在这里插入图片描述

1.1 加载TokenEmbedding

TokenEmbedding()参数

  • embedding_name
    将模型名称以参数形式传入TokenEmbedding,加载对应的模型。默认为w2v.baidu_encyclopedia.target.word-word.dim300的词向量。
  • unknown_token
    未知token的表示,默认为[UNK]。
  • unknown_token_vector
    未知token的向量表示,默认生成和embedding维数一致,数值均值为0的正态分布向量。
  • extended_vocab_path
    扩展词汇列表文件路径,词表格式为一行一个词。如引入扩展词汇列表,trainable=True。
  • trainable
    Embedding层是否可被训练。True表示Embedding可以更新参数,False为不可更新。默认为True。
  • dim300代表该词向量维度大小为300.

这里参考的预训练embedding 包括以下:
在这里插入图片描述

EMBEDDING_NAME_LIST = [# Word2Vec# baidu_encyclopedia"w2v.baidu_encyclopedia.target.word-word.dim300","w2v.baidu_encyclopedia.target.word-character.char1-1.dim300","w2v.baidu_encyclopedia.target.word-character.char1-2.dim300","w2v.baidu_encyclopedia.target.word-character.char1-4.dim300","w2v.baidu_encyclopedia.target.word-ngram.1-2.dim300","w2v.baidu_encyclopedia.target.word-ngram.1-3.dim300","w2v.baidu_encyclopedia.target.word-ngram.2-2.dim300","w2v.baidu_encyclopedia.target.word-wordLR.dim300","w2v.baidu_encyclopedia.target.word-wordPosition.dim300","w2v.baidu_encyclopedia.target.bigram-char.dim300","w2v.baidu_encyclopedia.context.word-word.dim300","w2v.baidu_encyclopedia.context.word-character.char1-1.dim300","w2v.baidu_encyclopedia.context.word-character.char1-2.dim300","w2v.baidu_encyclopedia.context.word-character.char1-4.dim300","w2v.baidu_encyclopedia.context.word-ngram.1-2.dim300","w2v.baidu_encyclopedia.context.word-ngram.1-3.dim300","w2v.baidu_encyclopedia.context.word-ngram.2-2.dim300","w2v.baidu_encyclopedia.context.word-wordLR.dim300","w2v.baidu_encyclopedia.context.word-wordPosition.dim300",# wikipedia"w2v.wiki.target.bigram-char.dim300","w2v.wiki.target.word-char.dim300","w2v.wiki.target.word-word.dim300","w2v.wiki.target.word-bigram.dim300",# people_daily"w2v.people_daily.target.bigram-char.dim300","w2v.people_daily.target.word-char.dim300","w2v.people_daily.target.word-word.dim300","w2v.people_daily.target.word-bigram.dim300",# weibo"w2v.weibo.target.bigram-char.dim300","w2v.weibo.target.word-char.dim300","w2v.weibo.target.word-word.dim300","w2v.weibo.target.word-bigram.dim300",# sogou"w2v.sogou.target.bigram-char.dim300","w2v.sogou.target.word-char.dim300","w2v.sogou.target.word-word.dim300","w2v.sogou.target.word-bigram.dim300",# zhihu"w2v.zhihu.target.bigram-char.dim300","w2v.zhihu.target.word-char.dim300","w2v.zhihu.target.word-word.dim300","w2v.zhihu.target.word-bigram.dim300",# finacial"w2v.financial.target.bigram-char.dim300","w2v.financial.target.word-char.dim300","w2v.financial.target.word-word.dim300","w2v.financial.target.word-bigram.dim300",# literature"w2v.literature.target.bigram-char.dim300","w2v.literature.target.word-char.dim300","w2v.literature.target.word-word.dim300","w2v.literature.target.word-bigram.dim300",# siku"w2v.sikuquanshu.target.word-word.dim300","w2v.sikuquanshu.target.word-bigram.dim300",# Mix-large"w2v.mixed-large.target.word-char.dim300","w2v.mixed-large.target.word-word.dim300",# GOOGLE NEWS"w2v.google_news.target.word-word.dim300.en",# GloVe"glove.wiki2014-gigaword.target.word-word.dim50.en","glove.wiki2014-gigaword.target.word-word.dim100.en","glove.wiki2014-gigaword.target.word-word.dim200.en","glove.wiki2014-gigaword.target.word-word.dim300.en","glove.twitter.target.word-word.dim25.en","glove.twitter.target.word-word.dim50.en","glove.twitter.target.word-word.dim100.en","glove.twitter.target.word-word.dim200.en",# FastText"fasttext.wiki-news.target.word-word.dim300.en","fasttext.crawl.target.word-word.dim300.en",
]
from paddlenlp.embeddings import TokenEmbedding# 初始化TokenEmbedding, 预训练embedding未下载时会自动下载并加载数据
token_embedding = TokenEmbedding(embedding_name="w2v.baidu_encyclopedia.target.word-word.dim300")# 查看token_embedding详情
print(token_embedding)

在这里插入图片描述

1.2 认识一下Embedding

TokenEmbedding.search()

在这里插入图片描述

1.3 单词相似度对比

TokenEmbedding.cosine_sim()
计算词向量间余弦相似度,语义相近的词语余弦相似度更高,说明预训练好的词向量空间有很好的语义表示能力。


score1 = token_embedding.cosine_sim("女孩", "女人")
score2 = token_embedding.cosine_sim("女孩", "书籍")
print('score1:', score1)
print('score2:', score2)

在这里插入图片描述

2. 基于TokenEmbedding衡量句子语义相似度

在许多实际应用场景(如文档检索系统)中, 需要衡量两个句子的语义相似程度。此时我们可以使用词袋模型(Bag of Words,简称BoW)计算句子的语义向量。
首先,将两个句子分别进行切词,并在TokenEmbedding中查找相应的单词词向量(word embdding)。
然后,根据词袋模型,将句子的word embedding叠加作为句子向量(sentence embedding)。
最后,计算两个句子向量的余弦相似度。

2.1 基于TokenEmbedding的词袋模型

使用BoWEncoder搭建一个BoW模型用于计算句子语义。

  • paddlenlp.TokenEmbedding组建word-embedding层
  • paddlenlp.seq2vec.BoWEncoder组建句子建模层
  • 通过词袋编码和余弦相似度计算来评估两个文本之间的相似度
class BoWModel(nn.Layer):def __init__(self, embedder):super().__init__()self.embedder = embedderemb_dim = self.embedder.embedding_dim#  编码self.encoder = paddlenlp.seq2vec.BoWEncoder(emb_dim)# 计算相似度self.cos_sim_func = nn.CosineSimilarity(axis=-1)def get_cos_sim(self, text_a, text_b):text_a_embedding = self.forward(text_a)text_b_embedding = self.forward(text_b)cos_sim = self.cos_sim_func(text_a_embedding, text_b_embedding)return cos_simdef forward(self, text):# Shape: (batch_size, num_tokens, embedding_dim)embedded_text = self.embedder(text)# Shape: (batch_size, embedding_dim)summed = self.encoder(embedded_text)return summed

2.2 使用 JiebaTokenizer 进行高效的中文文本分词

在处理中文自然语言处理任务时,文本分词是一个非常关键的步骤。本文将详细介绍如何使用 JiebaTokenizer,一个基于 jieba 分词库的自定义分词器类,进行中文文本的分词及其转换为词汇索引。

class JiebaTokenizer():"""Constructs a tokenizer based on `jieba <https://github.com/fxsjy/jieba>`__.It supports :meth:`cut` method to split the text to tokens, and :meth:`encode`method to covert text to token ids.Args:vocab(paddlenlp.data.Vocab): An instance of :class:`paddlenlp.data.Vocab`."""def __init__(self, vocab):super(JiebaTokenizer, self).__init__(vocab)self.tokenizer = jieba.Tokenizer()# initialize tokenizerself.tokenizer.FREQ = {key: 1 for key in self.vocab.token_to_idx.keys()}self.tokenizer.total = len(self.tokenizer.FREQ)self.tokenizer.initialized = Truedef get_tokenizer(self):return self.tokenizerdef cut(self, sentence, cut_all=False, use_hmm=True):"""The method used to cut the text to tokens.Args:sentence(str): The text that needs to be cuted.cut_all(bool, optional): Whether to use the full mode. If True,using full mode that gets all the possible words from thesentence, which is fast but not accurate. If False, usingaccurate mode that attempts to cut the sentence into the mostaccurate segmentations, which is suitable for text analysis.Default: False.use_hmm(bool, optional): Whether to use the HMM model. Default: True.Returns:list[str]: A list of tokens.Example:.. code-block:: pythonfrom paddlenlp.data import Vocab, JiebaTokenizer# The vocab file. The sample file can be downloaded firstly.# wget https://bj.bcebos.com/paddlenlp/data/senta_word_dict.txtvocab_file_path = './senta_word_dict.txt'# Initialize the Vocabvocab = Vocab.load_vocabulary(vocab_file_path,unk_token='[UNK]',pad_token='[PAD]')tokenizer = JiebaTokenizer(vocab)tokens = tokenizer.cut('我爱你中国')print(tokens)# ['我爱你', '中国']"""return self.tokenizer.lcut(sentence, cut_all, use_hmm)def encode(self, sentence, cut_all=False, use_hmm=True):"""The method used to convert the text to ids. It will firstly call:meth:`cut` method to cut the text to tokens. Then, convert tokens toids using `vocab`.Args:sentence(str): The text that needs to be cuted.cut_all(bool, optional): Whether to use the full mode. If True,using full mode that gets all the possible words from thesentence, which is fast but not accurate. If False, usingaccurate mode that attempts to cut the sentence into the mostaccurate segmentations, which is suitable for text analysis.Default: False.use_hmm(bool, optional): Whether to use the HMM model. Default: True.Returns:list[int]: A list of ids.Example:.. code-block:: pythonfrom paddlenlp.data import Vocab, JiebaTokenizer# The vocab file. The sample file can be downloaded firstly.# wget https://bj.bcebos.com/paddlenlp/data/senta_word_dict.txtvocab_file_path = './senta_word_dict.txt'# Initialize the Vocabvocab = Vocab.load_vocabulary(vocab_file_path,unk_token='[UNK]',pad_token='[PAD]')tokenizer = JiebaTokenizer(vocab)ids = tokenizer.encode('我爱你中国')print(ids)# [1170578, 575565]"""words = self.cut(sentence, cut_all, use_hmm)return [get_idx_from_word(word, self.vocab.token_to_idx, self.vocab.unk_token) for word in words]
2.2.1 JiebaTokenizer 类的设计与实现

初始化 jieba.Tokenizer 实例,并设置词频和总词数以匹配提供的词汇表 vocab

class JiebaTokenizer():def __init__(self, vocab):super(JiebaTokenizer, self).__init__(vocab)self.tokenizer = jieba.Tokenizer()# initialize tokenizerself.tokenizer.FREQ = {key: 1 for key in self.vocab.token_to_idx.keys()}self.tokenizer.total = len(self.tokenizer.FREQ)self.tokenizer.initialized = True
2.2.2 分词方法 cut

cut 方法用于将输入的中文句子分割成词汇单元列表。它允许用户选择全模式或精确模式分词,以及是否使用 HMM 模型。这里,lcut 方法来自 jieba 库,根据 cut_alluse_hmm 参数返回最适合的分词结果。

def cut(self, sentence, cut_all=False, use_hmm=True):return self.tokenizer.lcut(sentence, cut_all, use_hmm)
2.2.3 编码方法 encode

encode 方法中,我们首先使用 cut 方法对句子进行分词,然后将分词结果转换为词汇索引。

def encode(self, sentence, cut_all=False, use_hmm=True):words = self.cut(sentence, cut_all, use_hmm)return [self.vocab.token_to_idx.get(word, self.vocab.unk_token) for word in words]

展示如何将分词结果映射到它们对应的索引值。若词汇不存在于词汇表中,则使用未知词标记 unk_tokenJiebaTokenizer 提供了一个强大且灵活的方式来处理中文文本,非常适合用于自然语言处理中的文本预处理。通过这个类,开发者可以轻松地集成 jieba 的分词功能到自己的 NLP 项目中,提高文本处理的效率和精度。

计算得到句子之间的相似度

    text_pairs = {}with open("data/text_pair.txt", "r", encoding="utf8") as f:for line in f:text_a, text_b = line.strip().split("\t")if text_a not in text_pairs:text_pairs[text_a] = []text_pairs[text_a].append(text_b)for text_a, text_b_list in text_pairs.items():text_a_ids = paddle.to_tensor([tokenizer.text_to_ids(text_a)])for text_b in text_b_list:text_b_ids = paddle.to_tensor([tokenizer.text_to_ids(text_b)])print("text_a: {}".format(text_a))print("text_b: {}".format(text_b))print("cosine_sim: {}".format(model.get_cos_sim(text_a_ids, text_b_ids).numpy()[0]))# print()

参考百度飞桨链接:PaddleNLP词向量应用展示

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

debian配置BIND DNS服务器

前言 局域网内有很多台主机&#xff0c;IP难以记忆。 而修改hosts文件又难以做到配置共享和统一&#xff0c;需要一台内网的DNS服务器。 效果展示 这里添加了一个域名hello.dog&#xff0c;将其指向为192.168.1.100。 同时&#xff0c;外网的域名不会受到影响&#xff0c;…

力扣48. 旋转图像

Problem: 48. 旋转图像 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化&#xff1a;首先&#xff0c;我们需要获取矩阵的长度len&#xff0c;这将用于后续的索引计算。 2.外层循环&#xff1a;我们使用一个外层循环for (int i 0; i < len / 2; i)来遍历矩阵的每一…

关于加强电力系统通信与电网调度自动化建设问题的规定

关于加强电力系统通信与电网调度自动化建设问题的规定 为了保障电力系统安全、经济、优质、可靠运行&#xff0c;必须加强电网调度管理和提高技术装备水平。根据当前电网技术装备状况&#xff0c;结合电力系统通信和电网调度自动化的特点&#xff0c;以及今后规划发展的要求&am…

SpringBoot---------Hutool

第一步&#xff1a;引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-parent</artifactId><version>5.7.17</version></dependency> 第二步&#xff1a;各种用法 ①生成随机数 //生成验证码 String s …

Docker常用命令(镜像、容器)

一、镜像 1.1 存出镜像 1.2 载入镜像 1.3 上传镜像 二、容器 2.1 容器创建 2.2 查看容器的运行状态 ​2.3 启动容器 2.4 创建并启动容器 2.5 在后台持续运行 docker run 创建的容器 2.6 终止容器运行 2.7 容器的进入 ​2.8把宿主机的文件传入到容器内部 2.9 从容器…

vite和webpacke的常规配置

文章目录 1、vite和webpacke的区分2、vite的常规配置介绍主要部分介绍vite基本配置示例 3、webpacke的常规配置介绍主要部分介绍Webpack 基本配置示例 1、vite和webpacke的区分 相同点&#xff1a; 都是构建工具&#xff0c;用于资源打包 &#xff1b; 都有应用到摇树原理 tre…

PUBG绝地求生进游戏就闪退 绝地求生进游戏慢?3个解决方法分享

《绝地求生》(PUBG) 是由韩国Krafton工作室开发的一款战术竞技型射击类沙盒游戏。2022年1月12日&#xff0c;该游戏于主机和PC上可免费下载游玩。在该游戏中&#xff0c;玩家需要在游戏地图上收集各种资源&#xff0c;并在不断缩小的安全区域内对抗其他玩家&#xff0c;让自己生…

袁庭新ES系列15节|Elasticsearch客户端基础操作

前言 上一章节我们介绍了搭建Elasticsearch集群相关的知识。那么又该如何来操作Elasticsearch集群呢&#xff1f;在ES官网中提供了各种语言的客户端&#xff0c;我们在项目开发过程中有多种Elasticsearch版本和连接客户端可以选择&#xff0c;那么他们有什么区别&#xff1f;这…

appium相关的知识

>adb shell dumpsys window | findstr mCurrentFocus adb devices # 实例化字典 desired_caps = dict() desired_caps[platformName] = Android desired_caps[platformVersion] = 9 # devices desired_caps[deviceName] = emulator-5554 # 包名 desired_caps[appPackage] …

Pytest基础

1.用例的设计原则 用Pytest写用例时候&#xff0c;一定要按照下面的规则去写&#xff0c;否则不符合规则的测试用例是不会执行的 1、文件名以 test_.py 文件和test.py 2、以 test 开头的函数 3、以 Test 开头的类&#xff0c;不能包含__init__方法 4、以 test_ 开头的类里面的…

【js】解决自动生成颜色时相邻颜色视觉相似问题的技术方案

解决自动生成颜色时相邻颜色视觉相似问题的技术方案 在进行大规模颜色生成时&#xff0c;特别是在数据可视化、用户界面设计等应用领域&#xff0c;一个常见的挑战是确保相邻颜色在视觉上具有足够的区分度。本文介绍的方法通过结合黄金分割比与饱和度、亮度的周期性变化&#…

科研基础与工具(论文写作)

免责申明&#xff1a; 本文内容只是学习笔记&#xff0c;不代表个人观点&#xff0c;希望各位看官自行甄别 参考文献 科研基础与工具&#xff08;YouTube&#xff09; 学术写作句型 Academic Phrase bank 曼彻斯特大学维护的一个网站 写论文的时候&#xff0c;不不知道怎么…

LMDeploy量化部署LLMVLM实践-笔记五

本次课程由西北工业大学博士生、书生浦源挑战赛冠军队伍队长、第一期书生浦语大模型实战营优秀学员【安泓郡】讲解【OpenCompass 大模型评测实战】课程 课程视频&#xff1a;https://www.bilibili.com/video/BV1tr421x75B/ 课程文档&#xff1a;https://github.com/InternLM/…

IP-guard getdatarecord 存在任意文件读取

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、产品介绍 IP-guard是由溢信科技股份有限公司开发的一款终端安全管…

STM32单片机通过ST-Link 烧录和调试

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. ST-LINK V2 2. 操作步骤 2.1 连接方式 2.2 驱动安装常规步骤 2.3 Keil中的设置 3. 调式仿真 4. 常见问题排查 1. ST-LINK V2 ST LINK v2下载器用于STM32单片机&#xff0c;可以下载程序、调试…

01、创建型-单例模式--只有一个实例

文章目录 前言一、基本介绍1.1 什么是单例模式1.2 为什么要用单例模式1.3 应用场景1.4 单例优缺点 二、单例模式的实现方式2.1 饿汉式单例2.1.1 静态变量方式2.1.2 静态代码块 2.2 懒汉式单例2.2.1 懒汉式单例2.2.2 懒汉式优化①-线程安全2.2.2 懒汉式优化②-双重检查锁2.2.3 懒…

构建NodeJS库--前端项目的打包发布

1. 前言 学习如何打包发布前端项目&#xff0c;需要学习以下相关知识&#xff1a; package.json 如何初始化配置&#xff0c;以及学习npm配置项&#xff1b; 模块类型type配置&#xff0c; 这是nodejs的package.json的配置main 入口文件的配置 webpack 是一个用于现代 JavaSc…

spring boot3单模块项目工程搭建-上(个人开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 上文衔接 常规目录创建 common目录 exception.handle目录 result.handle目录 controller目录 service目录 mapper目录 entity目录 test目录 写在最后 写在前面 本文…

[Java EE] 多线程(四):线程安全问题(下)

1.5 volatile关键字 我们在了解这个关键字之前,我们首先要把产生线程安全的第4个原因补齐,我们来说说由于内存可见性引起的线程安全问题. 我们来看下面这样一段代码: import java.util.Scanner;public class Demo16 {public static int count 0;public static void main(Str…

HTML随机点名程序

案例要求 1.点击点名按钮&#xff0c;名字界面随机显示&#xff0c;按钮文字由点名变为停止 2.再次点击点名按钮&#xff0c;显示当前被点名学生姓名&#xff0c;按钮文字由停止变为点名 案例源码 <!DOCTYPE html> <html lang"en"> <head> <m…