日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用word2vec训练中文词向量

發布時間:2025/3/15 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用word2vec训练中文词向量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://www.jianshu.com/p/87798bccee48

一、文本處理流程

通常我們文本處理流程如下:
  • 1 對文本數據進行預處理:數據預處理,包括簡繁體轉換,去除xml符號,將單詞條內容處理成單行數據,word2vec訓練原理是基于詞共現來訓練詞之間的語義聯系的。不同詞條內容需分開訓練
  • 2 中文分詞:中文NLP很重要的一步就是分詞了,分詞的好壞很大程度影響到后續的模型訓練效果
  • 3 特征處理:也叫詞向量編碼,將文本數據轉換成計算機能識別的數據,便于計算,通常是轉換成數值型數據,常用的編碼方式有one hot編碼(BOW詞袋模型離散表示方式,另外文章我們講解TF-IDF模型時候會介紹)和基于word2vec等深度學習模型訓練得到的低維稠密向量,通常稱為word embedding的Distributed representation
  • 4 機器學習:詞向量進行編碼之后,便可以將文本數據轉換成數值數據,輸入到我們的機器學習模型進行計算訓練了
    文本處理流程圖如下:
  • 文本處理流程

二、訓練過程

  • 模型:gensim工具包word2vec模型,安裝使用簡單,訓練速度快
  • 語料:百度百科500萬詞條+維基百科30萬詞條+1.1萬條領域數據
  • 分詞:jieba分詞,自定義詞典加入行業詞,去除停用詞
  • 硬件:8核16g虛擬機
數據預處理
  • 維基百科數據量不夠大,百度百科數據量較全面,內容上面百度百科大陸相關的信息比較全面,港澳臺和國外相關信息維基百科的內容比較詳細,因此訓練時將兩個語料一起投入訓練,形成互補,另外還加入了1.1萬公司行業數據
分詞
  • 1 準備一個停用詞詞典,訓練時要去除停用詞的干擾
  • 2 分詞工具有中科院分詞,哈工大的LTP分詞,jieba分詞,分詞效果中科院的分詞效果不錯,我們直接使用jieba進行分詞,使用簡單方便,分詞速度快
  • 3 自定義詞典:由于百科數據有很多專屬名詞,很多比較長,如果直接分詞,很大情況下會被切開,這不是我們想要的結果,比如:中國人民解放軍,可能會被分成:中國 人民 解放軍,jieba雖然有新詞發現功能,為保證分詞準確度,jieba的作者建議我們還是使用自定義詞典。
  • 4 自定義詞典抽取:我從百度百科抽取了200萬的詞條,由于自定義詞典包含英文單詞時會導致jieba對英文單詞進行分詞,所以需要用正則表達式去除詞條中的英文數據,并且去除一些單字詞,還有一些詞條里面較短詞,如"在北京",這類詞會導致分詞出現問題,也需要使用正則去除,也有簡單粗暴的方法,直接保留3個漢字及以上的中文詞條,去除之后得到170萬大小的自定義詞典
  • 5 分詞過程
# 多線程分詞 # jieba.enable_parallel() #加載自定義詞典 jieba.load_userdict("F:/baike_spider/dict/baike_word_chinese") #加載停用詞 def getStopwords(): stopwords = [] with open("stop_words.txt", "r", encoding='utf8') as f: lines = f.readlines() for line in lines: stopwords.append(line.strip()) return stopwords #分詞 def segment(): file_nums = 0 count = 0 url = base_url + 'processed_data/demo/' fileNames = os.listdir(url) for file in fileNames: logging.info('starting ' + str(file_nums) + 'file word Segmentation') segment_file = open(url + file + '_segment', 'a', encoding='utf8') with open(url + file, encoding='utf8') as f: text = f.readlines() for sentence in text: sentence = list(jieba.cut(sentence)) sentence_segment = [] for word in sentence: if word not in stopwords: sentence_segment.append(word) segment_file.write(" ".join(sentence_segment)) del text f.close() segment_file.close() logging.info('finished ' + str(file_nums) + 'file word Segmentation') file_nums += 1
  • 由于python多線程只能單核多線程,如果是多核的機器并不能有效使用cpu,jieba是使用python寫的,所以jieba只支持并行分詞,并行分詞指的是多進程分詞,并且不支持windows
  • 我們在linux試過jieba自帶的并行分詞,開啟并行分詞之后,jieba后臺會自動開啟多個進程,并且并行分詞需要一次性將訓練語料讀取到內存并傳入jieba.cut(file.read())中才會有效果,如果類似我代碼中逐行傳入,開啟多進程是不起作用的,jieba多進程原理是,jieba后臺會自動將語料切分分配給指定進程處理,分好詞后再合并
  • 我使用的是8核16g內存Linux虛擬機,發現開啟jieba并行分詞,1g的語料數據,很快就爆內存了
  • 單進程的jieba分詞,不需要一次性加載所有語料數據,可逐行讀取語料,內存占用不大,運行穩定。因此我們將語料數據分成8份,手動開啟8個進程分別分詞,這樣每個進程內存占用都很穩定,比jieba自帶的并行分詞性能好,20g的數據,開啟HMM模式,分詞大概花了10個小時
word2vec訓練
  • 使用gensim工具包的word2vec訓練,使用簡單速度快,效果比Google 的word2vec效果好,我自己用tensorflow來跑word2vec模型,16g的內存根本跑不動
    gensim word2vec 訓練代碼如下,非常簡答
import logging import multiprocessing import os.path import sys from gensim.models import Word2Vec from gensim.models.word2vec import PathLineSentences if __name__ == '__main__': program = os.path.basename(sys.argv[0]) logger = logging.getLogger(program) logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s') logging.root.setLevel(level=logging.INFO) logger.info("running %s" % ' '.join(sys.argv)) # check and process input arguments # if len(sys.argv) < 4: # print(globals()['__doc__'] % locals()) # sys.exit(1) # input_dir, outp1, outp2 = sys.argv[1:4] input_dir = '../baike/segment' outp1 = 'model/baike.model' outp2 = 'model/word2vec_format' fileNames = os.listdir(input_dir) # 訓練模型 輸入語料目錄 embedding size 256,共現窗口大小10,去除出現次數5以下的詞,多線程運行,迭代10次 model = Word2Vec(PathLineSentences(input_dir), size=256, window=10, min_count=5, workers=multiprocessing.cpu_count(), iter=10) model.save(outp1) model.wv.save_word2vec_format(outp2, binary=False) # 運行命令:輸入訓練文件目錄 python word2vec_model.py data baike.model baike.vector
  • 訓練時輸入運行命令即可訓練,指定語料目錄,模型保存目錄,embedding工具保存目錄
  • 由于語料太大,不能一次性加載到內存訓練,gensim提供了PathLineSentences(input_dir)這個類,會去指定目錄依次讀取語料數據文件,采用iterator方式加載訓練數據到內存,
  • 從訓練日志可以看到,其過程是先依次讀取每個文件,生成總的vocab詞典,用來統計count,訓練時用來過濾min_count小于我們制定數量的詞,vocab總詞典生成后,會依次讀入語料進行model訓練,訓練速度非常快。
模型效果
  • 之前使用維基百科數據訓練得到模型效果還不錯,這次采用更大的語料看下效果,目前還在訓練,電腦烤機中,先寫到這里,有空繼續


作者:sudop
鏈接:https://www.jianshu.com/p/87798bccee48
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

轉載于:https://www.cnblogs.com/DjangoBlog/p/9113090.html

總結

以上是生活随笔為你收集整理的使用word2vec训练中文词向量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。