1 1在Keras的Embedding层中使用预训练的word2vec词向量:https://blog.csdn.net/u012052268/article/details/90238282

import numpy as np
import pandas as pd#1准备工作# graph LR
# 文本-->分词
# 分词-->训练词向量
# 训练词向量-->保存词向量import gensim
#训练自己的词向量,并保存def trainWord2Vec(filePath):sentences = gensim.models.word2vec.LineSentence(filePath)#读取分词后的文本model = gensim.models.Word2Vec(sentences, size=100, window=5, min_count=1, workers=4)#训练模型model.save('./CarComment_vord2vec_100')def testMyWord2Vec():#读取自己的词向量,并简单测试一下效果inp = './CarCommennt_vord2vec_100' #读取词向量model = gensim.models.Word2Vec.load(inp)print('空间的词向量(100维):', model['空间'])print('打印与空间最相近的5个词语:', model.most_similar('空间', topn=5))if __name__ == '__main__':testMyWord2Vec()pass#通过上述,我们就拥有了预训练的词向量文件CarCommennt_vord2vec_100# 转化词向量为keras所需格式
#keras中使用的embedding层,embedding层所需要的格式为一个巨大的“矩阵”:第i列表示词索引为i的词的词向量
#思路:embedding层,提供一个【word:word_vector]的词典来初始化embedding层中所需要的的大矩阵,并且标记为不可训练# 获取所有词语word和词向量
#首先导入预训练的词向量
myPath = './CarCommennt_vord2vec_100' #本地词向量的位置
Word2VecModel = gensim.models.Word2Vec.load(myPath) # 读取词向量
vector = Word2VecModel.wv['空间']  #词语的向量,是numpy格式#gensim的word2vec模型 把所有的单词和 词向量 都存储在了Word2VecModel.wv里面,讲道理直接使用这个.wv即可print(type(Word2VecModel.wv)) #结果为Word2VecKeyedVectorsfor i,j in Word2VecModel.wv.vocab.items():print(i) #此时i 代表每个单词print(j) #j代表封装了词频等信息的gensim“Vocab”对象,例子:Vocab(count:1481, index:38, sample_int:3701260191)break#2.2 构造“词语——词向量”字典#构造一个list存储所有的单词:vocab——list存储所有词语
#构造一个字典word_index:{word:index}, key是每个词语,value是单词在字典中的序号。
#在后期tokenize(序号化)训练集的时候就是用该词典#构造一个大向量矩阵embedding_matrix(按照embedding层的要求):行数为所有单词数,比如10000;列数为词向量维度,比如100.#构造包含所有词语的list,以及初始化“词语-序号”字典和“词向量”矩阵vocab_list = [word for word, Vocab in Word2VecModel.wv.vocab.items()]#存储所有的词语
word_index = {" ": 0}#初始化‘[word:token]',后期tokenize语料库就是用该词典
word_vector = {} #初始化’[word:vector]'字典#初始化存储所有向量的大矩阵,留意其中多一位(首行),词向量全为0,用于padding补零
#行数为所有单词+1,比如10001;列数为词向量维度,比如100embedding_matrix = np.zeros((len(vocab_list)+1),Word2VecModel.vector_size)#2.3 填充字典和矩阵
#填充上述步骤中的字典和大矩阵for i in range(len(vocab_list)):word = vocab_list[i] #每个词语word_index[word] = i+1 #词语:序号word_vector[word] = Word2VecModel.wv[word]#词语:词向量embedding_matrix[i+1] = Word2VecModel.wv[word] #词向量矩阵#2.4在keras的embedding层中使用与驯良词向量from keras.layers import Embeddingfrom keras.utils.np_utils import *#from…import *:是把一个模块中所有函数都导入进来; 注:相当于:相当于导入的是一个文件夹中所有文件,所有函数都是绝对路径。
EMBEDDING_DIM = 100 #词向量维度embedding_layer = Embedding(input_dim=len(embedding_matrix),#字典长度EMBEDDING_DIM, #词向量长度100weights= [embedding_matrix],#重点:预训练的词向量系数input_length=MAX_SEQUENCE_LENGTH,#每句话的最大长度(必须paddingtrainable=False) #是否在训练的过程中更新词向量#此时输入EMbedding层的数据的维度是,形如(samples,sequence_length)的2D张量
#3D张量:(samples,sequence_length,embeding_matrix)#*2.5不使用“预训练”而直接生成词向量模型
#我们也可以直接使用KERAS自带的Embedding层训练词向量,而不用预训练的word2vec词向量。
embedding_layer = Embedding(len(word_index)+1,#由于没有预训练,设置 +1EMBEDDING_DIM,input_length = MAX_SEQUENCE_LENGTH)#一般来说,在自然语言处理任务中,当样本数量非常少时,使用预训练的词向量是可行的。(实际上,预训练的词向量引入了外部语义信息# 3整体代码:在Keras模型中使用预训练的词向量
#文本数据预处理,将每个文本样本转换为一个数字矩阵,矩阵的每一行表示一个词向量。# 3.1 读取数据
def load_file():dataFrame_2016 = pd.read_csv('data\\nlpcc2016_traindata_zong_right.csv', encoding='utf-8')print(dataFrame_2016.coloumns) #打印列的名称texts = [] #存储读取的xlabels = [] #存储读取的y#遍历获取数据for i in range(len(dataFrame_2016)):texts.append(dataFrame_2016.iloc[i].q_text)##每个元素为一句话“《机械设计基础》这本书的作者是谁?”labels.append(dataFrame_2016.iloc[i].q_type)#每个元素为一个int 代表类别 # [2, 6, ... 3] 的形式#把类别从int3转换为(0,0,0,1,0,0)的形式labels = to_categorical(np.assarray(labels))## keras的处理方法,一定要学会# 此时为[[0. 0. 1. 0. 0. 0. 0.]....] 的形式return texts,labels#3.2句子分词
import jieba
#jieba.lcut生成为一个列表
def cut_sentence2word(texts):texts = [jieba.lcut(Sentence.repalce('\n','')) for Sentence in texts]#句子分词return texts#构造词向量字典#获取word2vec模型,并构造,词语index字典,词向量字典
import os
## 3.获取word2vec模型, 并构造,词语index字典,词向量字典
def get_word2vec_dictionaries(texts):def get_word2vec_model(texts=None): # 获取 预训练的词向量 模型,如果没有就重新训练一个。if os.path.exists('data_word2vec/Word2vec_model_embedding_25'): # 如果训练好了 就加载一下不用反复训练model = Word2Vec.load('data_word2vec/Word2vec_model_embedding_25')# print(model['作者'])return modelelse:model = Word2Vec(texts, size = EMBEDDING_DIM, window=7, min_count=10, workers=4)model.save('data_word2vec/Word2vec_model_embedding_25') # 保存模型return modelWord2VecModel = get_word2vec_model(texts) #  获取 预训练的词向量 模型,如果没有就重新训练一个。vocab_list = [word for word, Vocab in Word2VecModel.wv.vocab.items()]  # 存储 所有的 词语word_index = {" ": 0}# 初始化 `[word : token]` ,后期 tokenize 语料库就是用该词典。word_vector = {} # 初始化`[word : vector]`字典# 初始化存储所有向量的大矩阵,留意其中多一位(首行),词向量全为 0,用于 padding补零。# 行数 为 所有单词数+1 比如 10000+1 ; 列数为 词向量“维度”比如100。embeddings_matrix = np.zeros((len(vocab_list) + 1, Word2VecModel.vector_size))## 填充 上述 的字典 和 大矩阵for i in range(len(vocab_list)):word = vocab_list[i]  # 每个词语word_index[word] = i + 1  # 词语:序号word_vector[word] = Word2VecModel.wv[word] # 词语:词向量embeddings_matrix[i + 1] = Word2VecModel.wv[word]  # 词向量矩阵return word_index, word_vector, embeddings_matrix
#3.4文本序号化Tokenizer
#英文文本不用切词,因为默认会将空格将词切开,就需要切词,且每个词用空格隔开
from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer(num_words = 2000) #建一个2000个单词的字典
tokenizer.fit_on_texts(train_texts)#当然我们也可以使用之前构建的word——index字典。手动构建tokenizer句子(推荐这种方法,这样序号下标与预训练词向量一致。from keras.preprocessing import  sequence
#序号化文本,tokenizer句子,并返回每个句子所对应的词语索引
def tokenizer(texts,word_index):data = []for sentence in texts:new_txt = []for word in sentence:try:new_txt.append(word_index[word]) #把句子中的词语转化为indexexcept:new_txt.append(0)data.append(new_txt)texts = sequence#3.5 切分数据
from sklearn.model_selection import train_test_split
def split_data(texts,labels):x_train, x_test, y_train, y_test = train_test_split(texts,labels,test_size=0.2)return x_train,x_test,y_train,y_testembedding_layer = Embedding(input_dim=len(embeddings_matrix),  # 字典长度output_dim = EMBEDDING_LEN,  # 词向量 长度(25)weights=[embeddings_matrix],  # 重点:预训练的词向量系数input_length=MAX_SEQUENCE_LENGTH,  # 每句话的 最大长度(必须padding) 10trainable=False,  # 是否在 训练的过程中 更新词向量name= 'embedding_layer')

本文的部分工作、代码、数据共享到gethub网站《使用多层级注意力机制和keras实现问题分类》:https://github.com/xqtbox/question-classification-with-multi-level-attention-mechanism-and-keras

2 QA match/文本匹配/文本分类/文本embedding/文本聚类/文本检索:https://github.com/MachineLP/TextMatch

3 文本相似度计算/文本匹配
https://github.com/JepsonWong/Text_Matching

文本相似度、文本匹配、文本聚类相关推荐

  1. 利用文本相似度进行英文文本分类(C++实现)

    利用文本相似度进行英文文本分类(C++实现).仅用于应付课程小作业. 代码在链接:利用文本相似度进行英文文本分类(C++实现)-C++文档类资源-CSDN下载 文本分类是自然语言处理中比较常见且重要的 ...

  2. NLP点滴——文本相似度,计算文本间的距离

    前言 在自然语言处理过程中,经常会涉及到如何度量两个文本之间的相似性,我们都知道文本是一种高维的语义空间,如何对其进行抽象分解,从而能够站在数学角度去量化其相似性.而有了文本之间相似性的度量方式,我们 ...

  3. python 文本相似度现状_python文本相似度分析

    如何用python计算文本的相似度 同学欢迎来到CSS布局HTML~文本的相似度计算是NLP(自然语言处理)方向的范畴,感兴趣可以找相关的书籍详细学习研究.同学问的这个问题,可以搜索:python文本 ...

  4. python文本相似度分析_文本相似度分析(基于jieba和gensim)

    ##基础概念 本文在进行文本相似度分析过程分为以下几个部分进行, 文本分词 语料库制作 算法训练 结果预测 分析过程主要用两个包来实现jieba,gensim jieba:主要实现分词过程 gensi ...

  5. 使用BERT做中文文本相似度计算与文本分类

    转载请注明出处,原文地址: https://terrifyzhao.github.io/2018/11/29/使用BERT做中文文本相似度计算.html 简介 最近Google推出了NLP大杀器BER ...

  6. python 文本聚类可视化_Python 文本相似度和聚类

    Python 文本相似度和聚类 文本数据是非结构化的和高噪声的.在执行文本分类时,拥有标记合理的训练数据和有监督学习大有裨益.但是,文档聚类是一个无监督的学习过程,将尝试通过让机器学习各种各样的文本文 ...

  7. 基于隐马尔科夫模型文本相似度问题研究

    文本相似度是表示两个或者多个文本之间匹配程度的一个度量参数,相似度数值大,说明文本相似度高:反之文件相似程度就低.文本相似度的精确计算问题是进行信息处理的关键. 在如今信息技术飞速发展的互联网时代,文 ...

  8. java 知网 语义 相似度,基于知网语义相似度的中文文本分类研究 论文笔记

    基于知网语义相似度的中文文本分类研究 1.传统的文本处理大部分是根据词频和逆向文档频率将文本表示成向量空间模型,实践证明这种模型确实简单高效并且得到了广泛应用,但这种模型表示缺乏对语义的理解,忽略了词 ...

  9. 基于词频的文本相似度

    基于词频的文本相似度 文本 分词 统计词频 词频向量 相似度计算 应用 项目源码: https://github.com/zhang2172268/mygit/tree/master/textSimi ...

最新文章

  1. C语言之分支结构 if(一)
  2. [Spring mvc 深度解析(二)] Tomcat分析
  3. hive内表和外表区别(转载+自己整理)
  4. linux c进程和线程脑图,进程和线程
  5. 你知道WPF这三大模板实例运用吗?
  6. Python内置函数sorted()和列表方法sort()排序规则不得不说的事
  7. 小沙的步伐(枚举+暴力)
  8. Win10系列:VC++绘制几何图形2
  9. 移动端(html5)富文本编辑器,vue移动端中使用vue-html5-editor富文本编辑器详解
  10. Qt 远程开关机 WakeOnLAN 编辑MagicPacket
  11. 电脑怎么显示文件后缀名?3个步骤
  12. 遭遇Trojan.PSW.ZhengTu,Trojan.PSW.OnlineGames,Trojan.PSW.ZhuXian.b等
  13. 【MySQL5.7指南】第一章——概述
  14. java上传文件的要点_Uploadify上传文件方法
  15. 【简易爬虫】找回B站“已失效视频”的相关信息
  16. Typora 设置代码块的默认编程语言以及字体颜色设置
  17. 树莓派安装部署OpenVINO
  18. css3 烟 蚊香_HTML5前端特效库 css3 按钮粒子烟花特效源码
  19. .NET 5.0 正式版发布了!
  20. 车辆监控php原码下载,物流车辆视频监控系统解决方案

热门文章

  1. 使用ASP.net 2.0 的一些新特性
  2. 求2个数的最大公约数
  3. 由c语言转向c++,我们需要做什么?
  4. 攻防比赛_2020年度泉州市大学生网络安全攻防比赛在黎明职业大学圆满落幕
  5. c语言中二维数组中产生随机数,C语言中是如何进行随机数生成的[多图]
  6. 【Pytorch神经网络理论篇】 21 信息熵与互信息:联合熵+条件熵+交叉熵+相对熵/KL散度/信息散度+JS散度
  7. Tensorboard --logdir=logs 无法显示图像的处理办法
  8. mysql 用户管理表_Mysql—用户表详解(mysql.user)
  9. python简笔画怎么画_怎样用tk语句在Python下画一棵树
  10. LeetCode 940. 不同的子序列 II(动态规划)