首先需要具備gensim包,然后需要一個語料庫用來訓練,這里用到的是skip-gram或CBOW方法,具體細節可以去查查相關資料,這兩種方法大致上就是把意思相近的詞映射到詞空間中相近的位置。
語料庫test8下載地址:
http://mattmahoney.net/dc/text8.zip
這個語料庫是從http://blog.csdn.net/m0_37681914/article/details/73861441這篇文章中找到的。
檢查語料是否需要做預處理:
將數據下載好了解壓出來,在做詞向量之前我們需要了解數據的存儲結構,判斷它是否滿足gensim包里word2vec函數對輸入數據的形式要求。word2vec函數的輸入最好是一整篇文字,不含標點符號以及換行符。那么我們應該檢查test8數據是否符合。然而雙擊打開test8是行不通的,因為文件過大。那么就需要我們用程序打開它。代碼如下:
with open('/text8','r',encoding='utf-8') as file:
for line in file.readlines():
print(line)
程序會返回警告,內存不夠,打印不出來。明顯是因為有一行內容太多導致的。可以進行如下驗證:
with open('/text8','r',encoding='utf-8') as file:
for line in file.readlines():
print(len(line))
輸出只有一個值,表示數據只有一行,且顯示這一行有100000000個字符長度。由於文件內數據結構一致,那么我們沒有必要將數據全部輸出來看,只需要輸出一部分就知道它的數據結構,那么修改代碼如下:
a = 0
b = 0
with open('/text8','r',encoding='utf-8') as file:
line = file.read()
for char in line:
b+=1
print(char,end='')
if b-a == 100:
a = b
print('\n')
if a == 5000:
break
我們輸出前5000個字符來看看,並且每100個字符換一行。
這里只是開頭一部分,可以看到數據完全沒有標點符號,且之前驗證過所有數據都是在同一行,表示沒有換行符。那么我們無需對數據進行預處理。接下來是數據處理部分。
數據處理部分:
from gensim.models import word2vec
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.Text8Corpus('/text8')
model = word2vec.Word2Vec(sentences, sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4)
model.save('/text82.model')
print(model['man'])
那么
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
這一行表示我們的程序會輸出日志信息,形式(format)為日期(asctime):信息級別(levelname):日志信息(message),信息級別為正常信息(logging.INFO)。關於logging的知識,大家可以去自行學習。https://www.cnblogs.com/bjdxy/archive/2013/04/12/3016820.html點擊打開鏈接
上圖就是輸出的日志信息。實際工作中,我們也可以不加這個日志,但這么做的前提是我們確定程序一定正確,不會出錯,因為一旦出錯我們就需要根據日志信息來推斷錯誤發生的可能。
將語料庫保存在sentence中
sentences = word2vec.Text8Corpus('/text8')
生成詞向量空間模型
model = word2vec.Word2Vec(sentences, sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4)
這里講下參數含義:
class gensim.models.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)
參數:
1.sentences:可以是一個List,對於大語料集,建議使用BrownCorpus,Text8Corpus或·ineSentence構建。
2.sg: 用於設置訓練算法,默認為0,對應CBOW算法;sg=1則采用skip-gram算法。
3.size:是指輸出的詞的向量維數,默認為100。大的size需要更多的訓練數據,但是效果會更好. 推薦值為幾十到幾百。
4.window:為訓練的窗口大小,8表示每個詞考慮前8個詞與后8個詞(實際代碼中還有一個隨機選窗口的過程,窗口大小<=5),默認值為5。
5.alpha: 是學習速率
6.seed:用於隨機數發生器。與初始化詞向量有關。
7.min_count: 可以對字典做截斷. 詞頻少於min_count次數的單詞會被丟棄掉, 默認值為5。
8.max_vocab_size: 設置詞向量構建期間的RAM限制。如果所有獨立單詞個數超過這個,則就消除掉其中最不頻繁的一個。每一千萬個單詞需要大約1GB的RAM。設置成None則沒有限制。
9.sample: 表示 采樣的閾值,如果一個詞在訓練樣本中出現的頻率越大,那么就越會被采樣。默認為1e-3,范圍是(0,1e-5)
10.workers:參數控制訓練的並行數。
11.hs: 是否使用HS方法,0表示不使用,1表示使用 。默認為0
12.negative: 如果>0,則會采用negativesamp·ing,用於設置多少個noise words
13.cbow_mean: 如果為0,則采用上下文詞向量的和,如果為1(default)則采用均值。只有使用CBOW的時候才起作用。
14.hashfxn: hash函數來初始化權重。默認使用python的hash函數
15.iter: 迭代次數,默認為5。
16.trim_rule: 用於設置詞匯表的整理規則,指定那些單詞要留下,哪些要被刪除。可以設置為None(min_count會被使用)或者一個接受()並返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函數。
17.sorted_vocab: 如果為1(defau·t),則在分配word index 的時候會先對單詞基於頻率降序排序。
18.batch_words:每一批的傳遞給線程的單詞的數量,默認為10000
這里再把生成的空間模型保存下來,以便下次使用。
model.save('/text8.model')
下次使用就不在需要加載語料庫和生成模型了。只需要:
'''
sentences = word2vec.Text8Corpus('/text8')
model = word2vec.Word2Vec(sentences, sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4)
model.save('/text8.model')
'''
model = word2vec.Word2Vec.load('/text8.model')
最后是查看某個詞的詞向量:
print(model['man'])
當然model函數還可以做更多的事情,比如查看兩個詞的相似度等等,想知道的請自行百度
---------------------
作者:lwn556u5ut
來源:CSDN
原文:https://blog.csdn.net/weixin_40292043/article/details/79571346
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!