文章目录

  • 问题提出
  • 一、Word2Vec模型简介
  • 二、模型原理
    • 1.词的独热表示-One-hot
    • 2.词的分布式表示
  • 三、实验过程
    • 1.预处理
    • 2.模型训练
    • 3.聚类分析
      • 1.倚天屠龙记:
      • 2.天龙八部:
      • 3.射雕英雄传:
      • 4.神雕侠侣:
      • 5.鹿鼎记:
  • 总结
  • 附录

问题提出

利用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 + '\\' + namefenci_name = path_out + '\\' + namefenci_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') as f:f.writelines(content)return content, names
def content_deal(content):  # 语料预处理,进行断句,去除一些广告和无意义内容ad = ['本书来自www.cr173.com免费txt小说下载站\n更多更新免费电子书请关注www.cr173.com', '----〖新语丝电子文库(www.xys.org)〗', '新语丝电子文库','\u3000', '\n', '。', '?', '!', ',', ';', ':', '、', '《', '》', '“', '”', '‘', '’', '[', ']', '....', '......','『', '』', '(', ')', '…', '「', '」', '\ue41b', '<', '>', '+', '\x1a', '\ue42b']for a in ad:content = content.replace(a, '')return content

2.模型训练

使用开源的Gensim库提供的接口来训练Word2vec模型,调用的函数如下:

   model = Word2Vec(sentences=LineSentence(name), hs=1, min_count=10, window=5, vector_size=200, sg=0, epochs=200)

这里用到的几个参数的含义如下:
sentences:可以是一个list,对于大语料集,建议使用
hs: 如果为1则会采用hierarchica softmax技巧,如果设置为0(default),则negative sampling会被使用。
min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5。
window:表示当前词与预测词在一个句子中的最大距离是多少。
vector_size:是指特征向量的维度,默认为100。这里的参数不是size,官方在新的版本中将这个关键词改为了vector_size,使用size会报错。
sg:用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
epochs:迭代次数,默认为5。这里的参数不是iter,官方在新的版本中将这个关键词改为了epochs,使用iter会报错。

3.聚类分析

在模型训练完毕后,Gensim库同样给出了一些接口函数,包括most_similar(),similarity()等,它们可以给出训练之后的模型中,与某个给定输入词关联度最高的词或者是给定的某两个词之间的关联性,借由这些接口函数,我挑选了语料库中我较为了解的五本小说《鹿鼎记》、《射雕英雄传》、《神雕侠侣》、《天龙八部》、《倚天屠龙记》作为样本,对其中的一些我熟悉的人名、门派、武功分别进行了聚类分析,代码如下:

   test_name = ['张无忌', '乔峰', '郭靖', '杨过', '韦小宝']test_menpai = ['明教', '逍遥派', '少林', '全真教', '少林']for i in range(0, 5):name = "../深度学习与自然语言处理/output/" + files[i]print(name)model = Word2Vec(sentences=LineSentence(name), hs=1, min_count=10, window=5, vector_size=200, sg=0, epochs=200)for result in model.wv.similar_by_word(test_name[i], topn=10):print(result[0], result[1])for result in model.wv.similar_by_word(test_menpai[i], topn=10):print(result[0], result[1])

聚类得到的结果如下:

1.倚天屠龙记:

与人名“张无忌”最为相关的十个词及关联度如下:

张无忌 关联度
周芷若 0.5224273800849915
0.5008779168128967
张翠山 0.4954092502593994
0.4852709472179413
范遥 0.4106266498565674
周颠 0.4061233699321747
0.3926427960395813
谢逊 0.3912036418914795
鹿杖客 0.38844454288482666
赵敏 0.3869082033634186

抛开无意义的“她”、“他”、“你”、“我”这些词语,周芷若和赵敏是本作的两大女主角,与主角张无忌关系密切,张翠山则是张无忌的父亲,范遥作为明教左护法,“逍遥二仙”之一,是张无忌的左右手,周颠是明教五散人之一,金毛狮王谢逊是明教四大护法之一,也是张无忌的义父,鹿杖客则是对手,与其结下不少梁子,符合小说实际情况。
与门派“明教”最为相关的十个词及关联度如下:

明教 关联度
本教 0.4191682040691376
魔教 0.39792606234550476
子孙 0.2558160722255707
巨木旗 0.2546980679035187
夫人 0.2476956844329834
大事 0.24341291189193726
慷慨 0.2397143542766571
范遥 0.23761330544948578
韦一笑 0.23557858169078827
中有 0.23312312364578247

2.天龙八部:

与人名“乔峰”最为相关的十个词及关联度如下:

乔峰 关联度
萧峰 0.5525722503662109
虚竹 0.4489666223526001
慕容复 0.4447994530200958
王语嫣 0.43345358967781067
段正淳 0.42867064476013184
游坦之 0.42759180068969727
0.41243481636047363
段誉 0.409080445766449
全冠清 0.4078834056854248
鸠摩智 0.4057800769805908

与门派“逍遥派”最为相关的十个词及关联度如下:

逍遥派 关联度
苏星河 0.36307916045188904
本派 0.3157878518104553
本门 0.29093995690345764
虚竹 0.27873310446739197
以往 0.25636252760887146
波罗星 0.256107896566391
没来 0.2500600516796112
师父 0.24919690191745758
小僧 0.24500644207000732
无崖子 0.2434624433517456

无崖子作为逍遥派掌门,苏星河是其大弟子,虚竹则是破解了珍珑棋局之后受无崖子传功并继任逍遥派掌门,小僧是虚竹常用的自称,同样符合小说内容。

3.射雕英雄传:

与人名“郭靖”最为相关的十个词及关联度如下:

郭靖 关联度
黄蓉 0.7242255806922913
洪七公 0.670393168926239
黄药师 0.6523061394691467
周伯通 0.6348181366920471
欧阳锋 0.634484052658081
欧阳克 0.622433066368103
完颜康 0.5930746793746948
梅超风 0.5923964381217957
丘处机 0.5631332397460938
杨康 0.5582190752029419

这里就非常清晰了,黄蓉自不必说,欧阳锋欧阳克父子是老对手,洪七公是师父,黄药师是岳父,周伯通亦师亦友,完颜康和杨康是一人,与郭靖也既是结拜兄弟又是冤家路窄,梅超风是黄蓉师父,黄药师徒弟,出场颇多,全真教的丘处机也是杨康的师父。
与门派“少林”最为相关的十个词及关联度如下:

少林 关联度
昆仑 0.5941689610481262
星宿 0.5900630354881287
崆峒 0.5829700231552124
全真 0.581130862236023
六大 0.5356719493865967
海沙 0.5304669737815857
蓬莱 0.41605111956596375
青海 0.4113229811191559
净衣 0.39944055676460266
0.3936734199523926

4.神雕侠侣:

与人名“杨过”最为相关的十个词及关联度如下:

杨过 关联度
小龙女 0.7204468846321106
黄蓉 0.7159188389778137
李莫愁 0.6668265461921692
陆无双 0.644158124923706
周伯通 0.6327298283576965
法王 0.6312462687492371
郭靖 0.6248602867126465
赵志敬 0.6084674596786499
绿萼 0.5919323563575745
欧阳锋 0.5609506368637085

小龙女自不必说,黄蓉郭靖夫妇因为杨过父亲杨康的关系与杨过关系密切,李莫愁作为反派也是和杨过屡有过节,其他几人我了解不是很细就不细说了。
与门派“全真教”最为相关的十个词及关联度如下:

全真教 关联度
少林 0.6128681302070618
昆仑 0.5413786768913269
崆峒 0.5033991932868958
蓬莱 0.49866750836372375
星宿 0.48630398511886597
六大 0.4226042926311493
海沙 0.4128609895706177
打定 0.38196879625320435
污衣 0.37214624881744385
青海 0.36486947536468506

5.鹿鼎记:

与人名“韦小宝”最为相关的十个词及关联度如下:

韦小宝 关联度
康熙 0.5620752573013306
0.5300751328468323
0.5114582180976868
太后 0.510773241519928
了韦小宝 0.47404995560646057
0.46537813544273376
0.45367631316185
海老公 0.4511910080909729
双儿 0.44725415110588074
多隆 0.42534011602401733

与门派“少林”最为相关的十个词及关联度如下:

少林 关联度
马难 0.30841320753097534
0.3061761260032654
少林寺 0.2803269922733307
见方 0.27505454421043396
0.2647128403186798
五台山 0.25747591257095337
和尚 0.24954929947853088
半空 0.23797549307346344
0.2355141043663025
海大富 0.23310326039791107

Process finished with exit code 0

总结

本次利用Word2Vec模型进行了Word Embedding模型的训练,根据训练得到的模型对五本小说的一些人名和门派名进行了聚类,最终聚类得到的结果基本与小说内容相符,但也看到出现了一些诸如“她”、“他”、“你”、“我”、“六大”等等无意义的或者一些不相关的词语,之后应当在分词和停词表中对这些内容进行一定的补正,从而使得聚类效果更好,更贴合小说内容。


附录

所有代码如下:

import math
import jieba
import os  # 用于处理文件路径
import re
import sys
import random
import numpy as np
import multiprocessing
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
def read_novel(path_in, path_out):  # 读取语料内容content = []names = os.listdir(path_in)for name in names:novel_name = path_in + '\\' + namefenci_name = path_out + '\\' + namefor 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') as f:f.writelines(content)return content, namesdef content_deal(content):  # 语料预处理,进行断句,去除一些广告和无意义内容ad = ['本书来自www.cr173.com免费txt小说下载站\n更多更新免费电子书请关注www.cr173.com', '----〖新语丝电子文库(www.xys.org)〗', '新语丝电子文库','\u3000', '\n', '。', '?', '!', ',', ';', ':', '、', '《', '》', '“', '”', '‘', '’', '[', ']', '....', '......','『', '』', '(', ')', '…', '「', '」', '\ue41b', '<', '>', '+', '\x1a', '\ue42b']for a in ad:content = content.replace(a, '')return contentif __name__ == '__main__':   ##[data_txt, files] = read_novel("../深度学习与自然语言处理/novel", "../深度学习与自然语言处理/output")# model = Word2Vec(data_txt, vector_size=400, window=5, min_count=5, epochs=200, workers=multiprocessing.cpu_count())test_name = ['张无忌', '乔峰', '郭靖', '杨过', '韦小宝']# test_wugong = ['九阳神功', '降龙十八掌', '降龙十八掌', '']test_menpai = ['明教', '逍遥派', '少林', '全真教', '少林']for i in range(0, 5):name = "../深度学习与自然语言处理/output/" + files[i]print(name)model = Word2Vec(sentences=LineSentence(name), hs=1, min_count=10, window=5, vector_size=200, sg=0, epochs=200)for result in model.wv.similar_by_word(test_name[i], topn=10):print(result[0], result[1])for result in model.wv.similar_by_word(test_menpai[i], topn=10):print(result[0], result[1])

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

  1. 斯坦福大学深度学习与自然语言处理第四讲:词窗口分类和神经网络

    斯坦福大学在三月份开设了一门"深度学习与自然语言处理"的课程:CS224d: Deep Learning for Natural Language Processing,授课老师是 ...

  2. 【PaddleNLP 基于深度学习的自然语言处理】第三次作业--必修|快递单信息识别

    基本情况 1.数据 train_ds, test_ds = paddlenlp.datasets.load_dataset("msra_ner", splits=["tr ...

  3. 深度学习在自然语言处理研究上的进展

    深度学习在自然语言处理研究上的进展 发表于3个月前(2016-01-25 14:26)   阅读(328) | 评论(0) 6人收藏此文章, 我要收藏 赞0 摘要 最近比较关注深度学习在NLP中的应用 ...

  4. 如何用深度学习做自然语言处理?这里有份最佳实践清单

    如何用深度学习做自然语言处理?这里有份最佳实践清单 By 机器之心2017年7月26日 14:16 对于如何使用深度学习进行自然语言处理,本文作者 Sebastian Ruder 给出了一份详细的最佳 ...

  5. 基于大数据与深度学习的自然语言对话

    基于大数据与深度学习的自然语言对话 发表于2015-12-04 09:44| 7989次阅读| 来源<程序员>电子刊| 5 条评论| 作者李航.吕正东.尚利峰 大数据深度学习自然语言处理自 ...

  6. 斯坦福大学深度学习与自然语言处理第三讲:高级的词向量表示

    斯坦福大学在三月份开设了一门"深度学习与自然语言处理"的课程:CS224d: Deep Learning for Natural Language Processing,授课老师是 ...

  7. 深度学习与自然语言处理 主要概念一览

    原址 CS224d-Day 1: 要开始系统地学习 NLP 课程 cs224d,今天先来一个课程概览. 课程一共有16节,先对每一节中提到的模型,算法,工具有个总体的认识,知道都有什么,以及它们可以做 ...

  8. 刘群:基于深度学习的自然语言处理,边界在哪里?

    来源:AI科技评论 本文约8000字,建议阅读15分钟. 刘群教授与你探讨深度学习方法解决了自然语言处理的哪些问题以及尚未解决哪些问题. 当前,深度学习之于自然语言处理,有其局限性.那么它所能起作用的 ...

  9. 深度学习与自然语言处理教程(5) - 语言模型、RNN、GRU与LSTM(NLP通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://www.showmeai.tech/article-d ...

最新文章

  1. 小程序地图的使用笔记
  2. Elasticsearch 参考指南(多索引)
  3. 在 SAP BTP Kyma Runtime 上使用 Redis 读取和存储数据
  4. 如何去除Eclipse Maven插件里关于Managed version的警告消息
  5. mac上的mongodb安装与使用的踩坑记
  6. 清除计算机用户缓存,如何在Windows 7中清除内存缓存,释放电脑空间?
  7. Tensorflow搭建GAN网络
  8. excel函数公式html文档,15个常用excel函数公式
  9. android toast居中显示_Android Toast 设置到屏幕中间以及其他自定义Toast的实现方法...
  10. 2018.8.10Yukimai模拟Day1
  11. JAVA中多态的理解
  12. UE4 后期材质节点学习
  13. [内网渗透学习]内网收集Fscan扫描探测工具
  14. Excel表格列多选
  15. 【数量称谓】祖宗十八代
  16. 如何用计算机玩扫雷,扫雷怎么玩_玩好扫雷游戏的技巧是什么【图文】-太平洋电脑网PConline-太平洋电脑网...
  17. Number Game(数字游戏)
  18. 计算机学院认知实习报告
  19. 9月29 Redis配置不当致使root被提权漏洞 | Found a swap file by the name swp
  20. linux 软连接 sudo ln -s 源文件 目标文件

热门文章

  1. AOSP ~ 默认属性值
  2. FB60(F-43)与MIRO的区别
  3. Kotlin Contract
  4. 【UnityFPS射击游戏】(2)制作FPS角色控制器方法②
  5. 【电气专业知识问答】问:监控系统(NCS)的报警功能有哪些?
  6. 【excel使用】批量删除excel工作簿中多个工作表的同一列内容?
  7. 修改我的文档和临时文件夹temp的位置及系统优化知识
  8. java returnAddres_java获取本机ip(排除虚拟机等一些ip)最终解,总算找到方法了...
  9. Deepin su 获取root权限失败,显示鉴定故障解决方法
  10. 历时六年,东安汽发实现自动变速器领域新突破