词向量应用技巧

1、计算两个句子相似度,句子表征(工业界效果较好)

参考:https://www.zhihu.com/question/29978268/answer/55338644?utm_source=wechat_session&utm_medium=social&utm_oi=795302198023192576

原材料:整理好的词表比如 10W个词,已经训好的词向量,如 Word2vec ,已经分好词的句子a:

步骤:(1)跑出10W个词的词向量,按照词索引构成 10w维向量 Wd

(2)跑出句子a中每个词的词向量 Wav ,用Wd中每一维度分别与句子中每个词进行相似度计算,每一维度都取相似度最大的值,最后得到一个10W句子表达向量,原作者取了句子中每个词最相似的TOP10。

2、未登录词技巧:

OOV(out of vocabulary,OOV)未登录词向量问题

未登录词可以粗略划分为如下几种类型:
①新出现的普通词汇,如博客、房奴、给力等,尤其在网络用语中这种词汇层出不穷。
②专有名词(proper names)。专有名词在早期主要是指人名、地名和组织机构名这三类实体名称。1996年第六届信息理解会议对此进行了扩展,首次提出了命名实体(named entity)的概念,新增了时间和数字表达(日期、时刻、时段、数量值、百分比、序数、货币数量等),并且地名被进一步细化为城市名、州(省)名和国家名称等。
③专业名词和研究领域名称。特定领域的专业名词和新出现的研究领域名称也是造成生词的原因之一,如三聚氰胺、苏丹红、禽流感、堰塞湖等。
④其他专用名词,如新出现的产品名,电影、书籍等文艺作品的名称,等等。

该问题在kaggle的《Toxic Comment Classification Challenge》提供了一些解决办法。
---------------------
原文:https://blog.csdn.net/sinat_26917383/article/details/83584728
   https://blog.csdn.net/sinat_26917383/article/details/83999966

笔者借鉴了fasttext之中的方式,当出现未登录词或短语的时候,会:

  • 先将输入词进行n-grams
  • 然后去词表之中查找
  • 查找到的词向量进行平均

主要函数可见:

 1 import numpy as np
 2
 3 def compute_ngrams(word, min_n, max_n):
 4     #BOW, EOW = (‘<‘, ‘>‘)  # Used by FastText to attach to all words as prefix and suffix
 5     extended_word =  word
 6     ngrams = []
 7     for ngram_length in range(min_n, min(len(extended_word), max_n) + 1):
 8         for i in range(0, len(extended_word) - ngram_length + 1):
 9             ngrams.append(extended_word[i:i + ngram_length])
10     return list(set(ngrams))
11
12
13 def wordVec(word,wv_from_text,min_n = 1, max_n = 3):
14     ‘‘‘
15     ngrams_single/ngrams_more,主要是为了当出现oov的情况下,最好先不考虑单字词向量
16     ‘‘‘
17     # 确认词向量维度
18     word_size = wv_from_text.wv.syn0[0].shape[0]
19     # 计算word的ngrams词组
20     ngrams = compute_ngrams(word,min_n = min_n, max_n = max_n)
21     # 如果在词典之中,直接返回词向量
22     if word in wv_from_text.wv.vocab.keys():
23         return wv_from_text[word]
24     else:
25         # 不在词典的情况下
26         word_vec = np.zeros(word_size, dtype=np.float32)
27         ngrams_found = 0
28         ngrams_single = [ng for ng in ngrams if len(ng) == 1]
29         ngrams_more = [ng for ng in ngrams if len(ng) > 1]
30         # 先只接受2个单词长度以上的词向量
31         for ngram in ngrams_more:
32             if ngram in wv_from_text.wv.vocab.keys():
33                 word_vec += wv_from_text[ngram]
34                 ngrams_found += 1
35                 #print(ngram)
36         # 如果,没有匹配到,那么最后是考虑单个词向量
37         if ngrams_found == 0:
38             for ngram in ngrams_single:
39                 word_vec += wv_from_text[ngram]
40                 ngrams_found += 1
41         if word_vec.any():
42             return word_vec / max(1, ngrams_found)
43         else:
44             raise KeyError(‘all ngrams for word %s absent from model‘ % word)
45
46 vec = wordVec(‘千奇百怪的词向量‘,wv_from_text,min_n = 1, max_n = 3)  # 词向量获取
47 wv_from_text.most_similar(positive=[vec], topn=10)    # 相似词查找

compute_ngrams函数是将词条N-grams找出来,譬如:

compute_ngrams(‘萌萌的哒的‘,min_n = 1,max_n = 3)
>>> [‘哒‘, ‘的哒的‘, ‘萌的‘, ‘的哒‘, ‘哒的‘, ‘萌萌的‘, ‘萌的哒‘, ‘的‘, ‘萌萌‘, ‘萌‘]

这边没有沿用fasttext之中的<>来区分词头、词尾。

wordVec函数是计算未登录词的,其中笔者小小加了一些内容,就是:当出现oov的情况下,最好先不考虑单字词向量,如果能匹配到两个字以上的内容就优先进行平均。

在得到未登录词或短语的向量之后,就可以快速进行查找,gensim里面是支持给入向量进行相似词查找:

wv_from_text.most_similar(positive=[vec], topn=10)

原文地址:https://www.cnblogs.com/cupleo/p/10275582.html

时间: 2024-07-31 19:53:22

词向量应用技巧的相关文章

词向量

自然语言处理-词向量 引言 在计算机视觉中,作为输入的图片可以直接数值化.在语言识别中,作为输入的语音也可以直接数值化.而在自然语言处理中,我们无法将文字直接数值化,为了能够让计算机处理文字,我们需要将文字映射到一个数值空间.由于词是组成语义的基本单位,所以对词的表述就显得尤为重要,我们把词的数值(表征)表示为Word Representation,一般来说,词向量经常指Word Embedding,也称Distributed Word Representation. 摘要 从Word Repr

Windows下使用Word2vec继续词向量训练

word2vec是Google在2013年提出的一款开源工具,其是一个Deep Learning(深度学习)模型(实际上该模型层次较浅,严格上还不能算是深层模型,如果word2vec上层再套一层与具体应用相关的输出层,如Softmax,便更像是一个深层模型),它将词表征成实数值向量,采用CBOW(Continuous Bag-Of-Words Model,连续词袋模型)和Skip-Gram(Continuous Skip-GramModel)两种模型.具体原理,网上有很多. 本文是在window

word2vec词向量训练及中文文本相似度计算

本文是讲述如何使用word2vec的基础教程,文章比较基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python下载地址:http://radimrehurek.com/gensim/models/word2vec.html 1.简单介绍 参考:<Word2vec的核心架构及其应用 · 熊富林,邓怡豪,唐晓晟 · 北邮2015年> <Word2vec的工作原理及应用探究 · 周练 · 西安电子科技大学

词向量(WordVector)

Reference:http://licstar.net/archives/328 (比较综合的词向量研究现状分析) 起源:One-hot Representation.PCA 序:为什么NLP在模式识别里面比较难? Licstar的文章开头这么提到:语言(词.句子.篇章等)属于人类认知过程中产生的高层认知抽象实体,而语音和图像属于较为底层的原始输入信号. 语音.图像数据表达不需要特殊的编码,而且有天生的顺序性和关联性,近似的数字会被认为是近似特征.然而语言就麻烦了. 比如通俗的One-hot

词向量( Distributed Representation)工作原理是什么

原文:http://www.zhihu.com/question/21714667 4 个回答 83赞同反对,不会显示你的姓名 皮果提 刘鑫.莫教授要养猫.Starling Niohuru 等人赞同 要将自然语言交给机器学习中的算法来处理,通常需要首先将语言数学化,词向量就是用来将语言中的词进行数学化的一种方式. 一种最简单的词向量方式是 one-hot representation,就是用一个很长的向量来表示一个词,向量的长度为词典的大小,向量的分量只有一个 1,其他全为 0, 1 的位置对应

【paddle学习】词向量

本章我们介绍词的向量表征,也称为word embedding.词向量是自然语言处理中常见的一个操作,是搜索引擎.广告系统.推荐系统等互联网服务背后常见的基础技术. 在这些互联网服务里,我们经常要比较两个词或者两段文本之间的相关性.为了做这样的比较,我们往往先要把词表示成计算机适合处理的方式.最自然的方式恐怕莫过于向量空间模型(vector space model). 在这种方式里,每个词被表示成一个实数向量(one-hot vector),其长度为字典大小,每个维度对应一个字典里的每个词,除了这

重磅︱R+NLP:text2vec包简介(GloVe词向量、LDA主题模型、各类距离计算等)

词向量的表示主流的有两种方式,一种当然是耳熟能详的google的word2vec,还有一类就是GloVe.那么前面一类有三个开源的包,后面这一类我倒是看到得不多,恰好是在我关注了许久的一个包里面有,它就是text2vec啦.该包提供了一个强大API接口,能够很好地处理文本信息. 本包是由C++写的,流处理器可以让内存得到更好的利用,一些地方是用RcppParallel包进行并行化加乘,同时兼容各个系统的服务器.如果没有并行的地方,大家也可以自己用foreach包来自己加速. ----------

95、自然语言处理svd词向量

import numpy as np import matplotlib.pyplot as plt la = np.linalg words = ["I","like","enjoy","deep","learning","NLP","flying","."] X = np.array([[0,2,1,0,0,0,0,0], [2,0,0,1,0

theano学习指南--词向量的循环神经网络(翻译)

欢迎fork我的github:https://github.com/zhaoyu611/DeepLearningTutorialForChinese 最近在学习Git,所以正好趁这个机会,把学习到的知识实践一下~ 看完DeepLearning的原理,有了大体的了解,但是对于theano的代码,还是自己撸一遍印象更深 所以照着deeplearning.net上的代码,重新写了一遍,注释部分是原文翻译和自己的理解. 感兴趣的小伙伴可以一起完成这个工作哦~ 有问题欢迎联系我 Email: [email