word2vec訓練好的詞向量
阿新 • • 發佈:2018-11-10
雖然早就對NLP有一丟丟接觸,但是最近真正對中文文字進行處理才深深感覺到自然語言處理的難度,主要是機器與人還是有很大差異的,畢竟人和人之間都是有差異的,要不然不會講最難研究的人嘞
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~不華麗的分割線~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我瞭解的對詞義理解畢竟優秀的當屬word2vec了,在訓練結束後能得到跟我們人類理解的相似詞義很類似的結果,就像‘’男生‘’‘’女生‘’這些詞的含義類似一樣,網上已經有很多如何訓練word2vec向量的方法及程式碼了,為了看起來完整,我把我自己的也貼上來吧(我的原資料儲存在資料庫中):
1.訓練過程:
#訓練詞語為向量表示
def w2v_train(self):
#######資料獲取####################################################
ques = self.cu.execute('select question from activity')#從資料庫提取文字
da_all = []
for d in ques:
da_all.append(d[0])
sentences = self.get_text(da_all)#分詞結果列表
#######訓練的主要步驟######################################################
model = Word2Vec()
model.build_vocab(sentences)
model.train(sentences,total_examples = model.corpus_count,epochs = model.iter)
model.save("./tmp/user_w2corpus")#儲存模型
def get_text(self,text):#傳入的text是一個句子儲存在列表中的形式
import jieba
# 呼叫分詞方法時執行這三行
f = open("./stopword.txt", 'r+', encoding="UTF-8")
stop_list = f.read()
txt = []
# 對空格,換行符、停用詞進行處理
for i in text:
result = []
# 對文件進行分詞處理,採用預設模式
seg_list = jieba.cut(i)
for seg in seg_list:
seg = ''.join(seg.split())
if (seg != '' and seg != "\n" and seg != "\n\n"):
if seg not in stop_list:
result.append(seg)
txt.append(result)
return txt
2.呼叫訓練好的結果分析問題
import gensim
word_vectors=gensim.models.KeyedVectors.load_word2vec_format('./tmp/user_w2corpus',binary=False)
sim=word_vectors.most_similar(u'蛋白質',topn=10)
print ('\n蛋白質-top10:')
for item in sim:
print (item[0],item[1])
注意!!!!!!寫本文的初衷是感謝部落格上的一位好人給出了自己訓練好的word2vec向量,我們可以不需要親自訓練,拿來直接用,因為自己訓練的很有可能會由於資料量不足而導致效果不太好
資源連結:http://pan.baidu.com/s/1dFeNNK9
另外,該部落格的連結也在此為大家貼出來, http://www.cnblogs.com/robert-dlut/p/6586621.html
最後的最後,我想宣告我是最近才想著把自己遇到的問題都記錄下來,所以如果侵權麻煩聯絡我刪除,如果覺得有點用的話麻煩點個贊之類的,嘿嘿,在此謝過~~