最近寫論文跑模型,要用到word2vec,可是發現本身怎麼也看不懂網上的帖子,仍是本身笨吧,因此就有了個人第一篇博客!!! 關於word2vec工具打算寫一個系列的,固然今天這篇文章只打算寫:html
1、word2vec 簡介python
2013年,Google開源了一款用於詞向量計算的工具——word2vec,引發了工業界和學術界的關注。首先,word2vec能夠在百萬數量級的詞典和上億的數據集上進行高效地訓練;其次,該工具獲得的訓練結果——詞向量(word embedding),能夠很好地度量詞與詞之間的類似性。關於word2vec工具的內在算法我懂得不是不少,看過幾篇博客,連接以下感興趣得朋友能夠看看:算法
http://www.javashuo.com/article/p-wkdafrqp-mh.htmlapp
2、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)] #這個結果不太好,沒有去停用詞的結果
上面文本的處理過程,我只寫了切分過程,正常狀況下還得進行停用詞處理,低頻詞的處理,這些我就不寫了,懶ui
下面使用word2vec自帶的文件處理工具進行文本的處理:spa
#該文件是已經分好詞的中文語料---關於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
上面的文件的格式以下,你能夠把拿到的全部文件進行處理以後彙總成一個文件便可線程
保存語料庫的詞語庫以及相應的詞向量,以後能夠利用獲得的詞向量進行聚類等分析:
word_list=model.wv.index2word with open('C:/Users/Administrator/Desktop/data/評論/word_vocabulary.txt','r',encoding='utf-8') as f: for word in word_list: f.write(word+','+model[word]+' ') f.write('\r\n\r\n') f.close()
終於結束了,以上是本人的學習筆記,但願能對看到這篇文章的人有所幫助,若是有錯誤的地方麻煩在下方評論區給出!!!