当前位置:   article > 正文

keras 生成句子向量 词向量_自然语言处理——使用词向量(腾讯词向量)

向量生成工具

向量化是使用一套统一的标准打分,比如填写表格:年龄、性别、性格、学历、经验、资产列表,并逐项打分,分数范围[-1,1],用一套分值代表一个人,就叫作向量化,虽然不能代表全部,但至少是个量度。因此,可以说,万物皆可向量化。

词向量

同理,词也可以向量化word2vec(word to vector),可以从词性、感情色彩、程度等等方面量度,用一套分值代表一个词,从而词之间可以替换,比较。词与向量间的转换过程就叫作词的向量化。与人为评分不同的是,词向量一般通过训练生成,其每一维量度的作用也并不明确。词向量化常用于提取词的特征,提取后的特征再代入模型计算。

词向量如下图所示:

eb0a240e39cf98637a3f9f3e74712598.png
图片出自 https://jalammar.github.io/illustrated-word2vec/

上图把每个单词映射到50个维度(用50种特征表示一个词),每个维度在[-1,1]范围内取值,上图中1为红色,0为白色,-1为蓝色,中间各值为过渡色,从图中可以直观看到词间的相似度。 获取了词向量之后,除了可以计算词间或句间相似度,查找近义词,代入模型以外,还可以做组合词义,以及排除某种含义,如下图所示:

adb3e7263f9c9c4eeaa570bfc4f96215.png
图片出自 https://jalammar.github.io/illustrated-word2vec/

Gensim

Gensim是一款常用的自然语言处理工具,提供Python三方工具包,常用于从文本中提取特征,提供TF-IDF,LSA,LDA,word2vec等功能。开发者可以用它训练自己的词向量,也可以使用他人训练好的词向量。

使用Gensim支持用数据训练词向量,网上例程很多。其原理是一种无监督学习,通过代入大量文章,根据各个词与其上下文关系,挖掘词义。一般自然语言处理的深度学习模型的第一层都是词向量化,因此,除了使用Gensim训练,还可以从其它模型中导出词向量。需要注意的是:高相似度表示两个词通常可以互换。并不一定是同义词,很多情况下,替换成反意词后句子也能读通,但含义完全不同。

腾讯词向量

腾讯词向量提供800多万中文词条,每个词条展开成200维向量,解压后16G。它使用Directional Skip-Gram(Skip-Gram的改进版)训练而成,可使用Ginsim调用。相对于传统的同义词词林和词表,可以说非常先进了。它提供的是通常意义上的词义,但对于具体任务不是很完美。可从以下网址下载腾讯词向量: https://ai.tencent.com/ailab/nlp/embedding.html 下面是官方示例。

2895471ae796325e84e9ec2847235ecb.png

那么何时选择腾讯词向量,何时又需要自己训练模型计算词向量?二者各有利弊,腾讯词向量体量大,速度慢,但涵盖的词和短语非常丰富,准确率也比较高。如果使用模型训练,则可针对某一目标训练,比如判别感情色彩时,某个词的表征和通常情况下的表征很可能有所不同,模型训练需要有足够的训练集,还要考虑模型支持词表(以字为单位还是以词为单位,如何分词),向量维度等等问题,难度更大,选择应视情况而定。

示例:

找近义词

  1. from gensim.models import KeyedVectors
  2. file = '/exports/nlp/Tencent_AILab_ChineseEmbedding.txt'
  3. wv_from_text = KeyedVectors.load_word2vec_format(file, binary=False) # 加载时间比较长
  4. wv_from_text.init_sims(replace=True)
  5. word = '膝关节置换手术'
  6. if word in wv_from_text.wv.vocab.keys():
  7. vec = wv_from_text[word]
  8. print(wv_from_text.most_similar(positive=[vec], topn=20))
  9. else:
  10. print("没找到")

其运行结果如下图所示,看似比较合理。

52e5af703b23b8b6b3a199666886c028.png

有一些专有名词或者短语,可能没收录在词库中,这种情况下可以使用先拆词,对其中各个词分别映射向量,然后取均值的方法计算。

计算词距

  1. print(wv_from_text.distance("喜欢", "讨厌")) # 0.299
  2. print(wv_from_text.distance("喜欢", "爱")) # 0.295
  3. print(wv_from_text.distance("喜欢", "西瓜")) # 0.670

这里指的距离,并不是近义词或者反义词,只是句中该处是否可被另一个词替换的可能性

计算字串距离

  1. print(wv_from_text.n_similarity(['风景', '怡人'],['山美','水美'])) # 0.60
  2. print(wv_from_text.n_similarity(['风景', '怡人'],['上','厕所'])) # 0.43
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号