當前位置:首頁 » 操作系統 » word2vec源碼

word2vec源碼

發布時間: 2024-10-21 16:09:43

python gensim怎麼用word2vect

詞向量(word2vec)原始的代碼是C寫的,python也有對應的版本,被集成在一個非常牛逼的框架gensim中。

我在自己的開源語義網路項目graph-mind(其實是我自己寫的小玩具)中使用了這些功能,大家可以直接用我在上面做的進一步的封裝傻瓜式地完成一些操作,下面分享調用方法和一些code上的心得。

1.一些類成員變數:

[python]view plain

  • def__init__(self,modelPath,_size=100,_window=5,_minCount=1,_workers=multiprocessing.cpu_count()):

  • self.modelPath=modelPath

  • self._size=_size

  • self._window=_window

  • self._minCount=_minCount

  • self._workers=_workers

  • modelPath是word2vec訓練模型的磁碟存儲文件(model在內存中總是不踏實),_size是詞向量的維度,_window是詞向量訓練時的上下文掃描窗口大小,後面那個不知道,按默認來,_workers是訓練的進程數(需要更精準的解釋,請指正),默認是當前運行機器的處理器核數。這些參數先記住就可以了。

    2.初始化並首次訓練word2vec模型

    完成這個功能的核心函數是initTrainWord2VecModel,傳入兩個參數:corpusFilePath和safe_model,分別代表訓練語料的路徑和是否選擇「安全模式」進行初次訓練。關於這個「安全模式」後面會講,先看代碼:

    [python]view plain

  • definitTrainWord2VecModel(self,corpusFilePath,safe_model=False):

  • '''''

  • initandtrainaneww2vmodel

  • (,

  • aboutsoft_model:

  • ifsafe_modelistrue,,

  • andthiscankeeptheusageofos'smemorysafebutslowly.

  • andifsafe_modelisfalse,

  • .)

  • '''

  • extraSegOpt().reLoadEncoding()

  • fileType=localFileOptUnit.checkFileState(corpusFilePath)

  • iffileType==u'error':

  • warnings.warn('loadfileerror!')

  • returnNone

  • else:

  • model=None

  • iffileType==u'opened':

  • print('trainingmodelfromsingleFile!')

  • model=Word2Vec(LineSentence(corpusFilePath),size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)

  • eliffileType==u'file':

  • corpusFile=open(corpusFilePath,u'r')

  • print('trainingmodelfromsingleFile!')

  • model=Word2Vec(LineSentence(corpusFile),size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)

  • eliffileType==u'directory':

  • corpusFiles=localFileOptUnit.listAllFileInDirectory(corpusFilePath)

  • print('!')

  • ifsafe_model==True:

  • model=Word2Vec(LineSentence(corpusFiles[0]),size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)

  • forfileincorpusFiles[1:len(corpusFiles)]:

  • model=self.updateW2VModelUnit(model,file)

  • else:

  • sentences=self.loadSetencesFromFiles(corpusFiles)

  • model=Word2Vec(sentences,size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)

  • eliffileType==u'other':

  • #TODOaddsentenceslistdirectly

  • pass

  • model.save(self.modelPath)

  • model.init_sims()

  • print('procingword2vecmodel...ok!')

  • returnmodel

  • 首先是一些雜七雜八的,判斷一下輸入文件路徑下訪問結果的類型,根據不同的類型做出不同的文件處理反應,這個大家應該能看懂,以corpusFilePath為一個已經打開的file對象為例,創建word2vec model的代碼為:

    [python]view plain

  • model=Word2Vec(LineSentence(corpusFilePath),size=self._size,window=self._window,min_count=self._minCount,workers=self._workers)

  • 其實就是這么簡單,但是為了代碼健壯一些,就變成了上面那麼長。問題是在面對一個路徑下的許多訓練文檔且數目巨大的時候,一次性載入內存可能不太靠譜了(沒有細研究gensim在Word2Vec構造方法中有沒有考慮這個問題,只是一種習慣性的警惕),於是我設定了一個參數safe_model用於判斷初始訓練是否開啟「安全模式」,所謂安全模式,就是最初只載入一篇語料的內容,後面的初始訓練文檔通過增量式學習的方式,更新到原先的model中。

    上面的代碼里,corpusFilePath可以傳入一個已經打開的file對象,或是一個單個文件的地址,或一個文件夾的路徑,通過函數checkFileState已經做了類型的判斷。另外一個函數是updateW2VModelUnit,用於增量式訓練更新w2v的model,下面會具體介紹。loadSetencesFromFiles函數用於載入一個文件夾中全部語料的所有句子,這個在源代碼里有,很簡單,哥就不多說了。

    3.增量式訓練更新word2vec模型

    增量式訓練w2v模型,上面提到了一個這么做的原因:避免把全部的訓練語料一次性載入到內存中。另一個原因是為了應對語料隨時增加的情況。gensim當然給出了這樣的solution,調用如下:

    [python]view plain

  • defupdateW2VModelUnit(self,model,corpusSingleFilePath):

  • '''''

  • (onlycanbeasingleFile)

  • '''

  • fileType=localFileOptUnit.checkFileState(corpusSingleFilePath)

  • iffileType==u'directory':

  • warnings.warn('cannotdealadirectory!')

  • returnmodel

  • iffileType==u'opened':

  • trainedWordCount=model.train(LineSentence(corpusSingleFilePath))

  • print('updatemodel,updatewordsnumis:'+trainedWordCount)

  • eliffileType==u'file':

  • corpusSingleFile=open(corpusSingleFilePath,u'r')

  • trainedWordCount=model.train(LineSentence(corpusSingleFile))

  • print('updatemodel,updatewordsnumis:'+trainedWordCount)

  • else:

  • #TODOaddsentenceslistdirectly(sameaslastfunction)

  • pass

  • returnmodel

  • 簡單檢查文件type之後,調用model對象的train方法就可以實現對model的更新,這個方法傳入的是新語料的sentences,會返回模型中新增詞彙的數量。函數全部執行完後,return更新後的model,源代碼中在這個函數下面有能夠處理多類文件參數(同2)的增強方法,這里就不多介紹了。

    4.各種基礎查詢

    當你確定model已經訓練完成,不會再更新的時候,可以對model進行鎖定,並且據說是預載了相似度矩陣能夠提高後面的查詢速度,但是你的model從此以後就read only了。

    [python]view plain

  • deffinishTrainModel(self,modelFilePath=None):

  • '''''

  • warning:afterthis,themodelisread-only(can'tbeupdate)

  • '''

  • ifmodelFilePath==None:

  • modelFilePath=self.modelPath

  • model=self.loadModelfromFile(modelFilePath)

  • model.init_sims(replace=True)

  • 可以看到,所謂的鎖定模型方法,就是init_sims,並且把裡面的replace參數設定為True。

    然後是一些word2vec模型的查詢方法:

    [python]view plain

  • defgetWordVec(self,model,wordStr):

  • '''''

  • gettheword'

  • '''

  • returnmodel[wordStr]

  • [python]view plain

  • defqueryMostSimilarWordVec(self,model,wordStr,topN=20):

  • '''''

  • return2-dimList[0]isword[1]isdouble-prob

  • '''

  • similarPairList=model.most_similar(wordStr.decode('utf-8'),topn=topN)

  • returnsimilarPairList

  • [python]view plain

  • defculSimBtwWordVecs(self,model,wordStr1,wordStr2):

  • '''''

  • returndouble-prob

  • '''

  • similarValue=model.similarity(wordStr1.decode('utf-8'),wordStr2.decode('utf-8'))

  • returnsimilarValue

  • 上述方法都很簡單,基本上一行解決,在源代碼中,各個函數下面依然是配套了相應的model文件處理版的函數。其中,getWordVec是得到查詢詞的word2vec詞向量本身,列印出來是一個純數字的array;queryMostSimilarWordVec是得到與查詢詞關聯度最高的N個詞以及對應的相似度,返回是一個二維list(注釋裡面寫的蠻清楚);culSimBtwWordVecs是得到兩個給定詞的相似度值,直接返回double值。

    5.Word2Vec詞向量的計算

    研究過w2v理論的童鞋肯定知道詞向量是可以做加減計算的,基於這個性質,gensim給出了相應的方法,調用如下:

    [python]view plain

  • (self,model,posWordStrList,negWordStrList,topN=20):

  • '''''

  • pos-neg

  • return2-dimList[0]isword[1]isdouble-prob

  • '''

  • posWordList=[]

  • negWordList=[]

  • forwordStrinposWordStrList:

  • posWordList.append(wordStr.decode('utf-8'))

  • forwordStrinnegWordStrList:

  • negWordList.append(wordStr.decode('utf-8'))

  • pnSimilarPairList=model.most_similar(positive=posWordList,negative=negWordList,topn=topN)

  • returnpnSimilarPairList

  • 由於用的是py27,所以之前對傳入的詞列表數據進行編碼過濾,這裡面posWordList可以認為是對結果產生正能量的詞集,negWordList則是對結果產生負能量的詞集,同時送入most_similar方法,在設定return答案的topN,得到的返回結果形式同4中的queryMostSimilarWordVec函數,大家可以這樣數學地理解這個操作:

    下面一個操作是我自創的,假設我想用上面詞向量topN「詞-關聯度」的形式展現兩個詞或兩組詞之間的關聯,我是這么做的:

    [python]view plain

  • (self,model,wordStrList1,wordStrList2,topN_rev=20,topN=20):

  • '''''

  • -wordListandtag-wordList

  • first,usethetag-wordListasneg-wordListtogettherev-wordList,

  • thenusethescr-wordListandtherev-wordListasthenewsrc-tag-wordList

  • topN_revistopNofrev-

  • '''

  • srcWordList=[]

  • tagWordList=[]

  • srcWordList.extend(wordStr.decode('utf-8')forwordStrinwordStrList1)

  • tagWordList.extend(wordStr.decode('utf-8')forwordStrinwordStrList2)

  • revSimilarPairList=self.queryMSimilarVecswithPosNeg(model,[],tagWordList,topN_rev)

  • revWordList=[]

  • revWordList.extend(pair[0].decode('utf-8')forpairinrevSimilarPairList)

  • stSimilarPairList=self.queryMSimilarVecswithPosNeg(model,srcWordList,revWordList,topN)

  • returnstSimilarPairList

  • 這個操作的思路就是,首先用兩組詞中的一組作為negWordList,傳入上面的queryMSimilarVecswithPosNeg函數,得到topN一組的中轉詞,在使用這些中轉詞與原先的另一組詞進行queryMSimilarVecswithPosNeg操作,很容易理解,第一步得到的是一組詞作為negWordList的反向結果,再通過這個反向結果與另一組詞得到「負負得正」的效果。這樣就可以通過一組topN的「詞-關聯度」配對List表示兩組詞之間的關系。

② python學科課程分幾個部分

以下是老男孩教育Python全棧課程內容:
階段一:Python開發基礎
Python開發基礎課程內容包括:計算機硬體、操作系統原理、安裝linux操作系統、linux操作系統維護常用命令、Python語言介紹、環境安裝、基本語法、基本數據類型、二進制運算、流程式控制制、字元編碼、文件處理、數據類型、用戶認證、三級菜單程序、購物車程序開發、函數、內置方法、遞歸、迭代器、裝飾器、內置方法、員工信息表開發、模塊的跨目錄導入、常用標准庫學習,b加密\re正則\logging日誌模塊等,軟體開發規范學習,計算器程序、ATM程序開發等。
階段二:Python高級級編編程&資料庫開發
Python高級級編編程&資料庫開發課程內容包括:面向對象介紹、特性、成員變數、方法、封裝、繼承、多態、類的生成原理、MetaClass、__new__的作用、抽象類、靜態方法、類方法、屬性方法、如何在程序中使用面向對象思想寫程序、選課程序開發、TCP/IP協議介紹、Socket網路套接字模塊學習、簡單遠程命令執行客戶端開發、C\S架構FTP伺服器開發、線程、進程、隊列、IO多路模型、資料庫類型、特性介紹,表欄位類型、表結構構建語句、常用增刪改查語句、索引、存儲過程、視圖、觸發器、事務、分組、聚合、分頁、連接池、基於資料庫的學員管理系統開發等。
階段三:前端開發
前端開發課程內容包括:HTML\CSS\JS學習、DOM操作、JSONP、原生Ajax非同步載入、購物商城開發、Jquery、動畫效果、事件、定時期、輪播圖、跑馬燈、HTML5\CSS3語法學習、bootstrap、抽屜新熱榜開發、流行前端框架介紹、Vue架構剖析、mvvm開發思想、Vue數據綁定與計算屬性、條件渲染類與樣式綁定、表單控制項綁定、事件綁定webpack使用、vue-router使用、vuex單向數據流與應用結構、vuex actions與mutations熱重載、vue單頁面項目實戰開發等。
階段四:WEB框架開發
WEB框架開發課程內容包括:Web框架原理剖析、Web請求生命周期、自行開發簡單的Web框架、MTV\MVC框架介紹、Django框架使用、路由系統、模板引擎、FBV\CBV視圖、Models ORM、FORM、表單驗證、Django session & cookie、CSRF驗證、XSS、中間件、分頁、自定義tags、Django Admin、cache系統、信號、message、自定義用戶認證、Memcached、redis緩存學習、RabbitMQ隊列學習、Celery分布式任務隊列學習、Flask框架、Tornado框架、Restful API、BBS+Blog實戰項目開發等。
階段五:爬蟲開發
爬蟲開發課程內容包括:Requests模塊、BeautifulSoup,Selenium模塊、PhantomJS模塊學習、基於requests實現登陸:抽屜、github、知乎、博客園、爬取拉鉤職位信息、開發Web版微信、高性能IO性能相關模塊:asyncio、aiohttp、grequests、Twisted、自定義開發一個非同步非阻塞模塊、驗證碼圖像識別、Scrapy框架以及源碼剖析、框架組件介紹(engine、spider、downloader、scheler、pipeline)、分布式爬蟲實戰等。
階段六:全棧項目實戰
全棧項目實戰課程內容包括:互聯網企業專業開發流程講解、git、github協作開發工具講解、任務管理系統講解、介面單元測試、敏捷開發與持續集成介紹、django + uwsgi + nginx生產環境部署學習、介面文檔編寫示例、互聯網企業大型項目架構圖深度講解、CRM客戶關系管理系統開發、路飛學城在線教育平台開發等。
階段七:數據分析
數據分析課程內容包括:金融、股票知識入門股票基本概念、常見投資工具介紹、市基本交易規則、A股構成等,K線、平均線、KDJ、MACD等各項技術指標分析,股市操作模擬盤演示量化策略的開發流程,金融量化與Python,numpy、pandas、matplotlib模塊常用功能學習在線量化投資平台:優礦、聚寬、米筐等介紹和使用、常見量化策略學習,如雙均線策略、因子選股策略、因子選股策略、小市值策略、海龜交易法則、均值回歸、策略、動量策略、反轉策略、羊駝交易法則、PEG策略等、開發一個簡單的量化策略平台,實現選股、擇時、倉位管理、止盈止損、回測結果展示等功能。
階段八:人工智慧
人工智慧課程內容包括:機器學習要素、常見流派、自然語言識別、分析原理詞向量模型word2vec、剖析分類、聚類、決策樹、隨機森林、回歸以及神經網路、測試集以及評價標准Python機器學習常用庫scikit-learn、數據預處理、Tensorflow學習、基於Tensorflow的CNN與RNN模型、Caffe兩種常用數據源製作、OpenCV庫詳解、人臉識別技術、車牌自動提取和遮蔽、無人機開發、Keras深度學習、貝葉斯模型、無人駕駛模擬器使用和開發、特斯拉遠程式控制制API和自動化駕駛開發等。
階段九:自動化運維&開發
自動化運維&開發課程內容包括:設計符合企業實際需求的CMDB資產管理系統,如安全API介面開發與使用,開發支持windows和linux平台的客戶端,對其它系統開放靈活的api設計與開發IT資產的上線、下線、變更流程等業務流程。IT審計+主機管理系統開發,真實企業系統的用戶行為、管理許可權、批量文件操作、用戶登錄報表等。分布式主機監控系統開發,監控多個服務,多種設備,報警機制,基於http+restful架構開發,實現水平擴展,可輕松實現分布式監控等功能。
階段十:高並發語言GO開發高並發語言GO開發課程內容包括:Golang的發展介紹、開發環境搭建、golang和其他語言對比、字元串詳解、條件判斷、循環、使用數組和map數據類型、go程序編譯和Makefile、gofmt工具、godoc文檔生成工具詳解、斐波那契數列、數據和切片、make&new、字元串、go程序調試、slice&map、map排序、常用標准庫使用、文件增刪改查操作、函數和面向對象詳解、並發、並行與goroute、channel詳解goroute同步、channel、超時與定時器reover捕獲異常、Go高並發模型、Lazy生成器、並發數控制、高並發web伺服器的開發等。

熱點內容
androidgpio驅動 發布:2024-10-21 19:06:13 瀏覽:375
差分控制演算法 發布:2024-10-21 18:40:53 瀏覽:242
伺服器賬號認證失敗是什麼意思 發布:2024-10-21 18:40:47 瀏覽:587
中學生編譯特點 發布:2024-10-21 18:38:16 瀏覽:745
java的組合 發布:2024-10-21 18:34:40 瀏覽:954
文檔上傳審核 發布:2024-10-21 18:26:24 瀏覽:375
編程圓孔 發布:2024-10-21 18:26:23 瀏覽:871
差比和演算法 發布:2024-10-21 18:25:36 瀏覽:485
spring防止反編譯 發布:2024-10-21 18:11:18 瀏覽:866
擺攤速演算法 發布:2024-10-21 18:01:47 瀏覽:685