一 序
理论部分,可以看之前 NLP学习笔记 36-word2vec
当然自己觉得整理的不够好,hanlp作者的一篇是结合代码分析的《word2vec原理推导与代码分析》
二 验证
整体流程
使用 gensim
这个就是最简单的,这里的数据集就是一个分词之后的。如果单纯试验,从网上找对应的数据集就好。
如果是自己的数据(比如原始的文本),那就需要分词处理后生成。
遇到的问题:我开始参照网上的通常写法:
word2vec.Word2Vec(sentences, size=200)
Getting "__init__() got an unexpected keyword argument 'size'
size参数主要是用来向量的维度。新版本的API已经改名了。
model = word2vec.Word2Vec(cutWords_list,vector_size=100,window=5, min_count=1)
python的Gensim包升级版本后,里面很多调用方法已经发生了改变。几年前别人写的文章,你现在新安装的不一定好使。比如这个版本得加上wv才可以 。这是我的安装信息
Using legacy 'setup.py install' for smart-open, since package 'wheel' is not installed.
Installing collected packages: smart-open, gensim
Running setup.py install for smart-open ... done
Successfully installed gensim-4.0.0 smart-open-4.2.0
效果:
某个词的向量:
同义词
比较词的相似度:
问题2 :特征工程
各个样本的长度不一,我们现在有了基于词的word2vec映射数据对应到训练数据,那么以句子或者段(我的测试数据对应场景通常在20字以下,就是问答的提问)改怎么办呢?
网上大佬们给出了各种方向,没有机器资源测试,我能用的只是低配的小mac来试验下.
大佬说的第一种就是使用bag of words的方法,第二种就是doc2vec。我还是先尝试用简单的词向量处理来试试。
用numpy方法计算
模型训练:LR
上面是2000条的数据,如果用2w条跑,
超参数C太大不好,容易过拟合。之前那篇 机器学习在医疗咨询分类的应用 ,可见使用了word2vec之后。准确率持平。但是没有TFIDF那么大稀疏的矩阵。
这种在百万级样本会体会的更加明显。
遇到的问题:
ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
这个是里面有空值。numpy怎么替换还不会。但是可以训练之前验证下。
上面的np.isnan()=true 就是有空值了。
****************************************
两个层面: 算法原理与工程化(主要是Python)都是入门,缺一不可。
只看别人的blog,尤其是自己不会的,不动手跑下代码是印象不深刻的。尤其是整理好的高质量的打标签数据集太重要了。