閱讀409 返回首頁    go 阿裏雲 go 技術社區[雲棲]


不可思議的Word2Vec係列二訓練好的模型

由於後麵幾篇要講解Word2Vec怎麼用,因此筆者先訓練好了一個Word2Vec模型。為了節約讀者的時間,並且保證讀者可以複現後麵的結果,筆者決定把這個訓練好的模型分享出來,用Gensim訓練的。單純的詞向量並不大,但第一篇已經說了,我們要用到完整的Word2Vec模型,因此我將完整的模型分享出來了,包含四個文件,所以文件相對大一些。

提醒讀者的是,。

對於做知識挖掘來說,顯然用知識庫語料(如百科語料)訓練的Word2Vec效果會更好。但百科語料我還在爬取中,爬完了我再訓練一個模型,到時再分享。

I. 模型概況

這個模型的大概情況如下:

fc553ad2febea89379b667452a9e61d42617f10c

需要特別說明的是:公眾號文章屬於比較“現代”的文章,反映了近來的網絡熱點內容,覆蓋麵也比較廣,因此文章相對來說還是比較典型的。
對於分詞,我用的是結巴分詞,並且關閉了新詞發現,這是寧可分少一些,也要分準一些。當然,自帶的詞典是不夠的,
筆者自己還整理了50萬詞條,詞條來源有兩部分:1、網絡收集的詞典合並;2、在公眾號文章上做新詞發現,人工篩選後加入到詞典中。
因此,分詞的結果還算靠譜,而且包含了比較多的流行詞,可用性較高。

II. 訓練代碼

大家可以參考著改寫,要注意,這裏引入hashlib.md5是為了對文章進行去重(本來1000萬篇文章,去重後得到800萬),而這個步驟不是必要的。

#! -*- coding:utf-8 -*-

import gensim, logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

import pymongo
import hashlib

db = pymongo.MongoClient('172.16.0.101').weixin.text_articles_words
md5 = lambda s: hashlib.md5(s).hexdigest()
class sentences:
    def __iter__(self):
        texts_set = set()
        for a in db.find(no_cursor_timeout=True):
            if md5(a['text'].encode('utf-8')) in texts_set:
                continue
            else:
                texts_set.add(md5(a['text'].encode('utf-8')))
                yield a['words']
        print u'最終計算了%s篇文章'%len(texts_set)

word2vec = gensim.models.word2vec.Word2Vec(sentences(), size=256, window=10, min_count=64, sg=1, hs=1, iter=10, workers=25)
word2vec.save('word2vec_wx')

III. 下載鏈接

百度雲盤:word2vecmu'l

包含文件:word2vec_wx, word2vec_wx.syn1neg.npy, word2vec_wx.syn1.npy, word2vec_wx.wv.syn0.npy,4個文件都是Gensim加載模型所必需的。具體每個文件的含義我也沒弄清楚,word2vec_wx大概是模型聲明,word2vec_wx.wv.syn0.npy應該就是我們所說的詞向量表,word2vec_wx.syn1.npy是隱層到輸出層的參數(Huffman樹的參數),word2vec_wx.syn1neg.npy就不大清楚了~

IV. 一些演示

主要隨便演示一下該模型找近義詞的結果。歡迎大家提出改進建議。

>>> import gensim
>>> model = gensim.models.Word2Vec.load('word2vec_wx')

>>> pd.Series(model.most_similar(u'微信'))
0 (QQ, 0.752506196499)
1 (訂閱號, 0.714340209961)
2 (QQ號, 0.695577561855)
3 (掃一掃, 0.695488214493)
4 (微信公眾號, 0.694692015648)
5 (私聊, 0.681655049324)
6 (微信公眾平台, 0.674170553684)
7 (私信, 0.65382117033)
8 (微信平台, 0.65175652504)
9 (官方, 0.643620729446)

>>> pd.Series(model.most_similar(u'公眾號'))
0 (訂閱號, 0.782696723938)
1 (微信公眾號, 0.760639667511)
2 (微信公眾賬號, 0.73489522934)
3 (公眾平台, 0.716173946857)
4 (掃一掃, 0.697836577892)
5 (微信公眾平台, 0.696847081184)
6 (置頂, 0.666775584221)
7 (公共賬號, 0.665741920471)
8 (微信平台, 0.661035299301)
9 (菜單欄, 0.65234708786)

>>> pd.Series(model.most_similar(u'牛逼'))
0 (牛掰, 0.701575636864)
1 (厲害, 0.619165301323)
2 (靠譜, 0.588266670704)
3 (苦逼, 0.586573541164)
4 (吹牛逼, 0.569260418415)
5 (了不起, 0.565731525421)
6 (牛叉, 0.563843131065)
7 (絕逼, 0.549570798874)
8 (說真的, 0.549259066582)
9 (兩把刷子, 0.545115828514)

>>> pd.Series(model.most_similar(u'廣州'))
0 (東莞, 0.840889930725)
1 (深圳, 0.799216389656)
2 (佛山, 0.786817133427)
3 (惠州, 0.779960036278)
4 (珠海, 0.73523247242)
5 (廈門, 0.72509008646)
6 (武漢, 0.724122405052)
7 (汕頭, 0.719602584839)
8 (增城, 0.713532209396)
9 (上海, 0.710560560226)

>>> pd.Series(model.most_similar(u'朱元璋'))
0 (朱棣, 0.857951819897)
1 (燕王, 0.853199958801)
2 (朝廷, 0.847517609596)
3 (明太祖朱元璋, 0.837111353874)
4 (趙匡胤, 0.835654854774)
5 (稱帝, 0.835589051247)
6 (起兵, 0.833530187607)
7 (明太祖, 0.829249799252)
8 (太祖, 0.826784193516)
9 (丞相, 0.826457977295)

>>> pd.Series(model.most_similar(u'微積分'))
0 (線性代數, 0.808522999287)
1 (數學分析, 0.791161835194)
2 (高等數學, 0.786414265633)
3 (數學, 0.758676528931)
4 (概率論, 0.747221827507)
5 (高等代數, 0.737897276878)
6 (解析幾何, 0.730488717556)
7 (複變函數, 0.715447306633)
8 (微分方程, 0.71503329277)
9 (微積分學, 0.704192101955)

>>> pd.Series(model.most_similar(u'apple'))
0 (banana, 0.79927945137)
1 (pineapple, 0.789698243141)
2 (pen, 0.779583632946)
3 (orange, 0.769554674625)
4 (sweet, 0.721074819565)
5 (fruit, 0.71402490139)
6 (pie, 0.711439430714)
7 (watermelon, 0.700904607773)
8 (apples, 0.697601020336)
9 (juice, 0.694036960602)

>>> pd.Series(model.most_similar(u'企鵝'))
0 (海豹, 0.665253281593)
1 (帝企鵝, 0.645192623138)
2 (北極熊, 0.619929730892)
3 (大象, 0.618502140045)
4 (鯨魚, 0.606555819511)
5 (貓, 0.591019570827)
6 (蜥蜴, 0.584576964378)
7 (藍鯨, 0.572826981544)
8 (海豚, 0.566122889519)
9 (猩猩, 0.563284397125)

>>> pd.Series(model.most_similar(u'足球'))
0 (籃球, 0.842746257782)
1 (足球運動, 0.819511592388)
2 (青訓, 0.793446540833)
3 (排球, 0.774085760117)
4 (乒乓球, 0.760577201843)
5 (足球賽事, 0.758624792099)
6 (棒壘球, 0.750351667404)
7 (籃球運動, 0.746055066586)
8 (足球隊, 0.74296438694)
9 (網球, 0.742858171463)

>>> pd.Series(model.most_similar(u'爸爸'))
0 (媽媽, 0.779690504074)
1 (兒子, 0.752222895622)
2 (奶奶, 0.70418381691)
3 (媽, 0.693783283234)
4 (爺爺, 0.683066487312)
5 (父親, 0.673043072224)
6 (女兒, 0.670304119587)
7 (爸媽, 0.669358253479)
8 (爸, 0.663688421249)
9 (外婆, 0.652905225754)

>>> pd.Series(model.most_similar(u'淘寶'))
0 (淘, 0.770935535431)
1 (店鋪, 0.739198565483)
2 (手機端, 0.728774428368)
3 (天貓店, 0.725838780403)
4 (口令, 0.721312999725)
5 (登錄淘寶, 0.717839717865)
6 (淘寶店, 0.71473968029)
7 (淘寶搜, 0.697688698769)
8 (天貓, 0.690212249756)
9 (網店, 0.6820114851)



最後更新:2017-09-17 22:34:38

  上一篇:go  不可思議的Word2Vec之係列三-提取關鍵詞
  下一篇:go  不可思議的Word2Vec係列一數學原理