1. 程式人生 > >用深度學習模型Word2Vec探索《紅樓夢》人物關系

用深度學習模型Word2Vec探索《紅樓夢》人物關系

繼續 comment block for lse r+ not 百度 構建

先來看一看結果,發現:

1.賈寶玉和襲人的關系最近。

2.薛寶釵和自己的媽媽關系最近。

3.賈寶玉和林黛玉逼格比較統一,薛寶釵屬於獨樹一幟的逼格調性。

4.大觀園中可以看到邢岫煙經常出沒...

還有更多秘密等你自己上手去訓練模型並發現...

開始寫代碼!

1from tqdm import tqdm
2#tqdm用來觀察進度條,非必須
3import jieba
4import sys
5import os

聲明一下,這裏自定義了兩個詞典分別命名為“renming.txt”和“diming.txt”,分別寫入了紅樓夢中常見人名地名,這裏展示一下格式,有需要的可以添加我微信dicey0310,我會發給你。

技術分享圖片技術分享圖片

繼續寫代碼!

 1os.chdir("C://users//dicey//desktop")
2# 調用 jieba分詞module後,添加單詞本(人名等):
3jieba.load_userdict("renming.txt")
4jieba.load_userdict("diming.txt")
5
6#這裏是在百度上下載的紅樓夢完整版的txt
7filename = ‘HongLouMeng.txt‘
8text_lines = []
9with open(filename,encoding=‘utf-8‘,errors=‘ignore‘) as f:
10 for line in tqdm(f):
11
text_lines.append(line)
12print(‘總共讀入%d行文字‘% (len(text_lines)))
13
14#檢查一下讀入文字的正確性
15print(text_lines[17])

把紅樓夢的txt版(utf-8編碼)一行一行讀進來,用tqdm輔助顯示進度條:

1data_lines = []
2
3## 分詞並添加進列表:
4for line in tqdm(text_lines):
5 one_line = [‘ ‘.join(jieba.cut(line, cut_all=False))][0].split(‘ ‘)
6 data_lines.append(one_line)

開始數據預處理,去除了標點符號、數字、停用詞:

1import re
2# 標點符號 (punctuation)
3punct = set(u‘‘‘.&#:!),.:;?]}¢‘"、。〉》」』】〕〗〞︰︱︳﹐?﹒﹔﹕﹖﹗﹚﹜﹞! .&# &# ),.*:;O?|}︴︶︸︺︼︾﹀﹂﹄﹏?~¢々‖?·ˇˉ―--′’”([{£¥‘"‵〈《「『【〔〖([{£¥〝︵︷︹︻︽︿﹁﹃﹙﹛﹝({“‘-—_…0123456789‘‘‘)
4isNumber = re.compile(r‘\d+.*‘)
5with open(‘stopwords.txt‘,encoding=‘utf-8‘,errors=‘ignore‘) as f:
6 stopwords = f.read()
7filter_words = [w for w in data_words if (w not in punct)
8 and (not isNumber.search(w.lower()))and(w not in stopwords)]

引入gensim庫,並使用Word2Vec模型構造內部字典樹,和訓練神經模型:

1import gensim
2model = gensim.models.Word2Vec(iter=1)
3# an empty model, no training yet
4model.build_vocab(data_lines) #傳入語料,構建內部字典樹
5model.train(data_lines, total_examples = len(data_lines), epochs = 100)
6#開始訓練神經模型100次
7#epochs表示訓練次數

註意,上面這塊代碼也可換做下面這樣的簡寫法:

1import gensim
2model = gensim.models.Word2Vec(data_lines,iter=10)
3‘‘‘
4直接把data_lines餵給World2Vec模型,
510代表會調用句子叠代器運行11次(一般來說,會運行 iter+1 次,默認情況下 iter=5)。
6第一次運行負責收集單詞和它們的出現頻率,從而構造一個內部字典樹。第二次以及以後的運行負責訓練神經模型(train)。
7‘‘‘

開始讀入我們關心的人名、地名,並打印結果:

 1test_words = [‘林黛玉‘,‘黛玉‘,‘賈寶玉‘,‘寶玉‘,‘薛寶釵‘,‘寶釵‘,‘襲人‘,‘大觀園‘,‘瀟湘館‘,‘蘅蕪苑‘,‘妙玉‘,‘櫳翠庵‘]
2#開始讀入
3neighbors = []
4for test_word in test_words:
5 neighbors.append(model.most_similar(test_word))
6#開始打印結果
7for i in range(len(neighbors)):
8 str = ‘ ‘.join([x[0] for x in neighbors[i]])
9 print(‘%s:‘ % test_words[i])
10 print(‘\t%s\n‘ % (str))

這裏展示部分結果:(每個人名、地名之後跟的是與自己關系最密切/在100維詞向量中最相近的名詞)

技術分享圖片

最後我們看一下“黛玉”的坐標(100維),以及“黛玉”和“林黛玉”之間的相似度。

1print(model["黛玉"])
2print(model.similarity("黛玉",‘林黛玉‘))

技術分享圖片

技術分享圖片

註意:相似度不為1(相似度等於1時代表詞向量在每個維度上都完全相等)。是因為叫“林黛玉”時常為正式場合,直呼“黛玉”時一般屬於日常情況,相信各位懂得~

用深度學習模型Word2Vec探索《紅樓夢》人物關系