[PyTorch][chapter 43][时间序列表示方法1]

news2024/11/26 2:35:56

前言:

      

         语言模型(LM)起源于语音识别(speech recognition),输入一段音频数据,语音识别系统通常会生成多个句子作为候选,究竟哪个句子更合理?就需要用到语言模型对候选句子进行排序。

   language models 应用场景如下:

LM 应用场景

Suggestions in messengers

Spelling correction

Machine translation

Speech recognition

Handwriting recognition

LM模型输入的是语音,文字

这个时候就需要对输入的语音,文字进行编码,方便模型处理

这里面介绍最简单的两种one-hot, 以及N-gram


一   one-hot 编码

      把语料中的词汇去重取出,按照一定的顺序(字典序、出现顺序等)排列为词汇表,则每一个单词都可以表示为一个长度为N的向量,N为词汇表长度,即单词总数。该向量中,除了该词所在的分量为1,其余均置为0

  如下五个单词,N=5,则one-hot 编码如下:

单词

编码

Hello

10000

Moto

01000

Are

00100

You

00010

ready

00001

one-hot局限性:

  1. 无法表达词语之间的关系
  2. 这种过于稀疏的向量,导致计算和存储的效率都不高
  3. 语义的相似性,“woman”、“madam”、“lady”从语义上将可能是相近的,one-hot无法表示
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 19 14:16:03 2023

@author: chengxf2
"""

import torch

word_index = {"hello":1,"moto":2,"are":3,"you":4, "ready":5}

one_hot = torch.tensor(word_index["you"],dtype=torch.long)

print("\n one_hot",one_hot)

二  整数编码

但是在NLP 里面,整数编码的缺点如下:

  1. 无法表达词语之间的关系
  2. 对于模型解释而言,整数编码可能具有挑战性。

代码实现

    用词典直接实现


三  n-gram(toy corpus)

  2.1 简介

        假设S 是一个句子,由w_1,w_2,...w_n n个单词组成,p(s)=p(w_n|w_1,w_2..w_{n_1})

的概率模型就是语言模型,其中w_i为单词(house,rat,malt,rat,did)

   例

  如下 p(this is the house)?

当前输入

下一个单词

This is the ….

house

Rat

Malt

Rat

did

    通过链式法则(条件贝叶斯原理)  

    p(s)=p(w_1)p(w_2|w_1)....p(w_n|w_{n-1},..w_1)

    上面公式,每个单词出现的概率率都是依赖它之前的所有单词出现过的概率来计算,这个计算量是指数级上涨的

     马尔可夫简化了这个计算方法,提出其实某个时刻词出现的概率只和它之前的N个单词字有关,不用计算它之前的所有字,可以往前推导1-3个单词的概率即可,这样计算量不大而且效果并不算太差。

 2.2 N-gram模型:

       是一种基于马尔科夫链的统计语言模型。它假设一个词的出现只与前面N个词有关,即一个词的出现只与它前面N个词的出现概率相关。因此,N-gram模型被称为是一个N阶马尔科夫链模型。

     P(W)=P(w_1)\prod_{i=2}^{n}p(w_i|w_{i-1}w_{i-2}..w_{i-N+1})

      在实际应用中,N一般取1、2、3等较小的值。

       当N=2的时候 

                      p(S)=\prod_{i=1}^{n}p(w_i|w_{i-1})

                    其中  p(w_i|w_{i-1})=\frac{count(w_{i-1}w_i)}{\sum_{w_i}count(w_{i-1}w_i)}

                                           =\frac{count(w_{i-1}w_i)}{count(w_{i-1})}

        当N=3的时候

                     P(W)=p(w_1)\prod_{i=2}^{n}p(w_i|w_{i-1}w_{i-2})

                    其中: p(w_i|w_{i-1}w_{i-2})=\frac{count(w_{i}w_{i-1}w_{i-2})}{\sum_{w_i}count(w_iw_{i-1}w_i)}

                                                              =\frac{count(w_iw_{i-1}w_{i-2})}{count(w_{i-1}w_{i-2} )}

             里面要注意的是,这里面利用了大数定理,频率和概率的概念

实际上是有误差的,所以是约等于。

2.4  例子     

toy corpus(微信语料库)

The girl  bought a chocolate

The  boy ate  the chocolate

The  girl bought a toy

The girl played with a toy

vocabulary 
{the,girl,bought ,a chocolate, boy,ate ,the toy, played,with}

输入: the girl ...,

          下面一个可能的单词是什么?

利用N-gram 模型,N=3

词组

数量

The girl

3

The girl bought

2

P(bought |The girl)  = count(the girl bought)/count(the girl)=2/3

词组

数量

The girl

3

The girl played

1

P(played |The girl)  = count(the girl bought)/count(the girl)=1/3

N-gram模型缺点:

数据稀疏性:由于自然语言具有复杂的结构和多样的表达方式,N-gram模型在处理稀疏数据时可能会出现问题。

上下文依赖性:N-gram模型只考虑当前词的前N-1个词作为上下文,无法捕捉长距离依赖关系,这可能会导致模型的准确性受到限制。

参数过多:对于大规模的文本数据,N-gram模型需要维护大量的参数,这可能会导致模型的计算复杂度和存储开销过大


三  代码

   根据词频 CounterVectorizer 将单词, 句子, 文章变成向量

# -*- coding: utf-8 -*-
"""
Created on Tue Jun 20 13:44:52 2023

@author: chengxf2
"""

from sklearn.feature_extraction.text import  CountVectorizer, TfidfTransformer

import numpy as np

def gram(N=2):
    
    '''
     ngram_range=(2, 2)表明适应2-gram,
     decode_error="ignore"忽略异常字符,
     token_pattern按照单词切割
    '''
    
    toy_corpus =["The girl bought a chocolate",
                 "The  boy ate  the chocolate",
                 "The  girl bought a toy",
                 "The girl played with a toy"]
    
    vectorizer  = CountVectorizer(ngram_range=(N, N+1), decode_error="ignore",min_df=0)
    x_trans = vectorizer .fit_transform(toy_corpus)
    
    print("\n get_feature_names ",vectorizer .get_feature_names())
    print("\n vocabulary 词典 ",vectorizer.vocabulary_)
    print("\n 每个句子中 单词出现的次数  \n",x_trans)
    print("\n  是将结果转化为稀疏矩阵矩阵的表示方式 \n ",x_trans.toarray())
    
    print(np.shape(x_trans.toarray()))
    
    
    print("\n toarray \n",x_trans.toarray()) #.toarray() 是将结果转化为稀疏矩阵矩阵的表示方式;
    print("\n sum \n",x_trans.toarray().sum(axis=0))  #每个词在所有文档中的词频
    
    return vectorizer.vocabulary_,x_trans.toarray().sum(axis=0)
    


if __name__:
    
    vocabulary,count_array=gram(2)
    
    input_word = 'the girl'
    
    
    
    for key ,value in vocabulary.items():
        
        if input_word in key:
            
            
            idx = vocabulary[key]
            count = count_array[idx]
            print("\n key ",key,"\t count", count)

最后我们可以看到

 key  the girl      count 3

 key  the girl bought      count 2

 key  the girl played      count 1
 

可以得到 the girl bought 的概率最高位2/3 

说明:

  1  print("\n vocabulary 词典 ",vectorizer.vocabulary_)

    根据ngram_range=(2, 3) ,统计每句中单词长度为2,3的词组,分配对应的键值

Feature 单词

 键值

ate the

 0

ate the chocolate

1

bought chocolate

2

bought toy

3

boy ate

4

boy ate the

5

girl bought

6

girl bought chocolate

7

girl bought toy

8

girl played

9

girl played with

10

played with

11

played with toy

12

the boy

13

the boy ate

14

the chocolate

15

the girl

16

the girl bought

17

the girl played

18

with toy

19

   2 print("\n 每个句子中 单词出现的次数  \n",x_trans)

    每个句子中 单词出现的次数  
   (0, 16)    1
  (0, 6)    1
  (0, 2)    1
  (0, 17)    1
  (0, 7)    1
  (1, 13)    1
  (1, 4)    1
  (1, 0)    1
  (1, 15)    1
  (1, 14)    1
  (1, 5)    1
  (1, 1)    1
  (2, 16)    1
  (2, 6)    1
  (2, 17)    1
  (2, 3)    1
  (2, 8)    1
  (3, 16)    1
  (3, 9)    1
  (3, 11)    1
  (3, 19)    1
  (3, 18)    1
  (3, 10)    1
  (3, 12)    1

   这是一个tuple元组数据,第一个参数代表第几个句子,如下0 ,代表“The girl  bought a chocolate

16 代表上面vectorizer.vocabulary_ 里面的键值

   (0, 16)    1
  (0, 6)    1
  (0, 2)    1
  (0, 17)    1
  (0, 7)    1

   代表 “The girl  bought a chocolate” 由下面的键值组成

Feature 单词

 键值

bought chocolate

2

girl bought

6

girl bought chocolate

7

the girl

16

the girl bought

17

3  print("\n  是将结果转化为稀疏矩阵矩阵的表示方式 \n ",x_trans.toarray())

 是将结果转化为稀疏矩阵矩阵的表示方式 
  [[0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0]
 [1 1 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0]
 [0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0]
 [0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 1 1]]

   [4,20]例的array

   每一行代表一个句子,列对应索引为键值,位置为1,代表存在该feature

例如“The girl  bought a chocolate” 第一个句子

    [0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0]

 参考:

 CountVectorizer详解_zttbee的博客-CSDN博客

https://www.youtube.com/watch?v=GiyMGBuu45w

探索N-gram模型:语言模型中的基础算法_Chaos_Wang_的博客-CSDN博客

一文看懂 Word2vec(基本概念+2种训练模型+5个优缺点)

一文看懂词嵌入 word embedding(2种主流算法+与其他文本表示比较)

课时85 时间序列表示方法_哔哩哔哩_bilibili

Deep Learning in NLP (一)词向量和语言模型 – licstar的博客

word2vec 中的数学原理详解(一)目录和前言_皮果提的博客-CSDN博客

(全)Word Embedding_wordembedding_薛定谔的炼丹炉!的博客-CSDN博客

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

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

相关文章

【算法题解】40. 数组的度

这是一道 简单 题 https://leetcode.cn/problems/degree-of-an-array/ 题目 给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返…

谈找工作途径

谈找工作 目录概述需求: 设计思路实现思路分析1.51job2.拉钩 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survi…

QT日历制作

文章目录 前言一、QCalendar 类介绍二、界面布局三、代码讲解1. lable 添加图片2. 设置主窗口背景色3. 日历显示改变网格线颜色4. 显示表头日期 总结 前言 在 Qt 中,QCalendar 类是提供日历功能的类。它用于操作和管理日期和时间信息,包括日期计算、日期…

为什么黑客不黑赌博软件?如何成为一名顶级黑客?

攻击了,只是你不知道而已! 同样,对方也不会通知你,告诉你他黑了赌博网站。 攻击赌博网站的不一定是正义的黑客,也可能是因赌博输钱而误入歧途的法外狂徒。之前看过一个警方破获的真实案件:28岁小伙因赌博…

Java安装配置教程,2023年最新版,全部版本看这一篇就够了!!

JDK新手无脑安装配置教程❤❤❤ JDK下载网址 ps:如果你的JDK版本在官网没有找到,可以通过第三方资源进行下载,下载安装配置教程是通用的 官方链接>https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 安装步骤…

【Leetcode60天带刷】day17二叉树——110.平衡二叉树 , 257. 二叉树的所有路径 ,404.左叶子之和

题目: 110. 平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1: 输入:root [3,9,20…

SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接

系列文章: SpringBoot Vue前后端分离项目实战 || 一:Vue前端设计 文章目录 新建Spring后台项目添加依赖 新建数据库IDEA 连接数据库IDEA 自动创建类实体定义数据传递至前端的格式 B站视频讲解:2023全网最简单但实用的SpringBootVue前后端分离…

DJ4-4 NAT、ICMP、IPv6

目录 一、NAT:网络地址转换 1、工作原理 2、NAT 的限制 二、ICMP 1、ICMP 协议 2、ICMP 类型和代码 3、Traceroute 命令 三、IPv6 地址 1、IPv6 的引入 2、IPv6 的表示 一、NAT:网络地址转换 动机:对外部网络来讲,本地…

RISC-V处理器的设计与实现——基本指令集

本人小白一枚,在学习FPGA的过程中偶然刷到了tinyriscv这个开源项目,并且自己对计算机体系结构的知识也很感兴趣,所以想参考这个开源项目做一个基于RISC-V指令集的CPU,下面是tinyriscv这个开源项目的地址,本项目很多思路…

优思学院|六西格玛倡导者与项目赞助人是什么角色?有何区别?

倡导者(Champion)和项目赞助人(Sponsor)在正式的六西格玛的组织架构中是两个不同的角色,所以希望在这篇文章中解释一下两个角色的区别。 倡导者(Champion)是负责组织竞争力和增长的董事和高管&…

quartus 无法识别usb blaster

一、Windows无法正常驱动USB-Blaster 问题:驱动问题 解决方法: 右键我的电脑->管理->设备管理器找到设备USB-Blaster,此时是带有黄色感叹号的 3.右键->更新驱动程序软件 4. 选择“浏览计算机以查找驱动程序软件(R)”,如选择自动搜索是不能安装成功的,…

jQuery 基础语法使用指南

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 1. 引入 jQuery 2. jQuery 语法 3. 选择器 …

FusionComputeV100R006C10SPC101平台安装win10踩坑记

生产环境中有一套华为FusionCompute,版本比较老,V100R006C10SPC101,该产品已EOS了,无法升级。因业务需要,需安装Windows10系统,遇到了不少坑,在此记录一下。 一、坑1:Windows10版本…

CAN总线终端电阻

CAN总线终端电阻,一般来说都是120欧姆,实际上在设计的时候,也是两个60欧姆的电阻串起来,而总线上一般有两个120Ω的节点,基本上稍微知道点CAN总线的人都知道这个道理。 但是这两个终端电阻的具体作用是什么呢&#xf…

迅为视频教程 | RKNPU2 从入门到实践一套搞定!

迅为基于瑞芯微RK3568和RK3588处理器设计开发的两款开发板都自带NPU,RK3568自带1T算力的NPU、RK3588自带6T算力的NPU,且这两款开发板使用的都是RKNPU2。 (RKNPU发展历程) RKNPU2较RKNPU1有较大的提升,但市面…

Unity核心9——3D动画

一、3D 动画的使用 ​ 使用导入的 3D 动画: 将模型拖入场景中为模型对象添加 Animator 脚本为其创建 Animator Controller 动画控制器(状态机)将想要使用的相关动作,拖入 Animator Controller 动画控制器(状态机&…

Java:时间日期类

文章目录 DateCalendarDate/Time APILocalDateLocalTimeLocalDateTimeZonedDateTime 功能获取标准时间 参考文献 Date 同样位于java.util包下。 在java中,获取时间最简单的方式就是直接实例化Date类。 以自定义格式,取当前的时间日期: Da…

渗透测试入门指南之小白该如何学习渗透?

前言: 内容都是精华,如果想要入安全的行,强烈建议仔细阅读。 目录: 渗透测试是什么? 学习渗透测试的战略方针是什么? 学习渗透测试的具体方法是什么? 遇到的各种疑难杂症怎么解决&#xf…

践行公益担当 | 关爱留守儿童,暖到“心理”

农民在中国各个时代都扮演着十分重要的角色,为中国的发展做出了卓越的贡献。随着经济的发展,农民为了改善生活而大规模的进城打工,“留守儿童”成为一个新的社会问题,开始在农村甚至部分城市出现。 全国“留守儿童”达6102.55万&…

从0到1精通自动化测试,pytest自动化测试框架,测试用例setup和teardown(三)

目录 一、前言 二、用例运行级别 三、函数式 1、setup_function / teardown_function 2、setup_module / teardown_module 四、类和方法 五、函数和类混合 一、前言 学过 unittest 的都知道里面用前置和后置 setup 和 teardown 非常好用,在每次用例开始前和…