首页 > 编程知识 正文

词向量的表示方法,词向量长度

时间:2023-05-05 11:34:40 阅读:178485 作者:4082

本文介绍了计算句子向量和大眼睛未来向量的方法和参考代码,自然语言处理的第一步是进行文本矢量化,获得单词向量、句子向量或大眼睛未来向量,输入各种机器学习模型或深度学习模型

词向量大致可以认为词向量是文本向量的基本单位,而句向量、大眼未来向量可以通过构成大眼未来的词向量变换来计算。

关于单词的表示,例如有one-hot码、单词袋模型、分散码等。 虽然有很多相关资料,但这里引用相关资料:

一词独热表示: One-hot Representation

稀疏存储,轻松实现

灯泡: [ 0,0,0,1,0,0,0,0,0,0,0 ],灯: [ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ]

维度跨越巨大词汇鸿沟的现象:任意两个词之间是孤立的。 不知道从这两个向量中是否有两个词的关系。 “灯泡”和“灯”这个词即使是同义词也不行

2词袋模型)如语序等所示,例如用tf-idf或textrank计算出权重来表示词,不考虑单词的意思或在文档中的顺序

三个词的方差表示:分布式re presentation

传统的单热表达(one-hot representation )只是将单词符号化,不包含语义信息

“分布式保留”最早由Hinton于1986年提出。 那是低维的实数向量,这样的向量一般是这样生长的。 [0.792、0.177、0.177、0.109、0.542、…]

最大的贡献是让相关和相似的词语在距离上靠近

句子向量和眼睛大的未来向量的计算方法1 :上述词袋模型方式可以利用tf-idf直接生成句子向量和眼睛大的未来向量的代码示例:利用sklearn的TfidfVectorizer工具直接得到所需的向量

froms klearn.feature _ extraction.textimporttfidfvectorizervectorizer=tfidfvectorizer (# cut word list是在眼睛大的未来分词之后得到的列表通过计算得到的目标未来或语句的向量TF _ matrix=vectorize r.fit _ transform (cut word list ).toarray )实际上是目标未来的各个词来计算tf-idf值

方法2根据上述词嵌入模式,基于词向量的词向量得到固定特征,word2vec,fastText,glove。 基于单词向量的动态表示: elmo、GPT、bert。

由于动态词向量比静态词向量更能活用上下文信息,所以可以解决多义性问题。 在工程实践中也证明了其优越性(BERT在许多NLP任务中也很出色)。 [嵌入式技术实践总结]供参考。 [ https://Zhan.zhi Hu.com/p/143763320 ]我的理解是,网络在训练时随机地初始化词向量,然后将词向量训练为网络参数,因此动态词向量和

您可以使用开源静态语言矢量(如glove训练的中文语言矢量)来预览预训练语言矢量文件,例如:

实际上是训练过的数万个词的词矢量,这样的文本文件。 直接加载到项目中使用即可。

代码示例:

如下读取单词向量文件,取得单词的单词向量后使用

defget _ embedding s _ index (embedding s _ model _ file ) : dir _ path=OS.path.dirname (OS.path.abspath ) ) embeddings_model_file ) word_embeddings={} count=0withopen ) loot hopen encoding=' utf-8 ' (ASF : forlineinf : count=1if count 1: values=line.split (wore ) NP.asArray(values[1:],dtype=np.float64 ) exceptbaseexceptionase : # print (e ) embeddding )

dings[word] = embedding else: 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_index sent_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 / denom return sim 其他

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。