在天然语言处理中,为了将天然语言转化为计算机所能识别的语言,就要对它从新编码,起初使用one hot编码。python
一共能产生14901维。算法
问题:占用太大空间,词和词之间的相识度没法体现。也就是所说的稀疏化。工具
one hot代码以下:学习
from sklearn.preprocessing import OneHotEncoder # lables = ['ni','号','ni','meimei'] lables = [0,1,0,4] lables = np.array(lables).reshape(len(lables),-1) enc = OneHotEncoder() enc.fit(lables) target = enc.transform(lables).toarray() print(target)
咱们须要将上面的one hot 编码转化为如图所示的编码:编码
主要有两种假说,今天咱们只谈当今的主流思想: Distributed models3d
Word2vec 是代码项目的名字,只是计算词嵌入(word embedding)的一个工具,是CBOW和Skip-Gram这两个模型的合体,目前这套工具彻底开源。code
CBOW是利用词的上下文预测当前的单词;而Skip-Gram则是利用当前词来预测上下文。orm
Word2Vec代码blog
# 训练模型定义 from gensim.models import Word2Vec model = Word2Vec(sentences, sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4) # 训练后的模型保存与加载 model.save("model_name") # 加载模型 model = Word2Vec.load("model_name") # 模型的使用 #词向量加减 model.most_similar(positive=['woman', 'king'], negative=['man']) #输出[('queen', 0.50882536), ...] # 寻找指定词语最类似的词语 print model.most_similar('morning', topn=1) model.doesnt_match("breakfast cereal dinner lunch".split()) #输出'cereal' # 计算词语的类似度 model.similarity('woman', 'man') #输出0.73723527 model['computer'] # raw numpy vector of a word #输出array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
Word2Vec参数描述:ip
1.sg=1是skip-gram算法,对低频词敏感;默认sg=0为CBOW算法。
2.size是输出词向量的维数,值过小会致使词映射由于冲突而影响结果,值太大则会耗内存并使算法计算变慢,通常值取为100到200之间。
3.window是句子中当前词与目标词之间的最大距离,3表示在目标词前看3-b个词,后面看b个词(b在0-3之间随机)。
4.min_count是对词进行过滤,频率小于min-count的单词则会被忽视,默认值为5。
5.negative和sample可根据训练结果进行微调,sample表示更高频率的词被随机下采样到所设置的阈值,默认值为1e-3。
6.hs=1表示层级softmax将会被使用,默认hs=0且negative不为0,则负采样将会被选择使用。
7.workers控制训练的并行,此参数只有在安装了Cpython后才有效,不然只能使用单核。
Word2Vec中从输入到隐层的过程就是Embedding的过程。 Embedding的过程就是把多维的onehot进行降维的过程,是个深度学习的过程。知足: