29、深度学习-自学之路-深入理解-NLP自然语言处理-做一个完形填空,让机器学习更多的内容程序展示

news2025/3/14 14:04:06
import sys,random,math
from collections import Counter
import numpy as np

np.random.seed(1)
random.seed(1)
f = open('reviews.txt')
raw_reviews = f.readlines()
f.close()

tokens = list(map(lambda x:(x.split(" ")),raw_reviews))

#wordcnt = Counter() 这行代码的作用是创建一个 Counter 对象,
# 并将其赋值给变量 wordcnt。Counter 是 Python 标准库 collections 模块中的一个类,
# 它是一种特殊的字典,用于对可哈希对象进行计数。
wordcnt = Counter()

for sent in tokens:
    for word in sent:
        wordcnt[word] -= 1
vocab = list(set(map(lambda x:x[0],wordcnt.most_common())))
#print(vocab)

word2index = {}
for i,word in enumerate(vocab):
    word2index[word]=i

concatenated = list()
input_dataset = list()
for sent in tokens:
    sent_indices = list()
    for word in sent:
        try:
            sent_indices.append(word2index[word])
            concatenated.append(word2index[word])
        except:
            ""
    input_dataset.append(sent_indices)
'''
concatenated = np.array(concatenated) 这行代码的主要功能是将 concatenated 对象转换为 NumPy 数组。
NumPy 是 Python 中用于科学计算的一个重要库,np.array() 是 NumPy 提供的一个函数,
它可以将多种类型的对象(如列表、元组等)转换为 NumPy 数组,以便进行高效的数值计算和操作。
'''
concatenated = np.array(concatenated)
'''
random.shuffle(input_dataset) 这行代码的主要功能是对 input_dataset 列表中的元素进行随机打乱顺序的操作。
random 是 Python 的标准库,shuffle 是 random 模块中的一个函数,它会直接修改传入的列表,使其元素顺序随机化。
'''
random.shuffle(input_dataset)

alpha, iterations = (0.05, 10)
hidden_size,window,negative = (50,2,5)

weights_0_1 = (np.random.rand(len(vocab),hidden_size) - 0.5) * 0.2
weights_1_2 = np.random.rand(len(vocab),hidden_size)*0

layer_2_target = np.zeros(negative+1)
layer_2_target[0] = 1
'''
下面的这个程序要表现的东西会很多,请大家慢慢听我描述
程序功能是:
这段 Python 代码定义了一个名为 similar 的函数,其主要目的是找出与给定目标单词(默认是 'beautiful')
在词向量空间中最相似的 10 个单词。它基于词向量之间的欧几里得距离来衡量单词间的相似度。

然后我们怎么找到词向量,然后什么又是欧几里得距离:
先说:词向量。我们都知道当我们对一个神经网络训练完成以后,我们就会得到一组权重。这组权重一般是如果输入层是n个值,隐藏层是m个点。
那么这个权重就是(n,m)的一个numpy矩阵。
对应的权重矩阵的第一行第一列就是我们说的第一个输入元素的词向量。

然后我们说一下什么是欧几里得距离,计算公式我知道:
raw_difference = weights_0_1[index] - (weights_0_1[target_index])
    squared_difference = raw_difference * raw_difference
    scores[word] = -math.sqrt(sum(squared_difference))

使用全部词的词向量值和 beautiful这个词的词向量值进行相减。
然后在把相减后的结果进行平方
然后再把所有的平方的数据相加然后求平方根。
然后   
'''
def similar(target='beautiful'):
  target_index = word2index[target]

  scores = Counter()
  '''
  for word, index in word2index.items()::遍历 word2index 字典中的每个键值对,word 是单词,
  index 是该单词在词向量矩阵中的索引。
  '''
  for word,index in word2index.items():
    '''
      raw_difference = weights_0_1[index] - (weights_0_1[target_index]):
      计算当前单词的词向量与目标单词的词向量之间的差值。weights_0_1 是一个二维的 NumPy 数组,
      存储着所有单词的词向量,每一行对应一个单词的词向量。
    '''
    raw_difference = weights_0_1[index] - (weights_0_1[target_index])
    '''
    squared_difference = raw_difference * raw_difference:对差值向量的每个元素进行平方操作。
    '''
    squared_difference = raw_difference * raw_difference
    '''
       scores[word] = -math.sqrt(sum(squared_difference)):计算平方和的平方根,得到欧几里得距离,
       并取其负值作为相似度得分。之所以取负值,是因为 Counter 的 most_common 方法会返回得分最高的元素,
       而我们希望距离最近(相似度最高)的单词排在前面。
    '''
    scores[word] = -math.sqrt(sum(squared_difference))
    '''most_common(10) 方法会返回 scores 中得分最高的 10 个元素及其得分,
    以列表形式呈现,列表中的每个元素是一个包含单词和得分的元组。
    '''
  return scores.most_common(10)

def sigmoid(x):
    return 1/(1 + np.exp(-x))

for rev_i, review in enumerate(input_dataset * iterations):

    for target_i in range(len(review)):
        # since it's really expensive to predict every vocabulary
        # we're only going to predict a random subset
        '''
        一个正样本,加上5给随机负样本。因为负样本太多了,这个里面采用了随机负样本的方式来进行训练,减少整个程序的运行算力。
        '''
        target_samples = [review[target_i]] + list(concatenated \
                                                       [(np.random.rand(negative) * len(concatenated)).astype(
                'int').tolist()])

        #print("target_samples")
        #print(target_samples)
        #提取正样本前面的2个单词,
        left_context = review[max(0, target_i - window):target_i]
        # 提取正样本后面的2个单词,
        right_context = review[target_i + 1:min(len(review), target_i + window)]

        #中间隐藏层的计算方法是把所有对应的输入都相加,然后进行平均。CBOW的处理方式。
        layer_1 = np.mean(weights_0_1[left_context + right_context], axis=0)
        #在CBOW里面使用的是softmax作为最后输出层的函数。
        layer_2 = sigmoid(layer_1.dot(weights_1_2[target_samples].T))
        #计算损失函数
        layer_2_delta = layer_2 - layer_2_target
        #计算第一层的损失函数
        layer_1_delta = layer_2_delta.dot(weights_1_2[target_samples])

        #进行第一层的权重更新
        weights_0_1[left_context + right_context] -= layer_1_delta * alpha
        #进行第二层的权重更新
        weights_1_2[target_samples] -= np.outer(layer_2_delta, layer_1) * alpha

    if (rev_i % 250 == 0):
        sys.stdout.write('\rProgress:' + str(rev_i / float(len(input_dataset)
                                                           * iterations)) + "   " + str(similar('terrible')))
    sys.stdout.write('\rProgress:' + str(rev_i / float(len(input_dataset)
                                                       * iterations)))
print(similar('terrible')) #输出与terrible相近的词向量。 terrible:糟糕的、可怕的

#运行结果 有4个词和terrible的词义是相近的。一共10个词,只有4个词是相近的。说明这个模型非常的失败。
#主要的原因我考虑是不是训练的太少


'''
训练了2次,整个数据集。
Progress:0.99998
[('terrible', -0.0), #可怕的
('horrible', -2.7898821106802045),  #令人恐惧的
('brilliant', -3.470232426351145),  #明亮的,恒成功的
('pathetic', -3.8372465135492355),  #可怜的
('phenomenal', -3.928297271813787), #非凡的
('mediocre', -3.9289917580116294),  #平庸的
('superb', -3.9764853704721492),    #棒 极 了
('masterful', -4.022889507518986),  #有驾驭能力的
('marvelous', -4.0699092654045375), #了不起的
('bad', -4.220448952264187)]        #坏的
'''
'''
这个里面只是给出了一个相关的程序,但是还有很多需要改进的地方,因为没有一个合适的数据集。用的这个数据集也很差。
如果我们想要训练一个真的相关的完形填空。然后要去考察对应的值。那么我们应该使用和正面或者反面有关的数据来进行训练。
因为现在只是用这个数据集,训练的时候用的是5个一组的数据,这个就很难受。很难做出更好的数据。导致最后的识别率差不多是一半一半。基本上没有识别能力。
应该像小孩子学习语文的时候一样,同义词反义词,该怎么填写,是填写好,还是填写坏。要有对应的语境,才能更好的训练出来。
就如同我们要做一个什么人?这个语境下要填入好的概率就非常高。
或者是我们喜欢和什么人玩,这个也是填写好人更好。
感觉作者在这个地方的时候,已经有点糊弄了。
但是还是感谢作者,因为我们有一个好的收获。因为我们已经大概知道了整体的运行效果。和程序的关键思路。
'''

'''循环训练了10次,还是这个结果,说明这个模型确实是有问题的。
Progress:0.999996[
('terrible', -0.0), #糟糕的、可怕的
('brilliant', -3.4459636758170444),  #明亮的
('horrible', -3.6093847255874367), #令人恐惧的
 ('dreadful', -3.661559427113935), #可怕的
  ('pathetic', -3.705108491197224), #可怜的
   ('superb', -3.735478039156396),  棒 极 了
   ('bad', -3.790820154323175), 坏的
    ('marvelous', -3.864905791871544),  了不起的
    ('remarkable', -3.897655193993103), 非凡的
     ('fantastic', -4.041131904413315)] 好极了
'''

这个里面有我对所有的代码的注释:可以帮助我们理解整个程序,这个程序是有问题的,但是整个思路是对的。因为多次循环后,还是不能找到正确的关系。说明输入和输出是有问题的。我后续可能会把这个程序整改一下。

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

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

相关文章

SpringBoot速成(12)文章分类P15-P20

1.新增文章分类 1.Postman登录不上,可以从头registe->login一个新的成员:注意,跳转多个url时,post/get/patch记得修改成controller类中对应方法上写的 2.postman运行成功: 但表中不更新:细节有问题: c是…

RedHat8安装postgresql15和 postgis3.4.4记录及遇到的问题总结

安装包对照版本参考 UsersWikiPostgreSQLPostGIS – PostGIS 如果Red Hat系统上有旧版本的PostgreSQL需要卸载 在较新的Red Hat版本,使用dnf包管理器卸载:sudo dnf remove postgresql-server postgresql 旧版本,使用yum包管理器卸载 sudo y…

深入解析计算机网络请求头:常见类型与安全性影响

目录 1. Host 2. User-Agent 3. Cookie 4. Referer(或 Referrer) 5. Authorization 6. Content-Type 7. Content-Length 8. Origin 9. X-Forwarded-For (XFF) 10. Upgrade-Insecure-Requests 11. X-Frame-Options 12. Cache-Control 13. Ac…

VisoMaster整合包及汉化

VisoMaster是个图片及视频换脸工具,速度快,性能十分强大。 VisoMaster安装有2种方式,根据官网指引安装也十分简单,在此就不重复,只说说安装过程中要注意的事项: 1、自动安装:需要在网络十分畅…

从安装软件到flask框架搭建可视化大屏(二)——创建一个flask页面,搭建可视化大屏,零基础也可以学会

附录:所有文件的完整代码 models.py # models/models.py from flask_sqlalchemy import SQLAlchemydb SQLAlchemy()class User(db.Model):__tablename__ user # 显式指定表名为 userid db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(…

[JVM篇]垃圾回收器

垃圾回收器 Serial Seral Old PartNew CMS(Concurrent Mark Sweep) Parallel Scavenge Parallel Old G1 ZGC

DeepSeek专题:DeepSeek-V1核心知识点速览

AIGCmagic社区知识星球是国内首个以AIGC全栈技术与商业变现为主线的学习交流平台,涉及AI绘画、AI视频、大模型、AI多模态、数字人以及全行业AIGC赋能等100应用方向。星球内部包含海量学习资源、专业问答、前沿资讯、内推招聘、AI课程、AIGC模型、AIGC数据集和源码等…

SpringBoot+shardingsphere实现按月分表功能

SpringBootshardingsphere实现按月分表功能 文章目录 前言 ShardingSphere 是一套开源的分布式数据库中间件解决方案,旨在简化数据库分片、读写分离、分布式事务等复杂场景的管理。它由 Apache 软件基金会支持,广泛应用于需要处理大规模数据的系统中 一…

教程 | 从零部署到业务融合:DeepSeek R1 私有化部署实战指南

文章目录 1. 什么是 DeepSeek R1?a. 主要介绍a. 版本区别 2. 部署资源要求a. 硬件资源要求 3. 本地安装DeepSeek-R1a. 为什么选择本地部署?b. 部署工具对比c. 演示环境配置d. Ollama安装流程 4. 可视化工具a. 工具对比b. Open-WebUI部署 5. AI API应用a.…

分布式 NewSQL 数据库(TiDB)

TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。 TiDB是 PingCAP公司自主设计、研发的开源分布式关系型数据…

C语言-章节 1:变量与数据类型 ——「未初始化的诅咒」

在那神秘且广袤无垠的「比特大陆」上,阳光奋力地穿过「内存森林」中错综复杂的代码枝叶缝隙,洒下一片片斑驳陆离、如梦似幻的光影。林间的空气里,弥漫着一股浓郁的十六进制锈蚀味,仿佛在诉说着这片森林中隐藏的古老秘密。 一位零基…

HTML的入门

一、HTML HTML(HyperText Markup Language,超文本标记语言)是一种用来告知浏览器如何组织页面的标记语言。 超文本:就是超越了文本;HTML不仅仅可以用来显示文本(字符串、数字之类),还可以显示视频、音频等…

闭源大语言模型的怎么增强:提示工程 检索增强生成 智能体

闭源大语言模型的怎么增强 提示工程 检索增强生成 智能体 核心原理 提示工程:通过设计和优化提示词,引导大语言模型进行上下文学习和分解式思考,激发模型自身的思维和推理能力,使模型更好地理解和生成文本,增强其泛用性和解决问题的能力。检索增强生成:结合检索的准确…

【图像加密解密】空间混沌序列的图像加密解密算法复现(含相关性检验)【Matlab完整源码 2期】

1、说明 本文给出详细完整代码、完整的实验报告和PPT。 环境:MATLAB2019a 复现文献:[1]孙福艳,吕宗旺.Digital image encryption with chaotic map lattices[J].Chinese Physics B,2011,20(04):136-142. 2、部分报告内容 3 部分源码与运行步骤 3.1 部…

QxOrm生成json

下载Qxorm-1.5版本 使用vs打开项目,直接生成即可: lib目录中会生成dll和lib文件 新建Qt项目使用Qxorm: 将QxOrm中上面三个目录拷贝到新建的Qt项目中 pro文件添加使用QxOrm第三方库 INCLUDEPATH $$PWD/include/ LIBS -L"$$PWD/lib" LIBS…

ASP.NET Core Web应用(.NET9.0)读取数据库表记录并显示到页面

1.创建ASP.NET Core Web应用 选择.NET9.0框架 安装SqlClient依赖包 2.实现数据库记录读取: 引用数据库操作类命名空间 创建查询记录结构类 查询数据并返回数据集合 3.前端遍历数据并动态生成表格显示 生成结果:

uniapp商城之首页模块

文章目录 前言一、自定义导航栏1.静态结构2.修改页面配置3.组件安全区适配二、通用轮播组件1. 静态结构组件2.自动导入全局组件3.首页轮播图数据获取三、首页分类1.静态结构2.首页获取分类数据并渲染四、热门推荐1.静态结构2.首页获取推荐数据并渲染3.首页跳转详细推荐页五、猜…

以若依移动端版为基础,实现uniapp的flowable流程管理

1.前言 此代码是若依移动端版为基础,实现flowable流程管理,支持H5、APP和微信小程序三端。其中,APP是在安卓在雷电模拟器环境下完成的,其他环境未测试,此文章中所提及的APP均指上述环境。移动端是需要配合若依前后端分…

C++:高度平衡二叉搜索树(AVLTree) [数据结构]

目录 一、AVL树 二、AVL树的理解 1.AVL树节点的定义 2.AVL树的插入 2.1更新平衡因子 3.AVL树的旋转 三、AVL的检查 四、完整代码实现 一、AVL树 AVL树是什么?我们对 map / multimap / set / multiset 进行了简单的介绍,可以发现,这几…

2D 游戏艺术、动画和光照

原文:https://unity.com/resources/2d-game-art-animation-lighting-for-artists-ebook 笔记 用Tilemap瓷砖大小为1单元,人物大小在0.5~2单元 PPU :单位像素 pixels per unit 2160 4K分辨率/ 正交相机size*2 完整屏幕显示像素点 有骨骼动…