使用word2vec训练中文词向量
生活随笔
收集整理的這篇文章主要介紹了
使用word2vec训练中文词向量
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
https://www.jianshu.com/p/87798bccee48
一、文本處理流程
通常我們文本處理流程如下:
- 1 對(duì)文本數(shù)據(jù)進(jìn)行預(yù)處理:數(shù)據(jù)預(yù)處理,包括簡(jiǎn)繁體轉(zhuǎn)換,去除xml符號(hào),將單詞條內(nèi)容處理成單行數(shù)據(jù),word2vec訓(xùn)練原理是基于詞共現(xiàn)來(lái)訓(xùn)練詞之間的語(yǔ)義聯(lián)系的。不同詞條內(nèi)容需分開(kāi)訓(xùn)練
- 2 中文分詞:中文NLP很重要的一步就是分詞了,分詞的好壞很大程度影響到后續(xù)的模型訓(xùn)練效果
- 3 特征處理:也叫詞向量編碼,將文本數(shù)據(jù)轉(zhuǎn)換成計(jì)算機(jī)能識(shí)別的數(shù)據(jù),便于計(jì)算,通常是轉(zhuǎn)換成數(shù)值型數(shù)據(jù),常用的編碼方式有one hot編碼(BOW詞袋模型離散表示方式,另外文章我們講解TF-IDF模型時(shí)候會(huì)介紹)和基于word2vec等深度學(xué)習(xí)模型訓(xùn)練得到的低維稠密向量,通常稱為word embedding的Distributed representation
- 4 機(jī)器學(xué)習(xí):詞向量進(jìn)行編碼之后,便可以將文本數(shù)據(jù)轉(zhuǎn)換成數(shù)值數(shù)據(jù),輸入到我們的機(jī)器學(xué)習(xí)模型進(jìn)行計(jì)算訓(xùn)練了
文本處理流程圖如下: - 文本處理流程
二、訓(xùn)練過(guò)程
- 模型:gensim工具包word2vec模型,安裝使用簡(jiǎn)單,訓(xùn)練速度快
- 語(yǔ)料:百度百科500萬(wàn)詞條+維基百科30萬(wàn)詞條+1.1萬(wàn)條領(lǐng)域數(shù)據(jù)
- 分詞:jieba分詞,自定義詞典加入行業(yè)詞,去除停用詞
- 硬件:8核16g虛擬機(jī)
數(shù)據(jù)預(yù)處理
- 維基百科數(shù)據(jù)量不夠大,百度百科數(shù)據(jù)量較全面,內(nèi)容上面百度百科大陸相關(guān)的信息比較全面,港澳臺(tái)和國(guó)外相關(guān)信息維基百科的內(nèi)容比較詳細(xì),因此訓(xùn)練時(shí)將兩個(gè)語(yǔ)料一起投入訓(xùn)練,形成互補(bǔ),另外還加入了1.1萬(wàn)公司行業(yè)數(shù)據(jù)
分詞
- 1 準(zhǔn)備一個(gè)停用詞詞典,訓(xùn)練時(shí)要去除停用詞的干擾
- 2 分詞工具有中科院分詞,哈工大的LTP分詞,jieba分詞,分詞效果中科院的分詞效果不錯(cuò),我們直接使用jieba進(jìn)行分詞,使用簡(jiǎn)單方便,分詞速度快
- 3 自定義詞典:由于百科數(shù)據(jù)有很多專屬名詞,很多比較長(zhǎng),如果直接分詞,很大情況下會(huì)被切開(kāi),這不是我們想要的結(jié)果,比如:中國(guó)人民解放軍,可能會(huì)被分成:中國(guó) 人民 解放軍,jieba雖然有新詞發(fā)現(xiàn)功能,為保證分詞準(zhǔn)確度,jieba的作者建議我們還是使用自定義詞典。
- 4 自定義詞典抽取:我從百度百科抽取了200萬(wàn)的詞條,由于自定義詞典包含英文單詞時(shí)會(huì)導(dǎo)致jieba對(duì)英文單詞進(jìn)行分詞,所以需要用正則表達(dá)式去除詞條中的英文數(shù)據(jù),并且去除一些單字詞,還有一些詞條里面較短詞,如"在北京",這類詞會(huì)導(dǎo)致分詞出現(xiàn)問(wèn)題,也需要使用正則去除,也有簡(jiǎn)單粗暴的方法,直接保留3個(gè)漢字及以上的中文詞條,去除之后得到170萬(wàn)大小的自定義詞典
- 5 分詞過(guò)程
- 由于python多線程只能單核多線程,如果是多核的機(jī)器并不能有效使用cpu,jieba是使用python寫的,所以jieba只支持并行分詞,并行分詞指的是多進(jìn)程分詞,并且不支持windows
- 我們?cè)趌inux試過(guò)jieba自帶的并行分詞,開(kāi)啟并行分詞之后,jieba后臺(tái)會(huì)自動(dòng)開(kāi)啟多個(gè)進(jìn)程,并且并行分詞需要一次性將訓(xùn)練語(yǔ)料讀取到內(nèi)存并傳入jieba.cut(file.read())中才會(huì)有效果,如果類似我代碼中逐行傳入,開(kāi)啟多進(jìn)程是不起作用的,jieba多進(jìn)程原理是,jieba后臺(tái)會(huì)自動(dòng)將語(yǔ)料切分分配給指定進(jìn)程處理,分好詞后再合并
- 我使用的是8核16g內(nèi)存Linux虛擬機(jī),發(fā)現(xiàn)開(kāi)啟jieba并行分詞,1g的語(yǔ)料數(shù)據(jù),很快就爆內(nèi)存了
- 單進(jìn)程的jieba分詞,不需要一次性加載所有語(yǔ)料數(shù)據(jù),可逐行讀取語(yǔ)料,內(nèi)存占用不大,運(yùn)行穩(wěn)定。因此我們將語(yǔ)料數(shù)據(jù)分成8份,手動(dòng)開(kāi)啟8個(gè)進(jìn)程分別分詞,這樣每個(gè)進(jìn)程內(nèi)存占用都很穩(wěn)定,比jieba自帶的并行分詞性能好,20g的數(shù)據(jù),開(kāi)啟HMM模式,分詞大概花了10個(gè)小時(shí)
word2vec訓(xùn)練
- 使用gensim工具包的word2vec訓(xùn)練,使用簡(jiǎn)單速度快,效果比Google 的word2vec效果好,我自己用tensorflow來(lái)跑word2vec模型,16g的內(nèi)存根本跑不動(dòng)
gensim word2vec 訓(xùn)練代碼如下,非常簡(jiǎn)答
- 訓(xùn)練時(shí)輸入運(yùn)行命令即可訓(xùn)練,指定語(yǔ)料目錄,模型保存目錄,embedding工具保存目錄
- 由于語(yǔ)料太大,不能一次性加載到內(nèi)存訓(xùn)練,gensim提供了PathLineSentences(input_dir)這個(gè)類,會(huì)去指定目錄依次讀取語(yǔ)料數(shù)據(jù)文件,采用iterator方式加載訓(xùn)練數(shù)據(jù)到內(nèi)存,
- 從訓(xùn)練日志可以看到,其過(guò)程是先依次讀取每個(gè)文件,生成總的vocab詞典,用來(lái)統(tǒng)計(jì)count,訓(xùn)練時(shí)用來(lái)過(guò)濾min_count小于我們制定數(shù)量的詞,vocab總詞典生成后,會(huì)依次讀入語(yǔ)料進(jìn)行model訓(xùn)練,訓(xùn)練速度非常快。
模型效果
- 之前使用維基百科數(shù)據(jù)訓(xùn)練得到模型效果還不錯(cuò),這次采用更大的語(yǔ)料看下效果,目前還在訓(xùn)練,電腦烤機(jī)中,先寫到這里,有空繼續(xù)
作者:sudop
鏈接:https://www.jianshu.com/p/87798bccee48
來(lái)源:簡(jiǎn)書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
轉(zhuǎn)載于:https://www.cnblogs.com/DjangoBlog/p/9113090.html
總結(jié)
以上是生活随笔為你收集整理的使用word2vec训练中文词向量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++学习笔记-继承
- 下一篇: 计算Python运行时间