词向量的运算与Emoji生成器

2023-11-15

本文参考参考,没有对框架内容进行学习,旨在学习思路和方法。

1、词向量运算

       之前学习RNN和LSTM的时候,输入的语句都是一个向量,比如恐龙的名字那个例子就是将一个单词中的字母按顺序依次输入,这对于一个单词的预测是可行的。但是对于想让机器学习到一个句子的意思那就不行了,它需要知道每个单词的意思,而且还需要知道单词连起来的意思,这时候输入到网络中的单位就不是字母了,应该是按单词来输入。这时候问题就来了,单词该如何输入到网络之中。有人将很多单词训练成为了词嵌入数据,每个单词对应一个50维的向量。

       使用别人造好的轮子载入:可以看到单词hello对应的词向量。word_to_vec_map是单词到词向量的映射字典

words, word_to_vec_map = w2v_utils.read_glove_vecs('data/glove.6B.50d.txt')
print(word_to_vec_map['hello'])

"""
[-0.38497   0.80092   0.064106 -0.28355  -0.026759 -0.34532  -0.64253
 -0.11729  -0.33257   0.55243  -0.087813  0.9035    0.47102   0.56657
  0.6985   -0.35229  -0.86542   0.90573   0.03576  -0.071705 -0.12327
  0.54923   0.47005   0.35572   1.2611   -0.67581  -0.94983   0.68666
  0.3871   -1.3492    0.63512   0.46416  -0.48814   0.83827  -0.9246
 -0.33722   0.53741  -1.0616   -0.081403 -0.67111   0.30923  -0.3923
 -0.55002  -0.68827   0.58049  -0.11626   0.013139 -0.57654   0.048833
  0.67204 ]
"""

       那该如何去对比两个单词的近似程度呢?这里就引入了余弦相似度。越相似,余弦值越接近1,否则越接近0

def cosine_similarity(u, v):
    """
    u与v的余弦相似度反映了u与v的相似程度
    
    参数:
        u -- 维度为(n,)的词向量
        v -- 维度为(n,)的词向量
        
    返回:
        cosine_similarity -- 由上面公式定义的u和v之间的余弦相似度。
    """
    distance = 0
    
    # 计算u与v的内积
    dot = np.dot(u, v)
    
    #计算u的L2范数
    norm_u = np.sqrt(np.sum(np.power(u, 2)))
    
    #计算v的L2范数
    norm_v = np.sqrt(np.sum(np.power(v, 2)))
    
    # 根据公式1计算余弦相似度
    cosine_similarity = np.divide(dot, norm_u * norm_v)
    
    return cosine_similarity
father = word_to_vec_map["father"]
mother = word_to_vec_map["mother"]
ball = word_to_vec_map["ball"]
crocodile = word_to_vec_map["crocodile"]
france = word_to_vec_map["france"]
italy = word_to_vec_map["italy"]
paris = word_to_vec_map["paris"]
rome = word_to_vec_map["rome"]

print("cosine_similarity(father, mother) = ", cosine_similarity(father, mother))
print("cosine_similarity(ball, crocodile) = ",cosine_similarity(ball, crocodile))
print("cosine_similarity(france - paris, rome - italy) = ",cosine_similarity(france - paris, rome - italy))

"""
cosine_similarity(father, mother) =  0.8909038442893615
cosine_similarity(ball, crocodile) =  0.27439246261379424
cosine_similarity(france - paris, rome - italy) =  -0.6751479308174202
"""

       上面是两个词之间的相似程度计算,那词类类比该如何计算。 形如A与B相比就类似于C与____相比一样,这里计算的就是差值之间的余弦相似度。这种类比需要去遍历词库来寻找最大的相似度。

def complete_analogy(word_a, word_b, word_c,word_to_vec_map):
    # 把单词转换为小写
    word_a, word_b, word_c = word_a.lower(), word_b.lower(), word_c.lower()
    # 获取对应单词的词向量
    e_a, e_b, e_c = word_to_vec_map[word_a], word_to_vec_map[word_b], word_to_vec_map[word_c]
    
    # 获取全部的单词
    words = word_to_vec_map.keys()
    
    # 将max_cosine_sim初始化为一个比较大的负数
    max_cosine_sim = -100
    best_word = None
    
    # 遍历整个数据集
    for word in words:
        # 要避免匹配到输入的数据
        if word in [word_a, word_b, word_c]:
            continue
        # 计算余弦相似度
        cosine_sim = cosine_similarity((e_b - e_a), (word_to_vec_map[word] - e_c))
        
        if cosine_sim > max_cosine_sim:
            max_cosine_sim = cosine_sim
            best_word = word
            
    return best_word
triads_to_try = [('italy', 'italian', 'spain'), ('india', 'delhi', 'japan'), ('man', 'woman', 'boy'), ('small', 'smaller', 'large')]
for triad in triads_to_try:
    print ('{} -> {} <====> {} -> {}'.format( *triad, complete_analogy(*triad,word_to_vec_map)))

"""
italy -> italian <====> spain -> spanish
india -> delhi <====> japan -> tokyo
man -> woman <====> boy -> girl
small -> smaller <====> large -> larger
"""

       消除与性别无关的词汇的偏差:有很多词是与性别没有关系的比如reception,但是在实际的比较中却给予了相关性,这就要求消除这种偏差。做法就是将需要计算的词向量向相关轴投影,然后减去该投影就消除了偏差

def neutralize(word, g, word_to_vec_map):
    """
    通过将“word”投影到与偏置轴正交的空间上,消除了“word”的偏差。
    该函数确保“word”在性别的子空间中的值为0
    
    参数:
        word -- 待消除偏差的字符串
        g -- 维度为(50,),对应于偏置轴(如性别)
        word_to_vec_map -- 字典类型,单词到GloVe向量的映射
        
    返回:
        e_debiased -- 消除了偏差的向量。
    """
    
    # 根据word选择对应的词向量
    e = word_to_vec_map[word]
    
    # 根据公式2计算e_biascomponent
    e_biascomponent = np.divide(np.dot(e, g), np.square(np.linalg.norm(g))) * g
    
    # 根据公式3计算e_debiased
    e_debiased = e - e_biascomponent
    
    return e_debiased
e = "receptionist"
print("去偏差前{0}与g的余弦相似度为:{1}".format(e, cosine_similarity(word_to_vec_map["receptionist"], g)))

e_debiased = neutralize("receptionist", g, word_to_vec_map)
print("去偏差后{0}与g的余弦相似度为:{1}".format(e, cosine_similarity(e_debiased, g)))

"""
e = "receptionist"
print("去偏差前{0}与g的余弦相似度为:{1}".format(e, cosine_similarity(word_to_vec_map["receptionist"], g)))

e_debiased = neutralize("receptionist", g, word_to_vec_map)
print("去偏差后{0}与g的余弦相似度为:{1}".format(e, cosine_similarity(e_debiased, g)))
"""

2、 表情生成器

       所谓表情生成器就是根据我们输入的语句来生成相对应的表情。比如:“Congratulations on the promotion! ? Lets get coffee and talk. ☕️ Love you! ❤️”。

       练习中构建的一个简单的分类器,数据集(X,Y),X是127条字符串类型的短句子,Y是对应的(0-4)5个标签。测试集总共有56条数据。

X_train, Y_train = emo_utils.read_csv('data/train_emoji.csv')
X_test, Y_test = emo_utils.read_csv('data/test.csv')

maxLen = len(max(X_train, key=len).split())

index  = 3
print(X_train[index], emo_utils.label_to_emoji(Y_train[index]))

"""
Miss you so much ❤️
"""

        在模型上输入是将所有的单词的向量相加求均值然后作为输入输入到模型当中,然后将输入和权重相乘激活。

def sentence_to_avg(sentence, word_to_vec_map):
    """
    将句子转换为单词列表,提取其GloVe向量,然后将其平均。
    
    参数:
        sentence -- 字符串类型,从X中获取的样本。
        word_to_vec_map -- 字典类型,单词映射到50维的向量的字典
        
    返回:
        avg -- 对句子的均值编码,维度为(50,)
    """
    
    # 第一步:分割句子,转换为列表。
    words = sentence.lower().split()
    
    # 初始化均值词向量
    avg = np.zeros(50,)
    
    # 第二步:对词向量取平均。
    for w in words:
        avg += word_to_vec_map[w]
    avg = np.divide(avg, len(words))
    
    return avg

要注意和权重相乘时是求的内积,所以维度会不匹配。

def model(X, Y, word_to_vec_map, learning_rate=0.01, num_iterations=400):
    """
    在numpy中训练词向量模型。
    
    参数:
        X -- 输入的字符串类型的数据,维度为(m, 1)。
        Y -- 对应的标签,0-7的数组,维度为(m, 1)。
        word_to_vec_map -- 字典类型的单词到50维词向量的映射。
        learning_rate -- 学习率.
        num_iterations -- 迭代次数。
        
    返回:
        pred -- 预测的向量,维度为(m, 1)。
        W -- 权重参数,维度为(n_y, n_h)。
        b -- 偏置参数,维度为(n_y,)
    """
    np.random.seed(1)
    
    # 定义训练数量
    m = Y.shape[0]
    n_y = 5
    n_h = 50
    
    # 使用Xavier初始化参数
    W = np.random.randn(n_y, n_h) / np.sqrt(n_h)
    b = np.zeros((n_y,))
    
    # 将Y转换成独热编码
    Y_oh = emo_utils.convert_to_one_hot(Y, C=n_y)
    
    # 优化循环
    for t in range(num_iterations):
        for i in range(m):
            # 获取第i个训练样本的均值
            avg = sentence_to_avg(X[i], word_to_vec_map)
            
            # 前向传播
            z = np.dot(W, avg) + b
            a = emo_utils.softmax(z)
            
            # 计算第i个训练的损失
            cost = -np.sum(Y_oh[i]*np.log(a))
            
            # 计算梯度
            dz = a - Y_oh[i]
            dW = np.dot(dz.reshape(n_y,1), avg.reshape(1, n_h))
            db = dz
            
            # 更新参数
            W = W - learning_rate * dW
            b = b - learning_rate * db
        if t % 100 == 0:
            print("第{t}轮,损失为{cost}".format(t=t,cost=cost))
            pred = emo_utils.predict(X, Y, W, b, word_to_vec_map)
            
    return pred, W, b
pred, W, b = model(X_train, Y_train, word_to_vec_map)

"""
第0轮,损失为1.9520498812810072
Accuracy: 0.3484848484848485
第100轮,损失为0.07971818726014807
Accuracy: 0.9318181818181818
第200轮,损失为0.04456369243681402
Accuracy: 0.9545454545454546
第300轮,损失为0.03432267378786059
Accuracy: 0.9696969696969697
"""
X_my_sentences = np.array(["i adore you", "i love you", "funny lol", "lets play with a ball", "food is ready", "you are not happy"])
Y_my_labels = np.array([[0], [0], [2], [1], [4],[3]])

pred = emo_utils.predict(X_my_sentences, Y_my_labels , W, b, word_to_vec_map)
emo_utils.print_predictions(X_my_sentences, pred)

"""
Accuracy: 0.8333333333333334

i adore you ❤️
i love you ❤️
funny lol ?
lets play with a ball ⚾
food is ready ?
you are not happy ❤️
"""

LSTM下的表情生成       

       可以看到上文中的最后一个结果预测是不正确的,这是因为没有做一个上下文的考虑 。对应上面的预测方法,这里是将单词转化成向量矩阵作为序列输入。这里的输入长度是固定的,设定一个最大长度,不足的补0,超过的截取。

def sentences_to_indices(X, word_to_index, max_len):
    """
    输入的是X(字符串类型的句子的数组),再转化为对应的句子列表,
    输出的是能够让Embedding()函数接受的列表或矩阵(参见图4)。
    
    参数:
        X -- 句子数组,维度为(m, 1)
        word_to_index -- 字典类型的单词到索引的映射
        max_len -- 最大句子的长度,数据集中所有的句子的长度都不会超过它。
        
    返回:
        X_indices -- 对应于X中的单词索引数组,维度为(m, max_len)
    """
    
    m = X.shape[0]  # 训练集数量
    # 使用0初始化X_indices
    X_indices = np.zeros((m, max_len))
    
    for i in range(m):
        # 将第i个居住转化为小写并按单词分开。
        sentences_words = X[i].lower().split()
        
        # 初始化j为0
        j = 0
        
        # 遍历这个单词列表
        for w in sentences_words:
            # 将X_indices的第(i, j)号元素为对应的单词索引
            X_indices[i, j] = word_to_index[w]
            
            j += 1
            
    return X_indices
X1 = np.array(["funny lol", "lets play baseball", "food is ready for you"])
X1_indices = sentences_to_indices(X1,word_to_index, max_len = 5)
print("X1 =", X1)
print("X1_indices =", X1_indices)

"""
X1 = ['funny lol' 'lets play baseball' 'food is ready for you']
X1_indices = [[155345. 225122.      0.      0.      0.]
 [220930. 286375.  69714.      0.      0.]
 [151204. 192973. 302254. 151349. 394475.]]
"""

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

词向量的运算与Emoji生成器 的相关文章

  • RNN/LSTM循环神经网络讲解

    转自 https zhuanlan zhihu com p 123211148 一 什么是循环神经网络 循环神经网络 Rerrent Neural Network RNN 历史啊 谁发明的都不重要 说了你也记不住 你只要记住RNN是神经网络
  • 【生成式网络】入门篇(二):GAN的 代码和结果记录

    GAN非常经典 我就不介绍具体原理了 直接上代码 感兴趣的可以阅读 里面有更多变体 https github com rasbt deeplearning models tree master pytorch ipynb gan GAN 在
  • GAN网络系列博客(一):用于人脸生成的StyleGAN结构

    目录 简介 基于风格的生成器 生成器的性质 总结 Reference 在未来的一段时间 我会开一个小专题 来介绍下GAN网络的一些经典论文 希望对那些想要入坑的同学提供一点点帮助 考虑到StyleGAN系列论文在相关领域的影响力 我们首先来
  • 笔记︱几款多模态向量检索引擎:Faiss 、milvus、Proxima、vearch、Jina等

    转自 https zhuanlan zhihu com p 364923722 引用文章 7 的开篇 来表示什么是 向量化搜索 人工智能算法可以对物理世界的人 物 场景所产生各种非结构化数据 如语音 图片 视频 语言文字 行为等 进行抽象
  • 输入文本就可建模渲染了?!OpenAI祭出120亿参数魔法模型!

    转自 https new qq com omn 20210111 20210111A0CBRD00 html 2021刚刚开启 OpenAI又来放大招了 能写小说 哲学语录的GPT 3已经不足为奇 那就来一个多模态 图像版GPT 3 今天
  • DOTA: A Large-scale Dataset for Object Detection in Aerial Images 翻译

    DOTA 用于航空图像中目标检测的大规模数据集 原文 https arxiv org pdf 1711 10398 pdf 官网 https captain whu github io DOTA dataset https captain
  • 图神经网络(1):图卷积神经网络GCN ICLR 2017

    图卷积神经网络GCN ICLR 2017 是曾经在美国加州大学UCI教授 现在荷兰阿姆斯特丹大学教授 Max Welling团队的大作 Max是图灵奖获得者Hinton的弟子 第一作者T N Kipf已经成为这个领域有名的学者和工程师 如果
  • 朴素贝叶斯分类器简介及C++实现(性别分类)

    贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器 在机器学习中 朴素贝叶斯分类器是一系列以假设特征之间强 朴素 独立下运用贝叶斯定理为基础的简单概率分类器 朴素贝叶斯是文本分类的一种热门 基准 方法 文本分类是以词频为特征判断文件所属类别或
  • 目标检测基础

    什么是目标检测 简单来说就是 检测图片中物体所在的位置 本文只介绍用深度学习的方法进行目标检测 同过举出几个特性来帮助各位理解目标检测任务 同时建议学习目标检测应先具备物体人工智能算法基础和物体分类现实基础 特性1 Bounding Box
  • 深度神经网络中的Inception模块介绍

    深度神经网络 Deep Neural Networks DNN 或深度卷积网络中的Inception模块是由Google的Christian Szegedy等人提出 包括Inception v1 Inception v2 Inception
  • CrossEntropyloss function

    这里写目录标题 两部分 Part One 绕绕 可以不看 Part Two 清晰易懂 一定要看 两部分 Part One 绕绕 可以不看 Cross entropy loss function又称交叉熵损失 是基于one hot编码的 举个
  • 《动手学深度学习》(七) -- 边界框和锚框

    1 边界框 在目标检测中 我们通常使用边界框 bounding box 来描述对象的空间位置 边界框是矩形的 由矩形左上角的以及右下角的 x x x和 y y y坐标决定 另一种常用的边界框表示方法是边界框中心的
  • 05 两层神经网络 - 神经网络和深度学习 [Deep Learning Specialization系列]

    本文是Deep Learning Specialization系列课程的第1课 Neural Networks and Deep Learning 中Shallow Neural Network部分的学习笔记 在前面的章节中 我们以逻辑回归
  • 2D和3D人体姿态数据集

    转自链接 https www jianshu com p c046db584a21 2D数据集 LSP 地址 http sam johnson io research lsp html 样本数 2k 关节点数 14 全身 单人 FLIC 地
  • 词向量的运算与Emoji生成器

    本文参考参考 没有对框架内容进行学习 旨在学习思路和方法 1 词向量运算 之前学习RNN和LSTM的时候 输入的语句都是一个向量 比如恐龙的名字那个例子就是将一个单词中的字母按顺序依次输入 这对于一个单词的预测是可行的 但是对于想让机器学习
  • 决策树(Decision Tree)简介

    决策树 Decision Tree 及其变种是另一类将输入空间分成不同的区域 每个区域有独立参数的算法 决策树分类算法是一种基于实例的归纳学习方法 它能从给定的无序的训练样本中 提炼出树型的分类模型 树中的每个非叶子节点记录了使用哪个特征来
  • Going Deeper with convolutions

    Going Deeper with convolutions 转载请注明 http blog csdn net stdcoutzyx article details 40759903 本篇论文是针对ImageNet2014的比赛 论文中的方
  • Pytorch Advanced(三) Neural Style Transfer

    神经风格迁移在之前的博客中已经用keras实现过了 比较复杂 keras版本 这里用pytorch重新实现一次 原理图如下 from future import division from torchvision import models
  • 【深度学习】模型评价指标

    一 分类任务 分类任务一般有二分类 多分类和多标签分类 多分类 表示分类任务中有多个类别 但是对于每个样本有且仅有一个标签 例如一张动物图片 它只可能是猫 狗 虎等中的一种标签 二分类特指分类任务中只有两个类别 多标签 一个样本可以有多个标
  • 经典网络ResNet介绍

    经典网络ResNet Residual Networks 由Kaiming He等人于2015年提出 论文名为 Deep Residual Learning for Image Recognition 论文见 https arxiv org

随机推荐

  • 【保姆级教学】搭建win10系统 IIS Web 服务器(上)

    先确认计算机上是否已安装 IIS 1 进入Windows10的控制面板 点击 系统和安全 2 找到 管理工具 并点击 3 查看是否有Internet Information Services IIS 管理器 如图 我的计算机已经安装好了 注
  • Python——Numpy高级索引

    Python Numpy高级索引 整数数组索引 或 与索引数组组合 布尔索引 比较运算符 取补运算符号 np iscomplex 过滤非复数元素 花式索引 传入顺序 倒序索引数组 使用 np ix 传入多个索引数组 https editor
  • MySQL——MySQL的介绍、安装、卸载与使用

    1 介绍 MySQL数据库隶属于MySQL AB公司 总部位于瑞典 后被oracle公司收购 优点 成本低 开放源码 可免费使用 性能高 执行很快 简单 容易安装和使用 DBMS分为两类 基于共享文件系统的DBMS Access 基于客户机
  • torch.max函数比较最大值

    新建两个tensor列表 利用torch max 进行两个列表的比较 import torch a torch tensor 1 2 3 4 5 print a a b torch tensor 10 1 7 9 3 print b b x
  • 认识HTTP请求

    要分析HTTP请求和响应必然少不了抓包工具 关于抓包工具的设置和下载推荐看抓包工具Fiddler的下载与设置 通过抓包得到的一个HTTP请求 HTTP请求的格式 结构分析 一 请求行 1 post是方法 可以表示一条HTTP请求要进行的操作
  • elementui的el-input校验正则表达式

    el input 只能输入正整数 包括0 在 Input 值改变时触发 handleEdit e let value e replace d g 只能输入数字 value value replace 0 d 1 第一位0开头 0后面为数字
  • 前后端分离之Springboot

    这里写目录标题 springboot后台搭建 1 创建父项目 1 1 创建netseal 2 创建子项目 2 1 创建webserver 2 2 创建common 3 正式编码 3 1 修改pom文件 3 1 1 netseal的pom x
  • 三色标记-垃圾收集器底层算法

    三色标记 文章目录 三色标记 前言 一 三色标记是什么 二 三色的介绍 1 黑色 2 灰色 3 白色 三 浮动垃圾 四 读写屏障 四 总结 前言 三色标记相信大家也有所耳闻 但是都没有过深入的了解 小编在之前和同事交流的过程中 了解到很多大
  • Struts2 入门案例——基于Struts2 任意两数据的代数和

    基于Struts2 任意两数据的代数和 问题 设计一个简单的 Web 程序 其功能是让用户输入两个整数 并提交给 Action 在 Action 中计算两个数的代数和 如果代数和为非负数 则跳转到 ch11 1 Positive jsp 页
  • vue项目中如何设置ico图标

    在vue项目开发中往往会设计到浏览器头部图标的设置 这里分享一下自己在项目中的使用的方法 如有不足的地方还望指正 直奔主题 1 首先如何制作ico图标 本人使用的是比特虫在线制作ico图标 使用方法很简单直接导入照片 输入生产码 点击生成i
  • springboot (2.0) 设置监听器,过滤器,拦截器

    springboot 2 0 设置监听器 过滤器 拦截器 github springboot2 0 项目名 springboot filter 1 项目结构和配置顺序 1 1配置顺序 listener WebListener声明为liste
  • 自己总结的数据库系统概论笔记,需要的拿去用

    1 绪论 1 1 概念 数据库系统包含 数据库 数据库管理系统 数据库管理员 应用系统 数据库 数据库是长期存储在计算机内 有组织的 可共享的大量数据的集合 数据库中的数据按照一定的数据模型 组织 描述和储存 具有较小的冗余度 较高的数据独
  • Angular --官方文档使用 Angular CLI创建项目

    1 在node环境下 标配 node v npm v 指令在命令窗口查看两个的版本号 node高于6 9 3 npm版本高于3 0 0 如果你是新安装的话 就不要考虑这个问题了 2 全局安装 Angular CLI npm install
  • Java线程池的使用(简单实现)

    一 线程池的概念 创建Java线程需要给线程分配堆栈内存以及初始化内存 还需要进行系统调用 频繁地创建和销毁线程会大大降低系统的运行效率 采用线程池来管理线程有以下好处 提升性能 线程池能独立负责线程的创建 维护和分配 线程管理 每个Jav
  • Navicat 连接Oracle时提示oracle library is not loaded的问题解决

    Navicat 连接Oracle时提示oracle library is not loaded的问题解决 笔者使用的Navicat Premium 12启动界面截屏 请注意是64位的 笔者win7 64位系统 连接Oracle时提示 ora
  • Eclipse报错-The selection cannot be launched,and there are no recent launches

    Eclipse报错 报错 The selection cannot be launched and there are no recent launches 怎么解决 解决办法 1 检查分号 2 检查main函数 3 检查main函数后面括
  • 【buildroot】buildroot使用总结

    文章目录 一 buildroot使用步骤 1 构建图形配置界面 2 配置Target options 3 配置Build options 4 配置Toolchain 5 配置 System configuration 6 配置 Filesy
  • 运用顺序表实现多项式相加

    本题要求输入两个一元多项式 然后输出它们的和 相加后得到的一元多项式 输入格式 输入一个整数n 表示输入组数 然后依次输入每一组数据 输入一个整数A 表示多项式的项数 小于100 然后输入A对整数 每一对整数表示对应项的指数和系数 输出格式
  • 通配符

    1 通配符 用来匹配文件名或目录 匹配文件内容用正则表达式 匹配任意一个字符 匹配0个或任意多个字符 也就是可以匹配任何内容 匹配括号中的任意一个字符 eg abc 匹配一个字符 或a 或b 或c 匹配括号中任意一个字符 代表一个范围 eg
  • 词向量的运算与Emoji生成器

    本文参考参考 没有对框架内容进行学习 旨在学习思路和方法 1 词向量运算 之前学习RNN和LSTM的时候 输入的语句都是一个向量 比如恐龙的名字那个例子就是将一个单词中的字母按顺序依次输入 这对于一个单词的预测是可行的 但是对于想让机器学习