Word2Vec训练同义词模型
生活随笔
收集整理的這篇文章主要介紹了
Word2Vec训练同义词模型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、需求描述
???? 業務需求的目標是識別出目標詞匯的同義詞和相關詞匯,如下為部分目標詞匯(主要用于醫療問診):
尿
痘痘
發冷
呼吸困難
惡心
數據源是若干im數據,那么這里我們選擇google 的word2vec模型來訓練同義詞和相關詞。
二、數據處理
????數據處理考慮以下幾個方面:
1. 從hive中導出不同數據量的數據
2. 過濾無用的訓練樣本(例如字數少于5)
3. 準備自定義的詞匯表
4. 準備停用詞表
三、工具選擇
????選擇python 的gensim庫,由于先做預研,數據量不是很大,選擇單機就好,暫時不考慮spark訓練。后續生產環境計劃上spark。
詳細的gensim中word2vec文檔
上述文檔有關工具的用法已經很詳細了,就不多說。
分詞采用jieba。
四、模型訓練步驟簡述
1.先做分詞、去停用詞處理
seg_word_line = jieba.cut(line, cut_all = True)2.將分詞的結果作為模型的輸入
model = gensim.models.Word2Vec(LineSentence(source_separated_words_file), size=200, window=5, min_count=5, alpha=0.02, workers=4)3.保存模型,方便以后調用,獲得目標詞的同義詞
similary_words = model.most_similar(w, topn=10)五、重要調參目標
???? 比較重要的參數:
1. 訓練數據的大小,當初只用了10萬數據,訓練出來的模型很不好,后邊不斷地將訓練語料增加到800萬,效果得到了明顯的提升
2. 向量的維度,這是詞匯向量的維數,這個會影響到計算,理論上來說維數大一點會好。
3. 學習速率
4. 窗口大小
在調參上,并沒有花太多精力,因為目測結果還好,到時上線使用前再仔細調整。
六、模型的實際效果
| 尿 | 尿液,撒尿,尿急,尿尿有,尿到,內褲,尿意,小解,前列腺炎,小便 |
| 痘痘 | 逗逗,豆豆,痘子,小痘,青春痘,紅痘,長痘痘,粉刺,諷刺,白頭 |
| 發冷 | 發燙,沒力,忽冷忽熱,時冷時熱,小柴胡,頭昏,嗜睡,38.9,頭暈,發寒 |
| 呼吸困難 | 氣來,氣緊,窒息,大氣,透不過氣,出不上,瀕死,粗氣,壓氣,心律不齊 |
| 惡心 | 悶,力氣,嘔心,脹氣,漲,不好受,不進,暈車,悶悶,精神 |
七、可以跑的CODE
import codecs import jieba import gensim from gensim.models.word2vec import LineSentencedef read_source_file(source_file_name):try:file_reader = codecs.open(source_file_name, 'r', 'utf-8',errors="ignore")lines = file_reader.readlines()print("Read complete!")file_reader.close()return linesexcept:print("There are some errors while reading.")def write_file(target_file_name, content):file_write = codecs.open(target_file_name, 'w+', 'utf-8')file_write.writelines(content)print("Write sussfully!")file_write.close()def separate_word(filename,user_dic_file, separated_file):print("separate_word")lines = read_source_file(filename)#jieba.load_userdict(user_dic_file)stopkey=[line.strip() for line in codecs.open('stopword_zh.txt','r','utf-8').readlines()]output = codecs.open(separated_file, 'w', 'utf-8')num = 0for line in lines:num = num + 1if num% 10000 == 0:print("Processing line number: " + str(num))seg_word_line = jieba.cut(line, cut_all = True)wordls = list(set(seg_word_line)-set(stopkey))if len(wordls)>0:word_line = ' '.join(wordls) + '\n'output.write(word_line)output.close()return separated_filedef build_model(source_separated_words_file,model_path):print("start building...",source_separated_words_file)model = gensim.models.Word2Vec(LineSentence(source_separated_words_file), size=200, window=5, min_count=5, alpha=0.02, workers=4) model.save(model_path)print("build successful!", model_path)return modeldef get_similar_words_str(w, model, topn = 10):result_words = get_similar_words_list(w, model) return str(result_words)def get_similar_words_list(w, model, topn = 10):result_words = []try:similary_words = model.most_similar(w, topn=10)print(similary_words)for (word, similarity) in similary_words:result_words.append(word)print(result_words)except:print("There are some errors!" + w)return result_wordsdef load_models(model_path):return gensim.models.Word2Vec.load(model_path)if "__name__ == __main__()":filename = "d:\\data\\dk_mainsuit_800w.txt" #source fileuser_dic_file = "new_dict.txt" # user dic fileseparated_file = "d:\\data\\dk_spe_file_20170216.txt" # separeted words filemodel_path = "information_model0830" # model file#source_separated_words_file = separate_word(filename, user_dic_file, separated_file)source_separated_words_file = separated_file # if separated word file exist, don't separate_word againbuild_model(source_separated_words_file, model_path)# if model file is exist, don't buile modl model = load_models(model_path)words = get_similar_words_str('頭痛', model)print(words)總結
以上是生活随笔為你收集整理的Word2Vec训练同义词模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu1589(枚举+并查集)
- 下一篇: c#.net课程设计:ZCMU通讯录(待