本文介绍一种计算句向量和文章向量的方法及参考代码,自然语言处理的第一步即是要进行文本的向量化,包括获得词向量,句向量或者文章向量,以便输入各种机器学习模型或者深度学习模型。

词向量

可以笼统的认为词向量是文本向量的基本单位,句向量、文章向量都可以由构成文章的词向量转化计算得到。
关于词的表示,比如one-hot编码,词袋模型,分布式编码等等。相关资料有很多,此处引用相关资料:

1 词的独热表示:One-hot Representation
采用稀疏方式 存储,简单易实现
灯泡:[0,0,0,0,0,1,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]
维度过大词汇鸿沟现象:任意两个词之间都是孤立的。光从这两个向量中看不出两个词是否有关系,哪怕”灯泡”和”灯管”这两个词是同义词也不行
2 词袋模型: 类似用词频等表示,比如tf-idf或textrank计算的权重来表示词,不会考虑单词的语义及它们在文档中的顺序
3 词的分布式表示:Distributed representation
传统的独热表示( one-hot representation)仅仅将词符号化,不包含任何语义信息
Distributed representation 最早由 Hinton在 1986 年提出。它是一种低维实数向量,这种向量一般长成这个样子: [0.792, −0.177, −0.107, 0.109, −0.542, …]
最大的贡献就是让相关或者相似的词,在距离上更接近了

句向量和文章向量计算方法

方法1:前面提到的词袋模型方式,可以用tf-idf直接生成句向量或文章向量

代码示例:直接用sklearn的TfidfVectorizer工具来获得所需向量

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
# cutWordList是文章分词后得到的列表,tf_matrix即是得到的文章或者句子的向量
tf_matrix = vectorizer.fit_transform(cutWordList).toarray()

实际上是文章的每个词,计算得到tf-idf值,然后放到一个array里得到的向量,由此也可以用词的textrank权值,统一按由大到小的顺序放在一个array得到一篇文章的向量

方法2 根据前面提到的词嵌入模式得到词向量

基于词向量的固定表征:word2vec、fastText、glove。 基于词向量的动态表征:elmo、GPT、bert。
动态词向量相较于静态词向量,更加充分利用了上下文信息,所以可以解决一词多义的问题。在工程实践上其优越性也得到了证明(BERT 在多个 NLP 任务中也表现优异)。参考阅读:[embedding 技术实践总结]。(https://zhuanlan.zhihu.com/p/143763320)这块我的理解是网络在训练的时候,随机初始化词向量,然后将词向量作为网络参数来进行训练,故此成为动态词向量

可以用一些开源的静态词向量如glove训练的中文词向量来做,如下是一份预训练词向量文件预览:

实际是训练好的几万个常用词的词向量,这样一个文本文件。项目中直接加载进来使用即可。
代码示例:
如下是对词向量文件进行读取,获取词的词向量以便使用

def get_embeddings_index(embeddings_model_file):dir_path = os.path.dirname(os.path.abspath(__file__))#dir_path = os.path.dirname(dir_path)local_path = os.path.join(dir_path, embeddings_model_file)word_embeddings = {}count = 0with open(local_path, encoding='utf-8') as f:for line in f:count += 1if count > 1:values = line.split()word = values[0]try:embedding = np.asarray(values[1:], dtype=np.float64)except BaseException as e:#print(e)embedding = np.asarray(values[2:], dtype=np.float64)word_embeddings[word] = embeddingelse:print('词向量信息:%s' % line)return word_embeddings

接着就可以用词向量来构建句向量或者文章向量了,此处以句向量的构建为例

def get_sentence_vector(words_list,embedding_dim=300):'''获取内容的向量:param sentence: 句子:param embedding_dim:  向量维度:return: 一个句子的特征维度'''global embeddings_index#embeddings_index = get_all_sentences_vector_mul.embeddings_indexsent_matrix = np.zeros((len(words_list), embedding_dim),dtype = np.float64) #初始化空矩阵for i in range(len(words_list)):if words_list[i]:embedding_vector = embeddings_index.get(words_list[i])if embedding_vector is not None and len(embedding_vector)>=embedding_dim: #使用的词向量库 有的词长短不一致if embedding_vector.shape != embedding_dim:sent_matrix[i] = embedding_vector#字向量构造句向量,向量点乘,然后取范数,先是构造1x8的全1矩阵,与8x300的向量做点积,相当于每个词向量中对应元素相加(300列,每列一个词向量的浮点值),即词向量叠加组成句向量,除以该句向量的模,做个单位化d =  np.dot(np.ones((1,len(words_list)),dtype = np.float64),sent_matrix)norm= np.linalg.norm(d, axis=1, keepdims=True)   # 向量的2范数,相当于向量的莫vector = d/norm   #向量除以向量模,相当于单位化return vector[0]

得到句向量之后就可以进行各种操作了,比如进行聚类或者进行相似度计算

文章余弦相似度计算示例

可以直接看代码示例:一个计算余弦相似度的接口,传入两个句向量或者文章向量后,计算返回两个句子或者两篇文章的余弦相似度值。

def cos_sim(vector_a, vector_b):"""计算两个向量之间的余弦相似度:param vector_a: 向量 a:param vector_b: 向量 b:return: sim"""vector_a = np.mat(vector_a)vector_b = np.mat(vector_b)num = float(vector_a * vector_b.T)denom = np.linalg.norm(vector_a) * np.linalg.norm(vector_b)sim = num / denomreturn sim

其他

一些深度学习模型进行文本分类或者其他NLP任务如摘要提取,通常是动态计算文章向量,比如用bert+rnn等进行文本分类,因为Bert等模型对输入格式有要求,所以需要特殊处理来得到相应向量,输入模型。

词向量表示和句向量、文章向量计算方法相关推荐

  1. 中文自然语言处理向量合集(字向量,拼音向量,词向量,词性向量,依存关系向量)

    ChineseEmbedding Chinese Embedding collection incling token ,postag ,pinyin,dependency,word embeddin ...

  2. 欢简述常见的语言表示模型(词嵌入、句表示、篇章表示)

    简述常见的语言表示模型(词嵌入.句表示.篇章表示) 在cips2016出来之前,笔者也总结过种类繁多,类似词向量的内容,自然语言处理︱简述四大类文本分析中的"词向量"(文本词特征提 ...

  3. 第2章 词向量表示 GloVe word2vec skip-gram CBOW

    第2章 词向量表示 GloVe word2vec skip-gram CBOW 1 如何在模型中表示文本数据? 1.1 独热编码(one-hot encoding) 1.2 分布式表示(distrib ...

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

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

  5. cs224n第二讲:简单的词向量表示:word2vec, Glove

    第二讲:简单的词向量表示:word2vec, Glove How do we represent words? 在处理所有NLP任务的时候,我们首先需要解决非常重要的一个问题(可能是最重要的):用什么 ...

  6. 自然语言处理中传统词向量表示VS深度学习语言模型(一)

    此博客内容是本人在学习自然语言模型中的一些学习和总结,之所以记录下来,也是自己对相关知识的一种巩固,正所谓好记性不如烂笔头.好啦!闲话不多说,开始进入正题! 随着近几年deep learning 的发 ...

  7. NLP学习__task3: : 特征提取:TF-IDF、词向量表示、互信息原理、特征筛选

    1 TF-IDF原理 TF-IDF原理在另一篇博客:关键词抽取模型  已经提及,这里不在重复. 2 文本矩阵化 笔者理解的文本矩阵化,即将文本进行"词向量化".这里简述常见的语言表 ...

  8. 【运筹学】线性规划 单纯形法 ( 原理 | 约定符号 | 目标系数矩阵 C | 目标函数变量矩阵 X | 约束方程常数矩阵 b | 系数矩阵 A | 向量 | 向量符号 | 向量 Pj )

    文章目录 I . 单纯形法 引入 II . 单纯形法 基本原理 III . 线性规划 标准形式 IV . 线性规划 标准形式 普通形式公式 V . 线性规划 标准形式 展开完整形式公式 VI . 线性 ...

  9. 线性代数(4)—— 向量与向量组的线性相关性

    参考:张宇高等数学基础30讲 文章目录 1. 引入 2. 向量的概念和运算 3. 向量组的线性表出与线性相关 3.1 基础概念 3.2 线性相关.线性无关的进一步说明 4. 判别线性相关性的七大定理 ...

最新文章

  1. linux 文件查找及定位
  2. Warning message:In a + b : longer object length is not a multiple of shorter object length
  3. PHP_SCREW 加密
  4. 4.1 简单方程的解
  5. P3591 [POI2015]ODW(分块)
  6. 前端中什么是中台开发环境_Web前端开发中需要学习什么?会使用到哪些开发工具?...
  7. 【Python】Python库之虚拟现实
  8. 赶在520之前,程序员如何用Python送上最特别的“我爱你”表白
  9. Python基础----字典
  10. 靠写代码赚钱的一些门路
  11. 已解决:fastclick插件在IOS系统上点击input需要双击或长按才有效
  12. 【python】拉格朗日插值法 和 牛顿插值法
  13. FPGA构建人工神经网络系统应用实例——视障人士便携导航系统
  14. 火山视窗选择夹内使用右键菜单演示
  15. java中的Properties配置文件
  16. rtl8812bu网卡Linux驱动,Linux 安装 RTL8812AU 无线 USB 网卡驱动
  17. django tests 小结
  18. GEE-Python遥感大数据分析
  19. 买二手房不后悔先知道8件事 高楼层未必卖得好
  20. 基于云服务器 B/S模式 JavaWeb RFID 图书借阅管理系统

热门文章

  1. 约束非线性优化(fmincon)——优化工具包
  2. 公司绝对不会告诉你的20个潜规则
  3. html5文本缩进元素,CSS属性参考 | text-indent
  4. 和Excel函数date同样功能的VBA函数DateSerial用法
  5. 3D空间转换(位移、旋转、立体呈现)
  6. iOS 获取手机型号,系统版本
  7. 本人用foxpro写的房屋产权产籍管理系统
  8. Android之Android studio实现智能聊天机器人
  9. linux iic驱动整理(一)
  10. 防火墙Mangle-简介从零开始学RouterOS系列07