最近写论文跑模型,要用到word2vec,但是发现自己怎么也看不懂网上的帖子,还是自己笨吧,所以就有了我的第一篇博客!!! 关于word2vec工具打算写一个系列的,当然今天这篇文章只打算写:
- 如何加载word2vec模型
- 如何利用word2vec模型求解词向量
- 如何保存word2vec模型
一、word2vec 简介
2013年,Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注。首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;其次,该工具得到的训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。关于word2vec工具的内在算法我懂得不是很多,看过几篇博客,链接如下感兴趣得朋友可以看看:
https://www.cnblogs.com/guoyaohua/p/9240336.html
二、word2vec的使用
1 #加载模型 2 from gensim.models import word2vec 3 4 #加载语料库,语料库的格式 5 6 sentences=[['外形', '外观', '好看', '屏幕', '音效', '挺大', '待机时间', '长', '拍照', '效果', '特别'], ['手机', '好看', '段时间'], ['手机', '收到', '很漂亮', '后续', '评价']] 7 8 #加载模型
9 model=model=word2vec.Word2Vec(sentences,size=4,window=5,min_count=1) 10 #求解词向量以及相似度 11 model.most_similar(u'外形') 12 model['外形'] 13
1 #输出 2 #外形的相似度,默认是输出10个最相似的词语,输出形式是list 3 4 [('挺大', 0.7367413640022278), ('音效', 0.657544732093811), ('后续', 0.5379071235656738), ('长', 0.5151427984237671), ('段时间', 0.4361593723297119), ('手机', 0.33148619532585144), ('特别', 0.19552142918109894), ('评价', 0.09857006371021271), ('待机时间', 0.08498627692461014), ('收到', -0.01799720525741577)] 5 6 7 #输出“外形”一词的词向量 8 9 array([-0.03313196, 0.04037894, -0.11632963, -0.08618639], dtype=float32)
看完上面的例子,是不是觉得超级简单,当然上面只是一个简单的例子,接下来你们会看到对于一个txt文件,拿到之后经过哪些处理可以作为参数输入,下面先插播一下word2vec函数的参数详解:
#参数详解 word2vec.Word2Vec(sentences=None,size=100,alpha=0.025,window=5, min_count=5, max_vocab_size=None, sample=0.001,seed=1, workers=3,min_alpha=0.0001, sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=<built-in function hash>,iter=5,null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000) ---sentence:可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或·ineSentence构建。 ---size:是词向量的维度,默认是100 ---window:表示当前词与预测词在一个句子中的最大距离是多少,在求解词向量的时候我们会考虑当前词所在句子的前后window个词语 --- sg:用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。 ---alpha: 是学习速率 ---seed:用于随机数发生器。与初始化词向量有关。 ---min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5 ---max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。 ---sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5) ---workers参数控制训练的并行数。 ---hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。 ---negative: 如果>0,则会采用negativesamp·ing,用于设置多少个noise words ---cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(defau·t)则采用均值。只有使用CBOW的时候才起作用。 ---hashfxn: hash函数来初始化权重。默认使用python的hash函数 ---iter: 迭代次数,默认为5 ---trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函数。 ---sorted_vocab: 如果为1(defau·t),则在分配word index 的时候会先对单词基于频率降序排序。 ---batch_words:每一批的传递给线程的单词的数量,默认为10000
下面举个使用word2vec工具进行txt文件词向量的求解的例子:
1 #文本处理 语料库使用了3个文本,文本自行爬取吧 2 import jieba 3 from zhon.hanzi import punctuation 4 path1='C:/Users/Administrator/Desktop/data/新闻/健康新闻/2019年“世界流感日”科普活动 暨学术会议在京召开.txt' 5 path2='C:/Users/Administrator/Desktop/data/新闻/健康新闻/67岁产妇称自然受孕产女 专家感到困惑.txt' 6 path3='C:/Users/Administrator/Desktop/data/新闻/健康新闻/90后养生:保健品“吃不掉”健康焦虑.txt' 7 8 def get_load(path): 9 f=open(path,'r',encoding='utf-8') 10 data=f.read() 11 new_s=re.sub(r'[%s,\t,\\]+'%punctuation, " ", data) 12 cut_s=jieba.lcut(new_s) 13 sentences=[] 14 for word in cut_s: 15 if word !='\n'and word !=' ': 16 sentences.append(word) 17 return sentences 18 data1=get_load(path1) 19 data2=get_load(path2) 20 data3=get_load(path3) 21 final_data=[data1,data2,data3] 22 23 #模型建立 24 25 model=word2vec.Word2Vec(final_data,size=50,window=4) 26 27 model['健康']
#输出 >>>model['健康'] array([ 8.6532356e-03, 2.1515305e-03, 3.4037780e-03, -4.4254097e-03, -8.4194457e-03, -1.5364622e-03, 1.0745996e-02, 5.3538852e-03, -1.1601291e-03, 6.8697990e-03, 8.7537011e-03, 8.6077927e-03, 1.4498243e-03, 2.6482970e-03, -3.4553630e-03, 8.2870452e-03, 3.5420412e-03, 8.8039534e-03, -3.6633634e-03, 5.4932209e-03, -7.5302450e-03, 9.6533290e-04, -1.9622964e-03, 6.5719029e-03, -3.7521331e-04, -9.1459788e-04, -8.3307233e-03, 2.9766238e-03, 7.6092435e-03, -8.3235843e-04, -9.2809896e-05, -6.7277048e-03, 1.5067700e-03, -8.0193384e-03, -1.0153291e-02, 5.9706415e-03, 4.3323904e-04, -9.5779281e-03, -9.3199704e-03, 3.5575093e-03, 3.0641828e-03, 4.4296687e-03, 2.8934417e-04, -1.8675557e-03, -4.8446902e-03, -3.5805893e-03, -1.1002035e-03, -1.0306393e-02, 4.5978278e-03, 6.8134381e-03], dtype=float32) >>>model.most_similar(‘健康') [('67', 0.37046998739242554), ('会', 0.363727331161499), ('在', 0.30487531423568726), ('国家', 0.2739967703819275), ('社会', 0.26224130392074585), ('新闻', 0.19897636771202087), ('产妇', 0.19829007983207703), ('-', 0.19742634892463684), ('岁', 0.16749148070812225), ('后', 0.15823742747306824)] #这个结果不太好,没有去停用词的结果
上面文本的处理过程,我只写了切分过程,正常情况下还得进行停用词处理,低频词的处理,这些我就不写了,懒
下面使用word2vec自带的文件处理工具进行文本的处理:
#该文件是已经分好词的中文语料---关于oppo 手机的京东评论 from gensim.models import word2vec import logging # 主程序 logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) path2='C:/Users/Administrator/Desktop/data/评论/cut_comment.txt' sentences = word2vec.Text8Corpus(path2) model = word2vec.Word2Vec(sentences, size=20) model['oppo'] model.most_similar('好评') model.similarity(u"好评", "oppo")
>>> model.most_similar('oppo') [('第一次', 0.9777179956436157), ('信赖', 0.9736739993095398), ('希望', 0.9670151472091675), ('价格', 0.9577376842498779), ('内容', 0.9538010954856873), ('未填写', 0.9495989084243774), ('包装', 0.9487740993499756), ('这款', 0.9475699663162231), ('破损', 0.9475245475769043), ('评价', 0.9470676779747009)] >>> model.most_similar('好评') [('质量', 0.9727074503898621), ('购物', 0.9600175619125366), ('正品', 0.9578911066055298), ('战斗机', 0.9555199146270752), ('喜欢', 0.9444591999053955), ('老婆', 0.9358581304550171), ('手机', 0.9266927242279053), ('推荐', 0.9224187731742859), ('货已', 0.9196405410766602), ('朋友', 0.917504072189331)] >>> model.most_similar('手机') [('宝贝', 0.9600850343704224), ('几天', 0.9596285820007324), ('购物', 0.9558006525039673), ('一段时间', 0.9556002020835876), ('质量', 0.9525821208953857), ('正品', 0.9524366855621338), ('到货', 0.9513840079307556), ('真心', 0.9481478929519653), ('收到', 0.9459341764450073), ('下次', 0.9382076263427734)] >>> model.similarity(u"好评", "oppo") 0.81516
上面的文件的格式如下,你可以把拿到的所有文件进行处理之后汇总成一个文件即可
终于结束了,以上是本人的学习笔记,希望能对看到这篇文章的人有所帮助,如果有错误的地方麻烦在下方评论区给出!!!