深度学习与自然语言处理第四次大作业


问题提出

利用Word2Vec模型训练Word Embedding,根据小说中人物、武功、派别或者其他你感兴趣的特征,基于Word Embedding来进行聚类分析。


一、Word2Vec模型简介

传统的自然语言处理将词看作是一个个孤立的符号,这样的处理方式对于系统处理不同的词语没有提供有用的信息。词映射(word embedding)实现了将一个不可量化的单词映射到一个实数向量。Word embedding能够表示出文档中单词的语义和与其他单词的相似性等关系。它已经被广泛应用在了推荐系统和文本分类中。Word2Vec模型则是Word embedding中广泛应用的模型。Word2Vec使用一层神经网络将one-hot(独热编码)形式的词向量映射到分布式形式的词向量。使用了Hierarchical softmax,negative sampling等技巧进行训练速度上的优化。

二、模型原理

1.词的独热表示-One-hot

最简单的也最容易想到的词表示方法是 One-hot Representation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个向量就代表了当前的词。

“可爱”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …]
“面包”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …]

每个词都是茫茫 0 海中的一个 1。这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。比如刚才的例子中,可爱记为 3,面包记为 8(假设从 0 开始记)。
这样的表示带来两点问题:
1、向量的维度会随着句子的词的数量类型增大而增大,容易导致维度灾难;
2、任意两个词之间都是孤立的,无法表示语义层面上词汇之间的相关信息,而这一点是致命的。

2.词的分布式表示

传统的独热表示仅仅将词符号化,不包含任何语义信息。如何将语义融入到词表示中?Harris 在 1954 年提出的“分布假说”为这一设想提供了理论基础:上下文相似的词,其语义也相似。Firth 在 1957年对分布假说进行了进一步阐述和明确:词的语义由其上下文决定。
Word Embedding正是这样的模型,而Word2Vec则是其中的一个典型,Word2Vec包含两种模型,即CBOW模型和Skip-gram模型。
以CBOW模型为例,如果有一个句子“the cat sits one the mat”,在训练的时候,将“the cat sits one the”作为输入,预测出最后一个词是“mat”。
在这里插入图片描述
我们将上下文单词输入时,可能会遇到多种上下文的形式,所以,情况可能会为下图所示:
在这里插入图片描述

即多种情况对应同一个单词的预测输出。
Skip-Gram model则是通过目标单词推测语境,在大规模的数据集中Skip-Gram model训练速度快。Skip-Gram 的训练流程如下图所示:
在这里插入图片描述
同样的,Skip-Gram也有更一般的情形,也就是再输入一个目标单词时,可能会得到多个上下文单词结果,情况如下图所示:
在这里插入图片描述

三、实验过程

1.预处理

在读取语料后,首先利用jieba分词对语料进行分词,去除一些无意义的广告和标点符号等内容,将分词后的语料重新写入新的txt保存下来,代码如下:

def read_novel(path_in, path_out):  # 读取语料内容
    content = []
    names = os.listdir(path_in)
    for name in names:
        novel_name = path_in + '\\' + name
        fenci_name = path_out + '\\' + name
        fenci_name = fenci_name.replace('.txt', '')
        fenci_name = fenci_name + 'fenci' + '.txt'
        for line in open(novel_name, 'r', encoding='ANSI'):
            line.strip('\n')
            line = re.sub("[A-Za-z0-9\:\·\—\,\。\“\”\\n \《\》\!\?\、\...]", "", line)
            line = content_deal(line)
            con = jieba.cut(line, cut_all=False) # 结巴分词
            # content.append(con)
            content.append(" ".join(con))
        with open(fenci_name, "w", encoding='utf-8'
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
深度学习进阶自然语言处理是指在深度学习的基础上,更加深入地应用于自然语言处理领域的技术和方法。它主要包括以下几个方面的内容: 1. 词向量表示:深度学习进阶自然语言处理中,常用的一种技术是将词语表示为向量形式,以便于计算机进行处理。常见的词向量表示方法有Word2Vec、GloVe等。 2. 语言模型:语言模型自然语言处理中的一个重要任务,它用于预测下一个词语或者句子的概率。深度学习方法可以通过使用循环神经网络(RNN)或者Transformer等模型来建立语言模型。 3. 序列标注:序列标注是指给定一个输入序列,为每个输入元素打上相应的标签。在自然语言处理中,常见的序列标注任务包括命名实体识别、词性标注等。深度学习方法可以通过使用条件随机场(CRF)或者长短时记忆网络(LSTM)等模型来解决序列标注问题。 4. 文本分类:文本分类是指将文本划分到不同的类别中。在自然语言处理中,常见的文本分类任务包括情感分析、垃圾邮件过滤等。深度学习方法可以通过使用卷积神经网络(CNN)或者循环神经网络(RNN)等模型来进行文本分类。 5. 机器翻译:机器翻译是指将一种语言的文本转换为另一种语言的文本。深度学习方法可以通过使用编码-解码模型,如循环神经网络(RNN)或者Transformer等模型来进行机器翻译。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值