【NLP】Word2Vec模型文本分类

2023-05-16

自然语言处理之词向量模型聚类分析

Word Embedding

词嵌入向量(Word Embedding)是NLP里面一个重要的概念,我们可以利用Word Embedding一个单词固定长度向量的表示一种表示形式。Word Embedding矩阵给每个单词分配一个固定长度的向量表示,这个长度可以自行设定,这个长度相对于one hot模型的词典长度维数上要小很多,但是却可以表示更多的信息,因为Word Embedding向量中每个维度都有含义。

Word2Vec

Word2Vec是生成Word Embedding的方式,Word2Vec有很对方法例如Continuous Bag Of Words (CBOW)Skip-gram等,本次作业中使用了CBOW模型。

NN

基于神经网络的分布表示又称为词向量、词嵌入,神经网络词向量模型与其它分布表示方法一样,均基于分布假说,核心依然是上下文的表示以及上下文与目标词之间的关系的建模。 2001年, Bengio 等人正式提出神经网络语言模型( Neural Network Language Model ,NNLM),该模型在学习语言模型的同时,也得到了词向量。

输入是One-Hot Vector,Hidden Layer没有激活函数,也就是线性的单元。Output Layer维度跟Input Layer的维度一样,用的是SoftMax回归。当这个模型训练好以后,我们并不会用这个训练好的模型处理新的任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如隐层的权重矩阵。

这个模型是如何定义数据的输入和输出呢?一般分为CBOW与Skip-Gram两种模型。CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。

CBOW

而如果是拿一个词语的上下文作为输入,来预测这个词语本身,则是CBOW模型。

1 输入层:上下文单词的one hot. {假设单词向量空间dim为V,上下文单词个数为C}

2 所有one hot分别乘以共享的输入权重矩阵W. {VN矩阵,N为自己设定的数,初始化权重矩阵W}

3 所得的向量 {因为是one hot所以为向量} 相加求平均作为隐层向量, size为1N.

4 乘以输出权重矩阵W’ {NV}

5 得到向量 {1V} 激活函数处理得到V-dim概率分布

6 概率最大的index所指示的单词为预测出的中间词(target word)与true label的one hot做比较,误差越小越好(根据误差更新权重矩阵)

所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W’。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table(就是矩阵W自身),也就是说,任何一个单词的one hot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。

Skip-gram

如果是用一个词语作为输入,来预测它周围的上下文,那这个模型叫做Skip-gram模型。

PCA

PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。

K-means

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

程序实现

运行环境

Anaconda 4.9.2

断句分词

'。' '\n'标点进行断句,删除标点,并用'\n'表示一句的结束,最后调用Jiaba库进行分词。

    def sepSentences(self):
        line = ''
        sentences_list = []

        for w in self.txt:
            if w in ['。', '\n'] and line != '\n':
                if line.strip() != '':
                    sentences_list.append(line.strip())
                    line = ''
            elif w not in self.punctuation:
                line += w

        self.sentences = sentences_list

    def sepWords(self):
        words_list = []

        dete_stopwords_flag = 1
        if dete_stopwords_flag:
            for i in range(len(self.sentences)):
                words_list.extend([x for x in jieba.cut(
                    self.sentences[i]) if x not in self.stopwords])
                words_list.append('\n')
        else:
            for i in range(len(self.sentences)):
                words_list.extend([x for x in jieba.cut(self.sentences[i])])
                words_list.append('\n')

        words_str = ' '.join(words_list)
        self.words = words_str

生成词向量

调用gensim库,读取断句分词后的保存的文件,转换为词向量。

    def train(self):
        self.sepSentences()
        self.sepWords()

        with open('./SentenceFile/' + self.txtname + '_句子.txt', 'w', encoding='UTF-8') as f2:
            f2.write(self.words)

        self.sent_iter = word2vec.LineSentence(
            './SentenceFile/' + self.txtname + '_句子.txt')
        self.model = word2vec.Word2Vec(self.sent_iter, workers=1)

主成分分析与聚类

调用Sklearn库中的PCA与K-means,对词向量进行主成分分析降温,聚类。

    keys = Character

    # 获取词向量
    wordvector = []
    for key in keys:
        wordvector.append(d.model.wv[key])

    # 降维
    wordvector_ = PCA(n_components=2).fit_transform(wordvector)

    # 分类
    labels_ = KMeans(n_clusters=4).fit_predict(wordvector_)

结果输出

    # 可视化
    plt.scatter(wordvector_[:, 0], wordvector_[:, 1], c=labels_)
    for i in range(len(keys)):
        plt.annotate(text=keys[i], xy=(
            wordvector_[:, 0][i], wordvector_[:, 1][i]))
    plt.show()

运行结果

测试用例

倚天屠龙记.txt

关键词

Character = ['张无忌', '赵敏', '谢逊', '周芷若', '张翠山', '杨逍', '灭绝师太', '张三丰', '殷离', '殷素素', '小昭', '殷梨亭',
             '韦一笑', '俞岱岩', '胡青牛', '宋远桥', '殷天正', '周颠', '纪晓芙', '宋青书', '杨不悔', '金花婆婆', '说不得',
             '范遥', '丁敏君', '陈友谅', '常遇春', '鹿杖客', '莫声谷', '鹤笔翁', '朱元璋', '阳顶天', '郭襄', '成昆', '空见',
             '冷谦','彭莹玉']
Kungfu = ['太极拳', '太极剑', '真武七截阵', '九阳神功', '峨嵋九阳功', '少林九阳功', '乾坤大挪移', '九阴真经', '九阴白骨爪',
          '七伤拳', '九阳真经', '玄冥神掌']
sect = ['明教', '峨嵋派', '天鹰教', '昆仑派', '崆峒派', '武当派', '少林派', '神拳门', '华山派']

输出相近词

    # 查找相近的词
    for key in d.model.wv.similar_by_word('张无忌', topn=10):
        print(key[0], key[1])

与张无忌关系比较近的词:

赵敏 0.9944162368774414
殷素素 0.9893664717674255
张翠山 0.9883266091346741
谢逊 0.9879009127616882
低声 0.9870488047599792
周芷若 0.9858320355415344
无忌 0.9820763468742371
罢 0.9808448553085327
微笑 0.976464569568634
周颠 0.9755969047546387

比较相似度

    # 两词相近程度
    print(d.model.wv.similarity('武当', '张三丰'))

比较武当与张三丰的相近度:

0.9800525

输出聚类结果

可以大致从中看出其中人物关系,例如张无忌与赵敏、张翠山、殷素素、周芷若关系较近,玄冥二老的鹿仗客与鹤笔翁关系较近。

人物关系:
在这里插入图片描述

武功关系:
在这里插入图片描述

门派关系:
在这里插入图片描述

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

【NLP】Word2Vec模型文本分类 的相关文章

随机推荐

  • 树莓派Odroid等卡片式电脑上搭建NAS教程系列1-Ubuntu系统安装

    我用的是韩国hardkernel公司做的Odroid XU板子 xff0c 类似于树莓派香蕉派 xff0c 看下它的真面目 相关参数点他 gt Odroid XU 搭建NAS之前先来安装好Ubuntu系统 下载安装文件 在Odroid里安装
  • 立创eda学习笔记一:pcb板基础知识

    整理了一下零基础学习pcb板画图需要了解的一些基础知识 xff0c 否则后面画图很困扰 什么是pcb板 xff1f PCB xff08 Printed Circuit Board xff09 xff0c 中文名称为印制电路板 xff0c 又
  • 立创eda学习笔记二:画pcb板流程(极简入门版)

    一般PCB基本设计流程如下 xff1a 前期准备 gt PCB结构设计 gt PCB布局 gt 布线 gt 布线优化和丝印 gt 网络和DRC检查和结构检查 gt 制版 一 画原理图 完成后检查元件的封装 连线是否正确 核实电路结构 xff
  • 立创eda学习笔记十一:立创eda、立创商城、嘉立创的区别

    简单来说 xff1a 立创eda是一个画原理图和pcb的eda软件 xff0c 类似于ad 立创商城是一个卖元器件网上平台 xff0c 类似于淘宝 嘉立创是一个生产pcb板 给pcb板贴片的生产厂家 一般情况下 xff0c 你可以在立创ed
  • 立创eda学习笔记十七:铺铜

    铺铜是pcb设计很常用的指令 xff0c 或者是必然用到的指令 xff0c 很多时候布线的时候不去画gnd的线 xff0c 把其他线画好了之后 xff0c 再统一铺铜作为gnd xff0c 这样方便很多 铺铜这个概念可以理解为大面积的布线
  • 立创eda学习笔记二十六:手把手教你使用立创eda的官方教程

    可以通过以下办法找到教程 xff1a 1 xff0c 在软件界面点帮助 使用教程 2 xff0c 在网站首页 帮助 教程进入 如何使用教程 xff1a 这里是一级目录 xff0c 其实对新手最有用的是前面3个部分 xff0c 后面的仿真先不
  • 立创eda学习笔记二十四:拼板

    这里主要是两部分 xff1a 自带拼板和手动拼板 xff0c 软件自带拼板功能 xff0c 那么手动拼板当然就是自己重新画图拼板了 一般用自带拼板功能就可以了 xff0c 把单板画好之后很容易就拼好了 xff0c 完全不用动任何器件和丝印编
  • Prometheus实战教程:监控mysql数据库

    今天我们使用prometheus 43 Grafana 43 mysql exporter实现监控mysql数据库各项指标数据 mysql exporter xff1a 采集mysql数据库各项指标数据 prometheus xff1a 获
  • prometheus常用exporter下载地址大全

    1 node exporter下载 https github com prometheus node exporter releases 2 blackbox exporter下载 https github com prometheus b
  • 论文润色 ‖ 一分钟教你如何写好SCI论文里的主题句,事半功倍

    今天 xff0c 小编来分享一下论文润色 xff0c SCI论文的主题句 xff08 Topic Sentences xff09 怎么写 xff1a 01什么是主题句 xff1f 主题句通常是段落开头的一句话 xff0c 是整个段落的小主题
  • Go xml文件处理

    在开发中会常遇到xml数据序列化和反序列化 xff0c 这里我们介绍go语言处理xml数据 encoding xml 包实现了一个简单的xml 1 0解析器 xff0c 可以理解xml名称空间 读取xml 示例 xff1a package
  • UC/OS-III 消息队列

    消息队列 一 消息队列基本概念讲解1 消息队列基本概念2 消息池2 1 消息池概念2 2 消息池初始化2 3 消息队列的运作机制2 4 消息队列的阻塞机制2 5 消息队列的应用场景 二 消息队列创建步骤1 定义消息队列2 创建消息队列 三
  • Altium Designer绘制stm32f103c8t6最小系统原理图

    文章目录 前言芯片封装自定义封装原理图绘制总结 前言 本文提供了初学者绘制stm32最小系统 xff0c 同时初学者的同学可以跟着小白学习绘制原理图哦 芯片封装 提示 xff1a 下载安装好Altium Designer之后才能进行以下操作
  • Jetson Xavier NX安装opencv3.x以及踩过的坑

    Jetson Xavier NX默认安装的是opencv4 x xff0c 在很多项目中其与opencv3 x xff0c 其中opencv3与opencv4中有部分函数是完全不同的 xff08 例如点一些Point的定义 xff0c Cv
  • 【导航算法】无人机路径跟踪L1导航算法

    L1导航算法是非常经典的非线性无人机路径跟随算法 xff0c 最早由MIT于2004年提出 xff0c 论文为 A New Nonlinear Guidance Logic for Trajectory Tracking xff0c 其导航
  • 【人工智能】1.问题求解:状态空间图和盲目搜索

    什么是问题求解 xff1f 问题求解可以理解为利用知识 xff0c 尽可能有效的找到问题的解 xff0c 或者最优解的过程 xff0c 主要包括 xff1a 1 xff09 问题描述方法 xff1a 状态空间法 xff0c 与或树表示法 x
  • 【路径规划】A*三维全局路径规划(附Python实现源码)

    1 A 启发式搜索 A 算法介绍 xff1a 启发式搜索算法 xff0c 除了wiki之外比较全的一个参考资料 xff1a A 启发式搜索算法详解 人工智能 这里是用Python写了一个简单的路径规划例子供参考 2 Matplotlib库
  • 【数据结构】3.图、最小生成树

    一 图的基本概念 1 什么是图 图表示一种多对多的关系 图包括 xff1a 1 xff09 一组顶点 xff1a 通常用 V Vertex 表示顶点集合 2 xff09 一组边 xff1a 通常用 E Edge 表示边的集合 3 xff09
  • 【NLP】主题模型文本分类

    自然语言处理之主题模型文本分类 LDA主题模型 1 主题模型 xff08 Topic Model xff09 主题模型是以非监督学习的方式对文集的隐含语义结构进行聚类的统计模型 主题模型主要被用于自然语言处理中的语义分析和文本挖掘问题 xf
  • 【NLP】Word2Vec模型文本分类

    自然语言处理之词向量模型聚类分析 Word Embedding 词嵌入向量 Word Embedding 是NLP里面一个重要的概念 xff0c 我们可以利用Word Embedding一个单词固定长度向量的表示一种表示形式 Word Em