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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

用维基百科训练word2vec中文词向量

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

主要參考:

https://blog.csdn.net/weixin_40547993/article/details/97781179

https://www.kaggle.com/jeffd23/visualizing-word-vectors-with-t-sne

其他的可能還有一些,查閱的時候沒注意,后來找不到了(⊙﹏⊙)

?

本文使用的語料庫是維基百科中文語料庫截至2019-07-20的數據,下載鏈接:https://dumps.wikimedia.org/zhwiki/20190720/

我已經保存在網盤里,有需要的可以直接提取:鏈接:https://pan.baidu.com/s/1IYZPD2B6BZCE3nlXfSjK2A 提取碼:e1wf

?

進入具體步驟之前,先梳理一下大致步驟,以便大腦中先有個大致思路:

  • step1:利用gensim的WikiCorpus處理工具對下載的xml壓縮文件進行txt格式轉換,轉換后的文件每行是一篇維基文檔
  • step2:對語料庫進行預處理,主要包括:繁體字轉簡體字,去除漢字以外其他字符,分詞
  • step3:利用gensim的LineSentence訓練詞向量

以上三個步驟后,詞向量就訓練完成啦,得到詞向量以后,為了驗證詞向量的質量,我們可以測試一些詞語的近義詞,對詞向量可視化

?

1.將.xml文件轉為.text格式文件,.text格式文件中,一行是一篇文章

from gensim.corpora import WikiCorpus# 這是gensim專門為處理維基百科數據的工具包 input_file_name = '/Users/admin/A_NLP/data/zhwiki-20190720-pages-articles-multistream.xml.bz2' output_file_name = 'wiki.cn.txt' input_file = WikiCorpus(input_file_name, lemmatize=False, dictionary={}) output_file = open(output_file_name, 'w', encoding="utf-8") count = 0 for text in input_file.get_texts():output_file.write(' '.join(text) + '\n')count = count + 1if count % 10000 == 0:print('目前已處理%d條數據' % count)
input_file.close() output_file.close()

2.打印處理成txt文件后的第一行數據查看:

ff = open('') for line in ff:print(line)break

?

可以看到,上述文件中的字符許多繁體字,且其中摻雜一些英文或其他字符,因此需要對語料再進行一些預處理

3.將語料庫 按行進行,繁轉簡、清洗、分詞:

  • 繁轉簡使用的是opencc工具;
  • 清洗非中文數據是使用正則表達式直接提取中文字符;
  • 分詞則是使用jieba分詞工具
import re import opencc import jieba cc = opencc.OpenCC('t2s') fr = open('wiki.cn.txt','r') fw = open('wiki.sen.txt','a+') for line in fr:simple_format = cc.convert(line)# 繁轉簡zh_list = re.findall(u"[\u4e00-\u9fa5]+",simple_format)# 清洗掉非中文數據sentence = []for short_sentence in zh_list:sentence += list(jieba.cut(cc.convert(short_sentence)))# 分詞fw.write(' '.join(sentence)+'\n') fr.close() fw.close()

4.打印出處理完的文件的第一行查看

ft = open('wiki.sen.txt','r') for line in ft:print(line)break?

5.訓練詞向量并保存模型:利用LineSentence對行文件進行讀取,再放入Word2Vec中進行向量訓練

以下參考其他大佬的文章給出word2vec參數說明(原文鏈接:https://blog.csdn.net/weixin_40547993/article/details/97781179):?

在gensim中,word2vec相關的API都在包gensim.models.word2vec中。和算法有關的參數都在類gensim.models.word2vec.Word2Vec中。

  • sentences: 我們要分析的語料,可以是一個列表,或者從文件中遍歷讀出。
  • size: 詞向量的維度,默認值是100。這個維度的取值一般與我們的語料的大小相關,如果是不大的語料,比如小于100M的文本語料,則使用默認值一般就可以了。如果是超大的語料,建議增大維度。
  • window:即詞向量上下文最大距離,這個參數在我們的算法原理篇中標記為,window越大,則和某一詞較遠的詞也會產生上下文關系。默認值為5。在實際使用中,可以根據實際的需求來動態調整這個window的大小。如果是小語料則這個值可以設的更小。對于一般的語料這個值推薦在[5,10]之間。
  • sg: 即我們的word2vec兩個模型的選擇了。如果是0,則是CBOW模型,是1則是Skip-Gram模型,默認是0即CBOW模型。
  • hs: 即我們的word2vec兩個解法的選擇了,如果是0, 則是Negative Sampling,是1的話并且負采樣個數negative大于0, 則是Hierarchical Softmax。默認是0即Negative Sampling。
  • negative:即使用Negative Sampling時負采樣的個數,默認是5。推薦在[3,10]之間。這個參數在我們的算法原理篇中標記為neg。
  • cbow_mean: 僅用于CBOW在做投影的時候,為0,則算法中的為上下文的詞向量之和,為1則為上下文的詞向量的平均值。
  • min_count:需要計算詞向量的最小詞頻。這個值可以去掉一些很生僻的低頻詞,默認是5。如果是小語料,可以調低這個值。
  • iter: 隨機梯度下降法中迭代的最大次數,默認是5。對于大語料,可以增大這個值。
  • alpha: 在隨機梯度下降法中迭代的初始步長。算法原理篇中標記為,默認是0.025。
  • min_alpha: 由于算法支持在迭代的過程中逐漸減小步長,min_alpha給出了最小的迭代步長值。隨機梯度下降中每輪的迭代步長可以由iter,alpha, min_alpha一起得出。
  • worker:訓練詞向量使用時使用的線程數,默認為3。
import multiprocessing from gensim.models import Word2Vec from gensim.models.word2vec import LineSentenceinput_file_name = 'wiki.sen1k.txt' model_file_name = 'wiki_min_count500.model'model = Word2Vec(LineSentence(input_file_name),# LineSentence函數可以將保存為行-文檔格式的語料轉換成WordVec需要的格式size=100, # 詞向量長度window=5,min_count=500,workers=multiprocessing.cpu_count())model.save(model_file_name)

6.測試幾個詞語,找出與其最相似的10個詞語

from gensim.models import Word2Vecwiki_model = Word2Vec.load('wiki_min_count500.model')test = ['文學', '雨水', '汽車', '怪物', '幾何','故宮'] for word in test:res = wiki_model.most_similar(word)print(word) print(res)

7.查看詞向量

wiki_model.wv['文學']

8.向量可視化,利用TSNE工具,將詞向量降維,降維的原理是使得原本距離相近的向量降維后距離盡可能近,原本距離較遠的向量降維后距離盡可能遠。

這個步驟參考了kaggle上的詞向量可視化文檔:

  • https://www.kaggle.com/jeffd23/visualizing-word-vectors-with-t-sne
from sklearn.manifold import TSNE import matplotlib.pyplot as plt %matplotlib inline def tsne_plot(model):"Creates and TSNE model and plots it"labels = []tokens = []for word in model.wv.vocab:tokens.append(model[word])labels.append(word)tsne_model = TSNE(perplexity=40, n_components=2, init='pca', n_iter=2500, random_state=23)new_values = tsne_model.fit_transform(tokens)x = []y = []for value in new_values:x.append(value[0])y.append(value[1])plt.figure(figsize=(16, 16)) for i in range(len(x)):plt.scatter(x[i],y[i])plt.annotate(labels[i],xy=(x[i], y[i]),xytext=(5, 2),textcoords='offset points',ha='right',va='bottom')plt.show() wiki_model = Word2Vec.load('wiki_min_count500.model') tsne_plot(wiki_model)

?

?第一張圖是用所有語料訓練處的模型,包含的詞語較多,因此成了一個大墨團;由于matplotlib模塊的SimHei.ttf文件沒有替換,因此中文文字沒有顯示出來

?

?

?

第二張圖使用了預處理后的前1w行數據作為語料庫訓練,在以下位置替換掉了SimHei.ttf文件,

(以下是matplotlib不能顯示中文的解決辦法)

  • 下載Github倉庫中的字體SimHei.ttf;
  • ?在命令行中執行:

    python

    import matplotlib

    print(matplotlib.__path__)

    這樣就找到了matplotlib 的路徑,然后 cd 到這個路徑。 cd 到這個路徑之后,繼續 cd,cd 到 mpl-data/fonts/ttf 這個路徑。 然后把 `DejaVuSans.ttf` 這個文件換成SimHei.ttf:

    mv SimHei.ttf DejaVuSans.ttf

這樣就可以在matplotlib中顯示中文了。

?

以下是向量可視化效果圖:

?

?為了看的更清晰一點,第三章圖使用的是預處理后的前1000行數據作訓練,效果如下:

完。

?

轉載于:https://www.cnblogs.com/byugo/p/11300233.html

總結

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

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