Word2vec词向量工具带你发现不一样的《天龙八部》
詞向量技術是將詞語轉化成為稠密向量。在自然語言處理應用中,詞向量作為機器學習、深度學習模型的特征進行輸入。因此,最終模型的效果很大程度上取決于詞向量的效果。
Word2vec 是 Google 在 2013 年開源的一款將詞表征為實數值向量的高效工具,利用深度學習思想,通過訓練,把對文本內容的處理簡化為 K 維向量空間中的向量運算,而向量空間上的相似度可以用來表示文本語義上的相似度。
word2vec輸出的詞向量可以被用來做很多 NLP 相關的工作,比如聚類、找同義詞、詞性分析等等。如果換個思路,把詞當做特征,那么Word2vec就可以把特征映射到 K 維向量空間,可以為文本數據尋求更加深層次的特征表示。 Word2vec 使用的是 Distributed representation 的詞向量表示方式。采用一個三層的神經網絡“輸入層-隱層-輸出層”。有個核心的技術是根據詞頻用Huffman編碼,使得所有詞頻相似的詞隱藏層激活的內容基本一致,出現頻率越高的詞語,他們激活的隱藏層數目越少,這樣有效的降低了計算的復雜度。
簡單的理論大概就是上面這些,我比較喜歡《天龍八部》這部小說,“有情皆孽,無人不冤”是這部小說的主旨,人物豐富,情節緊湊,每個人都演繹了“求不得”這出自佛經的三個字。下面我們通過代碼分析一下實際是不是這樣?
-
第一步:我們找到《天龍八部》這部小說的txt文件,去掉停用詞,然后利用結巴分詞整理成能夠被Word2vec使用的格式。
整理完的文本,整部小說的第一節標題:第01章 青衫磊落險峰行? 如下:
[' ', '青衫', '磊落', '險峰', '行']-
第二步:我們先結合詞云工具畫出小說中出現次數最多的四字成語
貌似不是我們一開始說的那樣求不得,看起來整部小說還是非常豪放,充滿了江湖的俠義之氣,不是我們最初預料的那種悲苦的基調。
-
第三步:利用Word2vec分析這部小說的人物
1.和段譽最相關的詞
[('木婉清', 0.9940025806427002), ('低聲', 0.9905248284339905), ('王語嫣', 0.9902623891830444), ('虛竹', 0.9894589781761169), ('蕭峰', 0.9883322715759277),('阿紫', 0.9870333075523376),('阿朱', 0.9851636290550232), ('快', 0.9846230745315552),('點頭', 0.983921468257904), ('笑', 0.9805305600166321)]除了這幾個人物之外,這位公子哥給人的感覺也是溫柔多情,“低聲”,“點頭”,“笑”這三個詞語算是有點貼切了,而“快”字說的就是他的凌波微步了。
2.判斷段譽和王語嫣的相似度
#判斷相似度 model.similarity('段譽', '王語嫣')0.9902624294045532看結果說明他們的關系還是非常強的
3.找出與蕭峰最接近,與王語嫣最不相近的詞
print(model.most_similar(positive=['蕭峰'], negative=['王語嫣']))[('中', 0.6243330836296082), ('內力', 0.5441182851791382),('出', 0.5018132328987122), ('間', 0.4797748029232025), ('嗤', 0.46751290559768677), ('派', 0.4565170407295227), ('突然', 0.4523952603340149), ('武功', 0.448074609041214),('簽條', 0.4459651708602905), ('少林', 0.4459308385848999)]4.找出指定長度的相關詞
#找出指定長度的相關詞 req_count = 20 for key in model.similar_by_word('李秋水'):if len(key[0]) <= 4:req_count -= 1print(key[0],key[1])if req_count == 0:break連聲 0.9998010396957397 一點 0.9997679591178894 出塵子 0.999755322933197 跪倒 0.9997552633285522 怒氣 0.9997398853302002 摘星子 0.9997320771217346 大怒 0.9997137188911438 頭 0.9997084140777588 長 0.9996963739395142 冷 0.9996923804283142結果還是比較準的
?
詳細代碼如下:
import jieba#加載文本,去除空格 def read_words(path):lines = []with open (path,'r') as f:for line in f:line = line.strip()if len(line) != 0:lines.append(line)return lines#加載停用詞列表 def stop_words(path):with open (path,'r',encoding='utf-8') as f:return [line.strip() for line in f]jieba.suggest_freq('段譽',True) jieba.suggest_freq('蕭峰',True) jieba.suggest_freq('阿紫',True) jieba.suggest_freq('喬峰',True)#jieba.load_userdict('name.txt')#分詞 def cut_words(ready_words):sentences = [jieba.lcut(line) for line in ready_words]sens = []for sentence in sentences:sen = []for word in sentence:if word not in stop_words:sen.append(word)sens.append(sen)return sensready_words = read_words('天龍八部.txt') stop_words = stop_words('stop_words.utf8') token = cut_words(ready_words)#檢驗結果 token[0]#將分詞結果變成一個列表 c=[] for sentence in token:for word in sentence:c.append(word)#直接調用統計詞頻的函數 # from collections import Counter # top5= Counter(c).most_common(29) # print(top5)#統計四字詞語 dic_tf = {} for w in c:if len(w) == 4 and w not in ['耶律洪基','慕容公子','神仙姊姊','慕容先生','不平道人','天山童姥','智光大師','玄苦大師','太皇太后','小無相功']:dic_tf[w] = dic_tf.get(w,0) + 1 print(sorted(dic_tf.items(),key=lambda x:x[1],reverse=True)[:20])dic_tf#生成詞云圖 from wordcloud import WordCloud wc = WordCloud(font_path = 'simhei.ttf',background_color="black", # 背景顏色max_words=20 # 詞云顯示的最大詞數)wc.fit_words(dic_tf)import matplotlib.pyplot as plt plt.figure() plt.imshow(wc) plt.axis("off") plt.show()#模型訓練 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = "all"from gensim.models import Word2Vec model = Word2Vec(token)model.save('model') #保存模型 model = Word2Vec.load('model') #加載模型#判斷與段譽相近的詞 print(model.most_similar('段譽')) #判斷相似度 model.similarity('段譽', '王語嫣') #判斷與蕭峰相近,與王語嫣不相近的詞 print(model.most_similar(positive=['蕭峰'], negative=['王語嫣'])) #找出指定長度的相關詞 req_count = 20 for key in model.similar_by_word('李秋水'):if len(key[0]) <= 4:req_count -= 1print(key[0],key[1])if req_count == 0:break?
總結
以上是生活随笔為你收集整理的Word2vec词向量工具带你发现不一样的《天龙八部》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年度软件工程师薪酬报告
- 下一篇: 软件工作的薪水是全国平均水平的两倍