Doc2Vec實踐

  • 目錄:
    • 前言:
    • 第一步:首先我們需要拿到對應的數據,相關的代碼如下:
    • 第二步:拿到對應的數據后,就開始訓練數據生成對應的model,對應的代碼如下:
    • 第三步:得到生成的model后,我們就可以輸入相應的問題得到相似的問題。代碼如下:
    • 第四步:將拿到的相似問題表示出來就OK了。
    • 總結:

目錄:

前言:

最近由于要開發一款項目,就想用doc2vec來實現其中的推薦功能,根據用戶輸入的問題利用doc2vec返回相似的問題。
以下是整個Demo的實現過程,具體的詳細代碼請參考我的Git:https://github.com/645187919/doc2vecDemo

對于doc2vec來說其實內部原理也是先拿到盡可能多的數據生成一個model然后根據輸入再在model中進行匹配,得到對應的輸入。

第一步:首先我們需要拿到對應的數據,相關的代碼如下:

def get_datasest():fin = open("questions.txt",encoding='utf8').read().strip(' ')   #strip()取出首位空格# print(fin)# print(type(fin))# 添加自定義的詞庫用于分割或重組模塊不能處理的詞組。jieba.load_userdict("userdict.txt")# 添加自定義的停用詞庫,去除句子中的停用詞。stopwords = set(open('stopwords.txt',encoding='utf8').read().strip('\n').split('\n'))   #讀入停用詞text = ' '.join([x for x in jieba.lcut(fin) if x not in stopwords])  #去掉停用詞中的詞# print(text)print (type(text),len(text))x_train = []word_list = text.split('\n')print(word_list[0])for i,sub_list in enumerate(word_list):document = TaggededDocument(sub_list, tags=[i])# document是一個Tupple,形式為:TaggedDocument( 楊千嬅 現在 教育 變成 一種 生意 , [42732])# print(document)x_train.append(document)return x_train

第二步:拿到對應的數據后,就開始訓練數據生成對應的model,對應的代碼如下:

def train(x_train, size=200, epoch_num=1):# D2V參數解釋:# min_count:忽略所有單詞中單詞頻率小于這個值的單詞。# window:窗口的尺寸。(句子中當前和預測單詞之間的最大距離)# size:特征向量的維度# sample:高頻詞匯的隨機降采樣的配置閾值,默認為1e-3,范圍是(0,1e-5)。# negative: 如果>0,則會采用negativesampling,用于設置多少個noise words(一般是5-20)。默認值是5。# workers:用于控制訓練的并行數。model_dm = Doc2Vec(x_train,min_count=1, window = 5, size = size, sample=1e-3, negative=5, workers=4,hs=1,iter=6)# total_examples:統計句子數# epochs:在語料庫上的迭代次數(epochs)。model_dm.train(x_train, total_examples=model_dm.corpus_count, epochs=70)model_dm.save('model_test')return model_dm

第三步:得到生成的model后,我們就可以輸入相應的問題得到相似的問題。代碼如下:

def test():model_dm = Doc2Vec.load("model_test")test_ = '申請貸款需要什么條件?'#讀入停用詞stopwords = set(open('stopwords.txt',encoding='utf8').read().strip('\n').split('\n'))#去掉停用詞中的詞test_text = ' '.join([x for x in jieba.lcut(test_) if x not in stopwords])print(test_text)#獲得對應的輸入句子的向量inferred_vector_dm = model_dm.infer_vector(doc_words=test_text)# print(inferred_vector_dm)#返回相似的句子sims = model_dm.docvecs.most_similar([inferred_vector_dm], topn=10)return sims

第四步:將拿到的相似問題表示出來就OK了。

if __name__ == '__main__':x_train = get_datasest()# print(x_train)# model_dm = train(x_train)sims = test()# sims:[(89, 0.730167031288147), (6919, 0.6993225812911987), (6856, 0.6860911250114441), (40892, 0.6508388519287109), (40977, 0.6465731859207153), (30707, 0.6388640403747559), (40160, 0.6366203427314758), (11672, 0.6353889107704163), (16752, 0.6346361637115479), (40937, 0.6337493062019348)]# sim是一個Tuple,內部包含兩個元素,一個是對應的句子的索引號(之前自定義的tag)一個是對應的相似度# print(type(sims))# print('sims:'+str(sims))for count, sim in sims:sentence = str(x_train[count])# sentence = x_train[count]# print('sentence:'+sentence)# print('sim:'+str(sim))print(sentence, sim, len(sentence))

當然中間你也可以拿到對應的句子的向量如下:

def getVecs(model, corpus, size):vecs = [np.array(model.docvecs[z.tags[0]].reshape(1, size)) for z in corpus]return np.concatenate(vecs)

總結:

雖然在程序中自定義了停詞庫和詞庫但是整體的效果依舊不盡人意,甚至在剛開始未調參階段碰到對于同一個輸入運行多次得到不同結果的尷尬情況……雖然這個問題在后來通過調參解決了,但是發現發現這里面仍有許多問題:如輸入問題A,model中也包含問題A,但是返回的相似問題中,A的相關度有些卻不是最高的等等。后來查了一些資料發現其他的一些網友做這個實驗的時候也是效果不理想(至于出現這些問題的原因目前不是特別清楚,按照Doc2Vec的理論來說效果應該不會很差的,可實踐后卻啪啪啪打臉。。。)。所以暫時得到的結論就是:doc2vec效果時好時壞,偶然性大,不穩定。目前有找到另一種方法來滿足我的需求,同樣采用的是句子向量,同樣是用余弦定理來求相似句子,理論比doc2vec簡單,效果也比doc2vec好。等整理好了,會在下一篇文章中做介紹。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456558.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux常用命令全網最全

一、linux文件系統結構 sudo apt-get install treetree --help #查看幫助tree -L 1 #顯示文件目錄 rootubuntu16 /# tree -L 1 . #系統根目錄,有且只有一個根目錄 ├── bin #存放常見的命令 ├── boot #系統啟動文件和核心文件都在這個目錄…

《開源思索集》一Source Code + X

本節書摘來異步社區《開源思索集》一書中的第1章,作者: 莊表偉 責編: 楊海玲, 更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 Source Code X 開源思索集最近,有一位來自學術界朋友,找到了我們這個開源的圈子…

機器學習中目標函數、損失函數以及正則項的通俗解釋

目錄:前言:1、什么是目標函數?2、損失函數3、正則化總結: 目錄: 前言: 今天看到一篇很精簡的文章來說明目標函數、損失函數以及正則項是什么。以下是文章正文。 轉自:https://xiaozhuanlan.…

Linux中的 硬鏈接ln和軟連接ln -s

文件都有文件名與數據,這在 Linux 上被分成兩個部分:用戶數據 (user data) 與元數據 (metadata)。用戶數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方;而元數據則是文件的附加屬性,如文件…

干貨分享!DevExpressv16.2最新版演示示例等你來收!(上)

2019獨角獸企業重金招聘Python工程師標準>>> 為解決大家找資源難的問題,EVGET聯合DevExpress控件中文網盤點熱門的DevExpress資訊、Demo示例、版本升級及下載,以及各種教程推薦等。更多下載及資訊也可以在DevExpress控件中文網中找到&#xf…

一文看懂哈夫曼樹與哈夫曼編碼

轉自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的數據結構的書中,樹的那章后面,著者一般都會介紹一下哈夫曼(HUFFMAN)樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的一個應用。哈夫曼編碼應用廣泛,如JPEG中…

解決:未能將管道連接到虛擬機: 所有的管道范例都在使用中。

虛擬機無端出現: VMware Workstation 無法連接到虛擬機。請確保您有權限運行該程序、訪問改程序使用的所有目錄以及訪問所有臨時文件目錄。未能將管道連接到虛擬機: 所有的管道范例都在使用中。 原因:Ubuntu開機慢到開不開,我就在任務管理器強制結束了…

tcpdf開發文檔(中文翻譯版)

2017年5月3日15:06:15 這個是英文翻譯版,我看過作者的文檔其實不太友善或者不方便閱讀,不如wiki方便 后面補充一些,結構性文檔翻譯 這是一部官方網站文檔,剩余大部分都是開發的時候和網絡總結來的 項目官網:https://t…

CCF推薦各種國際學術會議和期刊目錄

這是中國計算機學會推薦國際學術會議和期刊目錄2015年版本的內容, 主要羅列了國際上計算機相關的各個方向的頂級學術會議和期刊目錄(包含A、B、C三個等級)。 包含的方向有: 計算機體系結構/并行與分布計算/存儲系統計算機網絡網絡…

Linux基本操作【作業】

1.如何使用命令立即重啟linux操作系統? sudo reboot 2.如何查看/etc下的所有文件,并以列表格式顯示,并且顯示隱藏文件 cd /etc | ls -la 3.一次性創建 text/1/2/3/4 cd tmp mkdir -p text/1/2/3/4 (1&#xff…

開發日志_Jan.8.2017

這兩天繼續著手開發碰撞部分。 主要工作是寫碰撞類和運動線程類。碰撞主要在于算法,運動線程只要管理好就行了。 之前碰撞測試中(即還未添加完整碰撞算法時)遇到各種bug,疑似機器人和小球的定位點不明所造成的。昨天研究了下QT下的…

Nginx【學習筆記】

Nginx 1. nginx可以做什么? 可針對靜態資源高速高并發訪問及緩存。 可使用反向代理加速,并且可進行數據緩存。 具有簡單負載均衡、節點健康檢查和容錯功能。 支持遠程FastCGI服務的緩存加速。 支持FastCGI、Uwsgi、SCGI、Memcached Servers的加速和…

第四次作業類測試代碼+036+吳心怡

一、類圖 二、代碼 package application; public class Commission { /* * hp:耳機 80元 mpc:手機殼 10元 cpsp:手機貼膜 8元 */ public float calculate(String line) { int hp 0, mpc 0, cpsp 0; String[] input null; float money 0;…

LSI/LSA算法原理與實踐Demo

目錄:1、使用場景2、優缺點3、算法原理3.1、傳統向量空間模型的缺陷3.2、Latent Semantic Analysis (Latent Semantic Indexing)3.3、算法實例 4、文檔相似度的計算5、對應的實踐Demo 目錄: 1、使用場景 文本挖掘中,主題模型。聚類算法關注…

解決: ubuntu18.04沒有網絡直連

初次安裝ubuntu 18.04, 發現沒有網絡. 直接上我遇到的這個問題的解決方法 sudo service NetworkManager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service NetworkManager start 未能解決問題的方法有 修改/etc/netplan/*.yaml 修改/etc/NetworkMana…

Linux學習134 Unit 8

Unit8 ldap網絡帳號1.ldap是什么ldap目錄服務認證,和windows活動目錄類似,就是記錄數據的一種方式2.ldap客戶端所須軟件yum sssd krb5-workstation -y3.如何開啟ldap用戶認證authconfig-tui┌────────────────┤ Authentication Configu…

FastText原理總結

目錄:1、應用場景2、優缺點3、FastText的原理4、FastText詞向量與word2vec對比 目錄: 1、應用場景 fastText是一種Facebook AI Research在16年開源的一個文本分類器。 其特點就是fast。相對于其它文本分類模型,如SVM,Logistic …

解決 :sudo:/etc/sudoers 可被任何人寫

問題: sudo:sudo /etc/sudoers is world writable sudo:no valid sudoers sources found ,quitting sudo:unable to initialize policy plugin 解決方案: 方法一: 1.開機按shift或esc進入ubantu高級模式 再進行recovery模式 2.選擇root命令行模式 3.…

sqlserver數據庫類型對應Java中的數據類型

SQL Server 類型JDBC 類型 (java.sql.Types)Java 語言類型 bigint BIGINT long timestamp binary BINARY byte[] bit BIT boolean char CHAR String decimal money smallmoney DECIMAL java.math.BigDecimal float DOUBLE double int INTEGER int image v…

Doc2Bow簡介與實踐Demo

Doc2Bow是Gensim中封裝的一個方法,主要用于實現Bow模型,下面主要介紹下Bow模型。 1、BoW模型原理 Bag-of-words model (BoW model) 最早出現在自然語言處理(Natural Language Processing)和信息檢索(Information Ret…