• 9.7-一定要开始学了


    词向量

    one-hot表示

    每个词表示为一个长向量。这个向量的维度就是词表大小,向量中只有一个维度的值为1,其余维度为0
    不能展示词与词之间的关系,且特征空间非常大。

    分布式表示

    word embedding。词向量
    表示成一个定长的连续的稠密向量。

    分布式表示优点:
    (1)词之间存在相似关系:是词之间存在“距离”概念
    (2)包含更多的信息,每一维都有特定的含义。

    word2vec

    在这里插入图片描述

    预训练词向量

    在这里插入图片描述

    加载TokenEmbedding
    tokenEmbedding()参数

    embedding_name 模型名称以参数形式传入TokenEmbeddings
    w2v.baidu_encyclopedia.target.word-word.dim300的词向量

    unknow_token 未知token的表示,默认为[UNK]

    unknown_token_vector 未知token的向量表示,默认生成和embedding维数一致,数值均值为0的正态分布向量

    extended_vocab_path 扩展词汇列表文件路几个,词表格式一行一个词。

    trainable embedding曾是否可悲训练
    默认为TRUE

    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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    认识embedding

    TokenEmbedding.search() 获得指定词汇的词向量

    test_token_embedding = token_embedding.search("中国")
    print(test_token_embedding)
    
    
    • 1
    • 2
    • 3

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

    score1 = token_embedding.cosine_sim("女孩","女人")
    score2 = token_embedding.cosine_sim("女孩","书籍")
    print('score1:',score1)
    print('score2:',score2)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    score1 有更好的相似性

    词向量映射到低微空间

    在这里插入图片描述

    # 获取词表中前1000个单词
    labels = token_embedding.vocab.to_tokens(list(range(0,1000)))
    
    # 取出这1000个单词对应的embedding
    test_token_embedding = token_embedding.search(labels)
    
    # 引入visualDL的logWriter记录日志
    from visualdl import LogWriter
    with LogWriter(logdir = './token_hidi') as writer:
    	writer.add_embedding(tag='test',mat=[i for i in test_token_embedding],matadata= labels)
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    词袋模型(Bag of Words,简称BoW)计算语义向量

    首先,将两个句子分别进行切词,并在TokenEmbedding中查找相应的单词词向量(word embdding)。

    然后,根据词袋模型,将句子的word embedding叠加作为句子向量(sentence embedding)。

    最后,计算两个句子向量的余弦相似度。

    基于TokenEmbedding的词袋模型

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

    paddlenlp.TokenEmbedding 组建word-embedding层
    paddlenlp.seq2vec.BoWEncoder 组建句子建模层

    import paddle
    import paddle.nn as nn
    import paddlenlp
    
    class BoWModel(nn.Layer):
    	def __init__(self,embedder):
    		super().init_()
    		self.embedder = embedder
    		em_dim = self.embedder.embedding_dim
    		self.encoder = paddlenlp.seq2vec.BoWEncoder(eb_dim)
    		self.cos_sim_func = nn.CosineDimilarity(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_sim
    
    	def forward(self,text):
    		embedded_text = self.embedder(text)
    		
    		summed = self.encoder(embedded_text)
    
    		return summed
    
    model = BoWModel(embedder = token_embedding)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    构造Tokenizer

    使用tokenEmbedding词表构造Tokenizer

    from data import Tokenizer
    tokenizer = Tokenizer()
    toenizer.set_vocab(vocab=token_embedding.vocab)
    
    
    • 1
    • 2
    • 3
    • 4
    相似句对数据读取

    以提供的样例数据text_pair.txt为例,该数据文件每行包含两个句子

    text_pairs = {}
    with open("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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    查看相似语句相关度
    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    使用VisualDL查看句子向量

    
    # 引入VisualDL的LogWriter记录日志
    import numpy as np
    from visualdl import LogWriter    
    # 获取句子以及其对应的向量
    label_list = []
    embedding_list = []
    
    for text_a, text_b_list in text_pairs.items():
        text_a_ids = paddle.to_tensor([tokenizer.text_to_ids(text_a)])
        embedding_list.append(model(text_a_ids).flatten().numpy())
        label_list.append(text_a)
    
        for text_b in text_b_list:
            text_b_ids = paddle.to_tensor([tokenizer.text_to_ids(text_b)])
            embedding_list.append(model(text_b_ids).flatten().numpy())
            label_list.append(text_b)
    
    
    with LogWriter(logdir='./sentence_hidi') as writer:
        writer.add_embeddings(tag='test', mat=embedding_list, metadata=label_list)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    MySQL高级篇03【逻辑架构】
    论文基本功——LaTeX:公式及其编号
    使用电销外呼系统的回拨线路真的不会封号吗?
    【Python】【技能树评测】【05】数据库操作详细含源码:
    switch-case语句中声明定义的使用
    揭露 FileSystem 引起的线上 JVM 内存溢出问题
    Linux中如何禁止普通用户使用su命令
    C专家编程 第3章 分析C语言的声明 3.5 typedef可以成为你的朋友
    ASP.NET第五章 Application、Session和Cookie对象
    使用 Postman 工具高效管理和测试 SAP ABAP OData 服务的试读版
  • 原文地址:https://blog.csdn.net/weixin_44522477/article/details/126753833