基於R語言的唐僧「師徒關係」分析(詞向量分析)
這篇文章,我們將基於WORD2VEC方法來介紹如何運用詞向量方法分析文本的語義關係。
Word2vec白話版思想
簡單的說,就是把詞映射成一個向量。具體解釋見:https://zh.wikipedia.org/wiki/Word2vec
例如:
巴黎——>(1,0,1,0)
法國——>(0,0,1,0)
德國——>(0,0,2,0)
柏林——>(1,0,2,0)
這樣做的好處是什麼呢?
(1)降低維度,原來如果一篇文章有200個不同的詞,那麼每個詞就是200維的向量,但是如果轉成詞向量,那麼維度可以由操作者設置,比如上面就是4維的。
(2)可以進行詞義運算。比如上面的例子就是:巴黎-法國+德國=柏林,可以用於語義發現。
(3)還有很多。。。。。。
下面我們操作一個案例吧(R語言+西遊記)
圖片來源:http://pic.qiantucdn.com/58pic/16/30/51/14v58PICrQJ_1024.jpg!/fw/780/watermark/url/L3dhdGVybWFyay12MS40LnBuZw==/align/center
#載入包nlibrary(text2vec)nlibrary(stringr)nlibrary(jiebaR)n#設置目錄nsetwd("D:Rtest")n#讀入西遊記,這裡是csv版本的,每行一句nMK = read.csv("mk.csv",stringsAsFactors = F,header = F,quote = "")nnclass(MK)n#把data.frame轉成向量nMK=rbind(MK$V1)n#我們把不同的句子合成一個文檔nword_MK=c()nfor (i in 1:length(MK))n{n word_MK=paste(word_MK,MK[i])n}n#開始分詞nwk = worker()nseg_MK=wk[word_MK]nn#注意:這裡要轉成list格式ntokens=list(seg_MK)nclass(tokens)n# 構造詞庫(對文中分詞結果進行匯總)nit = itoken(tokens, progressbar = FALSE)nvocab = create_vocabulary(it)n#刪除一個字的詞nvocab=vocab[which(nchar(vocab$term)>1),]n#刪除出現小於5次的詞nvocab = prune_vocabulary(vocab, term_count_min = 5L)n#查看最高頻的詞ntail(vocab,20)nvectorizer = vocab_vectorizer(vocab)n# 考慮詞的前後5個詞ntcm = create_tcm(it, vectorizer,skip_grams_window = 5L)n#設置詞向量是4維的n#glove演算法:https://nlp.stanford.edu/projects/glove/nglove = GlobalVectors$new(word_vectors_size = 40, vocabulary = vocab, x_max = 10)nwv_main = glove$fit_transform(tcm, n_iter = 10, convergence_tol = 0.01)ndim(wv_main)nwv_context = glove$componentsndim(wv_context)nwv_main[1,1]nt(wv_context)[1,1]nword_vectors = wv_main + t(wv_context)nn#構造「唐僧+徒弟」向量nrelation = word_vectors["唐僧", , drop = FALSE] +nword_vectors["徒弟", , drop = FALSE]nn#計算相關性,查看相關性最高的詞 ncos_sim = sim2(x = word_vectors, y = relation, method = "cosine", norm = "l2")nhead(sort(cos_sim[,1], decreasing = TRUE), 20)n
下面是輸出結果
唐僧 徒弟 師父 行者 悟空 n0.9204751 0.8993045 0.7191472 0.6670486 0.6205347 n 八戒 孫悟空 保護 師徒 三個 n0.6063472 0.6006286 0.5774034 0.5726808 0.5588137 n 救出 沙僧 看見 出來 你們 n0.5390314 0.5385800 0.5221406 0.5094787 0.5043664 n 這裡 忙說 自己 妖怪 只見 n0.5032555 0.5019108 0.5014732 0.4974681 0.4961763 n
(1)很明顯,唐僧的徒弟有三個
(2)師徒關係主要表現在「保護」和「就出」
(3)與師徒4人關係最為密切的是「妖怪」
分析完畢,純屬娛樂,但是還是可以基本還原西遊記的主要情節的。
結束語
這是一個很粗糙的工作,主要幫助大家入門使用,主要欠缺包括詞典的使用,同義詞的合併,停用詞的處理等,我們都沒有使用,留給大家改進了。
封面圖片來源:http://pic.qiantucdn.com/58pic/18/44/35/5620802feeb51_1024.jpg!/fw/780/watermark/url/L3dhdGVybWFyay12MS40LnBuZw==/align/center
推薦閱讀:
※我們分析了300萬字文本,終於知道了什麼是直男癌
※專欄文章分類及各類內容簡介
※如何用Python做詞雲?
※7款免費的詞雲可視化工具,圖表控沒有理由拒絕啊!