python实现glove,gensim.word2vec模型训练实例
20210331
https://blog.csdn.net/sinat_26917383/article/details/83029140
glove實例
https://dumps.wikimedia.org/zhwiki/
wiki語料列表
https://blog.csdn.net/weixin_40871455/article/details/88822290
https://wiki.apertium.org/wiki/Wikipedia_Extractor
https://github.com/18106574249/WikiExtractor
python3 WikiExtractor.py --infn dump.xml.bz2 --compress
抽取命令
抽取文本代碼
https://blog.csdn.net/weixin_34194702/article/details/94678723
維基百科中文語料
https://blog.csdn.net/weixin_34111819/article/details/89580318
https://zhuanlan.zhihu.com/p/40016964
使用Gensim模塊訓練詞向量
https://blog.csdn.net/sinat_26917383/article/details/83029140
極簡使用︱Glove-python詞向量訓練與使用
https://blog.csdn.net/weixin_40952784/article/details/100729036
glove 只有linux的安裝包 資料也是基于linux 不方便
https://download.csdn.net/download/qq_36426650/11828655
glove 預訓練中文詞向量
word2vec在NLP領域的運用比較多,最近看了網上的例子覺得挺有意思的,就自己動手實踐了一下。
簡單總結:
所謂的word vector,就是指將單詞向量化,將某個單詞用特定的向量來表示。將單詞轉化成對應的向量以后,就可以將其應用于各種機器學習的算法中去。一般來講,詞向量主要有兩種形式,分別是稀疏向量和密集向量。
所謂稀疏向量,又稱為one-hot representation,就是用一個很長的向量來表示一個詞,向量的長度為詞典的大小N,向量的分量只有一個1,其他全為0,1的位置對應該詞在詞典中的索引[1]。舉例來說,如果有一個詞典[“面條”,”方便面”,”獅子”],那么“面條”對應的詞向量就是[1,0,0],“方便面”對應的詞向量就是[0,1,0]。這種表示方法不需要繁瑣的計算,簡單易得,但是缺點也不少,比如長度過長(這會引發維數災難),以及無法體現出近義詞之間的關系,比如“面條”和“方便面”顯然有非常緊密的關系,但轉化成向量[1,0,0]和[0,1,0]以后,就看不出兩者有什么關系了,因為這兩個向量相互正交。當然了,用這種稀疏向量求和來表示文檔向量效果還不錯,清華的長文本分類工具THUCTC使用的就是此種表示方法
至于密集向量,又稱distributed representation,即分布式表示。最早由Hinton提出,可以克服one-hot representation的上述缺點,基本思路是通過訓練將每個詞映射成一個固定長度的短向量,所有這些向量就構成一個詞向量空間,每一個向量可視為該空間上的一個點[1]。此時向量長度可以自由選擇,與詞典規模無關。這是非常大的優勢。還是用之前的例子[“面條”,”方便面”,”獅子”],經過訓練后,“面條”對應的向量可能是[1,0,1,1,0],而“方便面”對應的可能是[1,0,1,0,0],而“獅子”對應的可能是[0,1,0,0,1]。這樣“面條”向量乘“方便面”=2,而“面條”向量乘“獅子”=0 。這樣就體現出面條與方便面之間的關系更加緊密,而與獅子就沒什么關系了。這種表示方式更精準的表現出近義詞之間的關系,比之稀疏向量優勢很明顯。可以說這是深度學習在NLP領域的第一個運用(雖然我覺得并沒深到哪里去)
回過頭來看word2vec,其實word2vec做的事情很簡單,大致來說,就是構建了一個多層神經網絡,然后在給定文本中獲取對應的輸入和輸出,在訓練過程中不斷修正神經網絡中的參數,最后得到詞向量。
訓練模型主要步驟包括:
第一節:讀取文件
import jieba,re,os
from gensim.models import word2vec
import logging
#jieba.load_userdict("data\\userdict.txt") logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO,filename='test_01.log')
filename = 'test_01.txt' #測試文本
pre,ext = os.path.splitext(filename) #輸入文件分開前綴,后綴 pre=test_01 ext=.txt
corpus = pre + '_seg' + ext #訓練語料為按行分詞后的文本文件 corpus=test_01_seg.txt
fin = open(filename,encoding='utf8').read().strip(' ').strip('\n').replace('\n\n','\n') #strip()取出首位空格,和換行符,用\n替換\n\n
stopwords = set(open('test_01停用詞.txt',encoding='utf8').read().strip('\n').split('\n')) #讀入停用詞對日志處理,logging.basiConfig函數的各個參數可以參考:logging.basicConfig函數各參數:
filename: 指定日志文件名
filemode: 和file函數意義相同,指定日志文件的打開模式,'w'或'a'
format: 指定輸出的格式和內容,format可以輸出很多有用信息,如上例所示: %(levelno)s: 打印日志級別的數值 %(levelname)s: 打印日志級別名稱 %(pathname)s: 打印當前執行程序的路徑,其實就是sys.argv[0] %(filename)s: 打印當前執行程序名 %(funcName)s: 打印日志的當前函數 %(lineno)d: 打印日志的當前行號 %(asctime)s: 打印日志的時間 %(thread)d: 打印線程ID %(threadName)s: 打印線程名稱 %(process)d: 打印進程ID %(message)s: 打印日志信息
datefmt: 指定時間格式,同time.strftime()
level: 設置日志級別,默認為logging.WARNING
stream: 指定將日志的輸出流,可以指定輸出到sys.stderr,sys.stdout或者文件,默認輸出到sys.stderr,當stream和filename同時指定時,stream被忽略 第二:分詞,將訓練文本中的詞做處理,不能包含停用詞中的詞,以及長度少于等于1的詞,去標點,
所謂停用詞,就是出現頻率太高的詞,如逗號,句號等等,以至于沒有區分度。text = ' '.join([x for x in jieba.lcut(fin) if x not in stopwords and len(x)>1 and x != '\n']) #去掉停用詞中的詞,去掉長度小于等于1的詞
print(text)
results = re.sub('[()::?“”《》,。!·、\d ]+',' ',text) #去標點
open(corpus,'w+',encoding='utf8').write(results) #按行分詞后存為訓練語料
第三:用預處理好的語料 訓練模型#3.訓練模型
sentences = word2vec.LineSentence(corpus) # 加載語料,LineSentence用于處理分行分詞語料
#sentences1 = word2vec.Text8Corpus(corpus) #用來處理按文本分詞語料
#print('=--=-=-=-=-=',sentences)
model = word2vec.Word2Vec(sentences, size=12,window=25,min_count=2,workers=5,sg=1,hs=1) #訓練模型就這一句話 去掉出現頻率小于2的詞
# http://blog.csdn.net/szlcw1/article/details/52751314 訓練skip-gram模型; 第一個參數是訓練預料,min_count是小于該數的單詞會被踢出,默認值為5,size是神經網絡的隱藏層單元數,在保存的model.txt中會顯示size維的向量值。默認是100。默認window=5第四:保存模型# 4保存模型,以便重用
model.save("test_01.model") #保存模型
model.wv.save_word2vec_format('test_01.model.txt','test_01.vocab.txt',binary=False) # 將模型保存成文本,model.wv.save_word2vec_format()來進行模型的保存的話,會生成一個模型文件。里邊存放著模型中所有詞的詞向量。這個文件中有多少行模型中就有多少個詞向量。第五:加載模型,驗證模型
#5詞向量驗證
#加載訓練好的模型
model = word2vec.Word2Vec.load("test_01.model") #加載訓練好的語料模型
# 計算兩個詞的相似度/相關程度
# role1 = ['大圣','悟空','齊天大圣','師兄','老孫','行者','孫行者','孫悟空']
# role2 = ['天蓬','豬悟能','老豬','八戒','豬八戒','呆子']
role1 = ['天地','萬物','一元']
role2 = ['天地','百歲']
pairs = [(x,y) for x in role1 for y in role2]print(pairs) #[('天地', '天地'), ('天地', '百歲'), ('萬物', '天地'), ('萬物', '百歲'), ('一元', '天地'), ('一元', '百歲')]#pairs = [('觀音','豬悟能'),('觀音','天蓬'),('觀音','八戒'),('呆子','八戒'),('天蓬','嫦娥'),('天蓬','大圣'),('天蓬','卷簾'),('八戒','姐姐')]
for pair in pairs:print("> [%s]和[%s]的相似度為:" % (pair[0],pair[1]), model.similarity(pair[0], pair[1])) # 預測相似性# 計算某個詞的相關詞列表
figures = ['如來','西天','觀音','老君','師父','老孫','八戒','沙和尚','南天門','王母','天王']
for figure in figures:print("> 和[%s]最相關的詞有:\n" % figure, '\n'.join([x[0].ljust(4,' ')+str(x[1]) for x in model.most_similar(figure, topn=10)]),sep='') # 默認10個最相關 結果:
總結
以上是生活随笔為你收集整理的python实现glove,gensim.word2vec模型训练实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习数据不平衡不均衡处理之SMOTE
- 下一篇: 通俗易懂word2vec详解词嵌入-深度